2009-05-19 5 views

Antwort

1

Sie müssen diese Frage wirklich ein wenig erweitern. Auch "kubischer Spline" ist ein sehr weit gefasster Begriff.

Wenn Sie sich für Splines interessieren, kann ich Carl de Boors "einen praktischen Leitfaden für Splines" sehr empfehlen. Es ist jedoch ein wenig mathematisch orientiert, aber es hat Code-Beispiele enthalten (sie können von der Homepage des Autors heruntergeladen werden). Googlen und Wikiing für "cubic spline" kann einige Beispiele aufzeigen, vielleicht sogar in bestimmten Sprachen - eine weitere Sache, die zu der Frage hinzugefügt werden kann (wenn Sie nach Code suchen).

Wenn Sie an Extrapolation und Kurvenanpassung interessiert sind, könnte das Googeln helfen. Matlab-Paket hat eine sehr schöne Kurven-Toolbox. Wikipedia hat einige Links zu nützlichen Referenzen

Wirklich, es ist zu weit eine Frage, um sogar eine Antwort zu erraten.

Könnten Sie auch erklären, was genau Sie vorhaben? Welche Art von Daten? Alles?


Edit1: Hier, versuchen Sie dies: Sie etwas Nützliches hier finden kann - link

+0

MATLAB ist eine Bibliothek, ich suche Code wie erwähnt. Ich habe eine Reihe von Datenpunkten, die eine Kurve erzeugen. Ich muss die Kurve nur ein wenig nach vorne verlängern. Es ist nicht komplizierter als das. –

+0

Nun, nimm einfach die letzte Kurve 3. Ordnung und berechne dann die gewünschten Werte. Wenn Sie es eingerichtet haben, haben Sie bereits die Koeffizienten. – Rook

+0

Dieser Code wurde vor vielen Jahren geschrieben, als ich dieses Niveau der Mathematik leicht machen konnte. Jetzt müsste ich das Ganze auseinanderreißen und die Konzepte auffrischen ... nicht trivial. Ich hatte gehofft, dass dieser Beitrag eine Verbindung zu irgendeinem Code veranlassen würde ... –

1

Generell gilt für die Spline-Interpolation verwenden Sie eine Variable t über die Linie zu interpolieren. Solange 0 < = t < = 1 interpolieren Sie. Wenn Sie jedoch t < 0 oder t> 1 verwenden, extrapolieren Sie einfach den Spline.

+0

ja das ist richtig. Ich brauche Datenpunkte für t> 1 in diesem Beispiel (aber nur leicht> t –

+1

Bewerten Sie einfach die Spline-Formel mit t> 1, für kleine t sollten Sie in Ordnung sein. –

6

Sie brauchen keinen neuen Code dafür.

Um den Spline zu extrapolieren, können Sie die Parameter des ersten und letzten Splines extrapolieren.

Abhängig von Ihrem vorhandenen Code/Bibliothek, die möglicherweise nicht möglich sind, ohne den Code zu ändern. In diesem Fall fügen Sie einfach zwei weitere Punkte an den Anfang/das Ende Ihrer Liste von Punkten an. Sie können diese zwei Punkte erhalten, indem Sie linear zwischen den ersten/letzten zwei Punkten interpolieren.

Vorsicht: Je nach der ursprünglichen Bedeutung der Punkte ist die Extrapolation möglicherweise völlig unangemessen, insbesondere wenn es um statistische Daten geht. In diesem Fall sollten Sie die Verwendung von regression analysis in Erwägung ziehen.

+0

> Sie können diese zwei Punkte erhalten, indem Sie linear zwischen den ersten/letzten zwei Punkten interpolieren. Das widerspricht dem Zweck der Übung. Ich möchte basierend auf der vom Spline erzeugten Kurve erweitern. –

+0

Wie gesagt, das wäre das weniger als optimale Fallback, wenn Ihr existierender Code/Bibliothek es Ihnen nicht erlaubt zu extrapolieren (d. H. Einen Parameter < 0 or > 1) –

0

Sie müssen bessere Anforderungen für den angeforderten Code schreiben. Splines werden normalerweise für die Interpolation einer unbekannten oder komplexen Funktion verwendet, indem ein fester Datensatz verwendet wird. Wenn Sie eine Schätzung des Werts der Funktion außerhalb der Grenzen dieses Datensatzes haben möchten, sollten Sie keine Splines verwenden.

Wenn Ihr Spline eine Funktion ist, die an der Stelle definiert ist, an der Sie Ihren Wert wirklich auswerten möchten (kubisch, aber nicht stückweise-kubisch), dann können Sie diesen Wert bereits auswerten.

Wenn Sie die Fähigkeit haben möchten, Ihren Spline außerhalb des Interpolationsbereichs auszuwerten, ihn aber als stückweise kubische Funktion mit denselben Werten innerhalb des Interpolationsbereichs zu belassen, sollten Sie den Spline-Bereich um einige Knoten erweitern und eine Logik hinzufügen Auswertungswerte an den neuen Knoten (zum Beispiel möchten Sie, dass Ihr Spline nicht nur eine stetige Funktion ist, sondern auch eine Reihe von ersten Ableitungen auch stetige Funktionen haben)

Wirklich schlage ich vor, Sie verwenden einen Algorithmus besser geeignet für Extrapolation, wie die Verwendung von Lagrange polynomial, wenn alles, was Sie wirklich brauchen, Einzelwert nicht sehr weit von Punkten des ursprünglichen Datensatzes ist.

+0

> Sie sollten keine Splines verwenden. Warum nicht? Das Polynom dritter Ordnung ist bereits berechnet. Ich brauche nur die "Krümmung" und strecke mich etwas nach vorne. Ich werde das Lagrange-Polynom studieren –

2

Der Einfachheit halber werde ich eine kubische Bezier-Kurve als 4 Punkte (A, B, C, D) darstellen, wobei A und D die Endpunkte der Kurve sind, und B und C sind die "Kontrollpunkte". (Die tatsächliche Kurve in der Regel nicht berühren Sie die Steuerpunkte).

Siehe "Don Lancaster's Guru's Lair Cubic Spline Library" für Möglichkeiten, diese Darstellung einer kubischen Bezier-Kurve in andere populäre Darstellungen zu konvertieren.

Interpolation

eine kubische Bezier-Kurve (P0, P1, P2, P3) gegeben, wir De Casteljau's algorithm verwenden, um eine Bezier-Kurve in eine linke Hälfte und eine rechte Hälfte zerhacken. Das ist super-einfach, dass selbst auf einem Mikrocontroller, der keine „multiplizieren“ Anweisung hat, denn es erfordert nur wenige mittelt Berechnung, bis wir einen Mittelpunkt erhalten:

P0 
    F0 := average(P0, P1) 
P1      S0 := average(F0, F1) 
    F1 := average(P1, P2)   Midpoint := average(S0, S1) 
P2      S1 := average(F1, F2) 
    F2 := average(P2, P3) 
P3 

Die gesamte Bézier-Kurve ist (P0 , P1, P2, P3).

Die linke Hälfte dieser ganzen Bezier-Kurve ist die Bezier-Kurve (P0, F0, S0, M).

Die rechte Hälfte dieser ganzen Bezier-Kurve ist die Bezier-Kurve (M, S1, F2, P3).

Viele Mikrocontroller weiterhin jede Kurve zu unterteilen in immer kleinere kleine Kurven , bis jedes Stück klein genug ist, mit eine gerade Linie anzunähern.

Aber wir wollen den anderen Weg gehen - auf eine größere Kurve extrapolieren.

Extrapolation

entweder die linke Hälfte oder die rechte Hälfte gegeben, wir können dies in umgekehrter Reihenfolge ausführen, um die ursprüngliche Kurve zu erholen.

Stellen wir uns vor, dass wir die ursprünglichen Punkte P1, P2, P3 vergessen haben.

die linke Hälfte einer Bezier-Kurve Given (P0, F0, S0, M), wir nach rechts mit extrapolieren kann:

S1 := M + (M - S0) 
F1 := S0 + (S0 - F0) 
P1 := F0 + (F0 - P0) 

dann diese Werte verwenden berechnen

F2 := S1 + (S1 - F1) 
P2 := F1 + (F1 - P1) 

und schließlich

P3 := F2 + (F2 - P2) 

zu extrapolieren und die hochgerechneten Bazier Kurve (P0, P1 zu erholen, P2, P3).

Details

Die extrapolierte Kurve (P0, P1, P2, P3) verlaufen in der ursprünglichen Kurve jeden Punkt durch (P0, F0, S0, M) - insbesondere beim Starten P0 und durch den Mittelpunkt M - und geht weiter bis zum Erreichen von P3.

Wir können immer von allen 4 Punkten extrapolieren (P0, F0, S0, M), , ob diese vier Punkte wurden ursprünglich als die linke Hälfte (oder rechte Hälfte) eines größeren Bezierspline berechnet.

Ich bin sicher, dass Sie bereits wissen, dies aber nur für Klarheit:

Midpoint = average(F0, F1) 

bedeutet "finden den Mittelpunkt genau auf halber Strecke zwischen den Punkten F0 und F1", oder in anderen Worten,

Midpoint.x = (F0.x + F1.x)/2 
Midpoint.y = (F0.y + F1.y)/2 
Midpoint.z = (F0.z + F1.z)/2 

Der Ausdruck

S1 := M + (M - S0) 

bedeutet „ein Liniensegment gegeben, der mit einem Ende am S0, und der Mittelpunkt bei M, Start bei S0 und in einer geraden Linie Vergangenheit M ausgeführt, bis Sie das andere Ende an S1" erreichen, oder mit anderen Worten (es sei denn, Sie haben eine anständige Vektor-Bibliothek) 3 Zeilen Code

S1.x := M.x + (M.x - S0.x) 
S1.y := M.y + (M.y - S0.y) 
S1.z := M.z + (M.z - S0.z) 

. (Wenn Sie 2D machen, überspringen Sie alle "z" Zeug - es ist immer Null).