Ein paar Fragen zu kubischen Splines.

Neue Frage »

Toni_0815 Auf diesen Beitrag antworten »
Ein paar Fragen zu kubischen Splines.
Hallo. Wink

Ich habe mich in letzter Zeit mal mit Interpolationen beschäftigt. Linear, Bezier und Catmull-Rom hab ich hinbekommen, aber an kubischen Splines hänge ich seit 3 Wochen und komme trotz intensiver Board- und Googlesuche nicht weiter.

Die Aufgabenstellung die ich mir selbst gestellt habe ist, die Splines zwischen N Punkten zu berechnen und mit Hilfe von Basic grafisch darzustellen. Als erstes möchte ich mich dabei den natürlichen kubischen Splines widmen.

Meine Punkte sind:
P1: 100, 400
P2: 400, 350
P3: 600, 500
P4: 850, 410


Die Formel lautet ja:
y = a + b*x + c*x² + d*x³

Und jetzt geht es schon los mit meinem fehlenden Verständnis. Ich weiß nicht was ich als x nehmen soll und wie ich a-d berechnen muss. Nach meiner Logik würde ich für x die X-Koordinaten der Punkte einsetzen, also würde die Gleichung für den ersten Punkt folgendermaßen aussehen:

400 = a + b*100 + c*100² + d*100³

Bei meiner Suche bin ich aber auch auf diese Formel gestoßen:
y = a + b*(xt - x) + c*(xt - x)² + d*(xt - x)³

Wobei xt sicherlich der darzustellende Punkt zwischen beispielsweise P1 und P2 ist.

Das erste was ich nicht verstehe ist, welche denn nun die richtige Formel ist. Ich weiß das ich bei 4 Punkten 3 Splines berechnen muss und jeder Spline 4 Unbekannte hat, es in diesem Fall also insgesamt 12 Unbekannte gibt.

Wie ich auf a-d kommen soll weiß ich aber leider auch nicht. Wenn ich das richtig verstanden habe, dann ist a immer die Y-Koordinate des ersten Punktes des jeweiligen Splines, im Fall zwischen P1 und P2 also 400. Aber das habe ich bestimmt nicht richtig verstanden, oder ?

b und c müssten bei dem ersten und dem letzten Spline 0 sein, wenn es sich um einen natürlichen Spline handelt. Aber wie es bei P2-P3 aussieht, wie man auf d kommt und ob meine Ausführungen überhaupt richtig oder totaler Quatsch sind, weiß ich leider auch nicht.

Bei den anderen Interpolationsarten die ich bis jetzt umgesetzt habe, bin ich immer die Punkte von P1 bis PN-1 durchgegangen und habe den betreffenden Abschnitt völlig unabhängig von den anderen berechnet. Kann man das bei kubischen Splines auch so machen, oder muss man alle Punkte mit einbeziehen, wenn man einen Abschnitt berechnet ?

Ich hätte gern mehr Vorarbeit präsentiert, aber wie gesagt stecke ich total fest und weiß nicht wo und wie ich anfangen soll. Kann mir bitte jemand dabei helfen ?
Steffen Bühler Auf diesen Beitrag antworten »
RE: Ein paar Fragen zu kubischen Splines.
Du suchst für Deine vier Punkte ja drei kubische Splines. Jeder dieser Spline hat vier unbekannte Koeffizienten. Das ergibt somit zwölf Unbekannte, für die Du zwölf Gleichungen aufstellen musst.

Ein Spline hat prinzipiell die Form s(x)=a(x-x0)³+b(x-x0)²+c(x-x0)+d.

In jeden Spline kannst Du zunächst seine zwei Punkte einsetzen, das sind dann schon mal sechs Gleichungen.

Die Steigung und Krümmung von erstem und zweitem Spline sind im zweiten Punkt gleich. Das sind zwei weitere Gleichungen.

Die Steigung und Krümmung von zweitem und dritten Spline sind im dritten Punkt ebenfalls gleich. Das sind noch mal zwei weitere Gleichungen.

Die letzten zwei Gleichungen bekommst Du, indem Du die Krümmung im ersten und letzten Punkt auf Null setzt.

Wenn Du weitere Hilfe brauchst, melde Dich.

Viele Grüße
Steffen
 
 
Dopap Auf diesen Beitrag antworten »

in workshop-artikeln steht jede Menge zu Splines. Haupsächlich von tigerbine.

in folgendem Workshop

[WS] Spline-Interpolation - Beispiele

hat Steffen am Ende auch etwas "einfacheres" dazu geschrieben. Das könnte für das grundsätzliche Verständnis wichtig sein.
Toni_0815 Auf diesen Beitrag antworten »

@Dopap
Das hab ich mir alles schon durchgelesen, aber das macht es nur noch verwirrender für mich. Hammer


@Steffen Bühler
Also ist die erste von mir aufgeschriebene Formel falsch ?

Liege ich richtig das in Deiner Formel das x für den gerade zuberechnenden Punkt zwischen zwei Punkten und das x0 die X-Koordinate des ersten aktuellen Punktes ist ?

Also beispielsweise bei der Berechnung des Splines zwischen P2 und P3:
s(x)=a(x-400)³+b(x-400)²+c(x-400)+d

Wenn Du sagst das ich beide Punkte einsetzen kann, meinst Du damit die X-Koordinaten von Punkt 2 und 3 ?

Wenn ich den zweiten Spline berechnen möchte, würde das also folgendermaßen aussehen:

P2_y = a(x-400)³ + b(x-400)² + c(x-400) + d
P3_y = a(x-600)³ + b(x-600)² + c(x-600) + d

Stimmt das erstmal so ?
Toni_0815 Auf diesen Beitrag antworten »

Wie gesagt bin ich ja bisher immer jeden Abschnitt einzeln durchgegangen. Muss ich bei kubischen Splines diese Gleichungen für jeden Punkt aufstellen, auch wenn ich diese Punkte gerade gar nicht berechne ?
Toni_0815 Auf diesen Beitrag antworten »

@Steffen Bühler
Sorry für den Doppelpost, aber wo ist denn jetzt Deine Antwort auf einmal hin ? geschockt
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
Also ist die erste von mir aufgeschriebene Formel falsch ?


Nein, aber es wird damit schwieriger, finde ich. Durch das Verschieben des Koordinatensystems, also mit dem (x-x0), bekommst Du, wie Du ja schon geschrieben hattest, das d sofort heraus, denn das ist der y-Wert bei x=x0.

Zitat:
Original von Toni_0815
Wenn ich den zweiten Spline berechnen möchte, würde das also folgendermaßen aussehen:

P2_y = a(x-400)³ + b(x-400)² + c(x-400) + d
P3_y = a(x-600)³ + b(x-600)² + c(x-600) + d
Stimmt das erstmal so ?


Nicht ganz. Der zweite Spline hat ja in beiden Fällen dieselbe Funktionsgleichung! Die zweite Gleichung müsste ebenfalls lauten
P3_y = a(x-400)³ + b(x-400)² + c(x-400) + d

Und da werden dann (400|350) und (600|500) eingesetzt. Das sind die ersten zwei Gleichungen.

EDIT: ebenfalls sorry, aber ich hab die Antwort noch mal überarbeitet.
Toni_0815 Auf diesen Beitrag antworten »

Achso. Dachte schon ich habs kaputt gemacht. LOL Hammer

Aber nochmal die Frage:
Muss ich immer alle Gleichungen aufstellen, auch wenn ich immer nur einen Spline berechne ?
Steffen Bühler Auf diesen Beitrag antworten »

Alle nicht, aber Du willst ja auch die Steigungen und Krümmungen gleichsetzen, daher brauchst Du auch die benachbarten Spline-Gleichungen.

Bleiben wir mal beim zweiten Spline. Die Gleichung nennen wir mal



Da setzen wir also nun (400|350) und (600|500) ein:







Nun zu den Steigungen. Die erste Ableitung lautet



Für unsere beiden Punkte also





Den Zahlenwert der Steigung in diesen beiden Punkten kennen wir nicht, aber wir wissen, dass sie mit dem des jeweilgen Nachbarsplines übereinstimmen muss (sonst gibt's einen Knick):





Und dasselbe für die Krümmungen. Die zweite Ableitung ist



Also





Und auch hier gilt ja





Du kannst also in der Tat nicht einen Spline völlig isoliert betrachten, er hängt mit den Nachbarn zusammen. Aber, wie gesagt, auf diese Weise bekommst Du die benötigten 12 Gleichungen zusammen.
Toni_0815 Auf diesen Beitrag antworten »

Danke für die Erklärungen, aber jetzt bin ich erst recht verwirrt.

Also steht in der Formel s(x)=a(x-x0)³+b(x-x0)²+c(x-x0)+d das x beispielsweise für P3_x und das x0 für P2_x ? Und wo ist denn da das aktuelle x das berechnet wird ?


Meine Programmschleife sieht ja folgendermaßen aus:

Von P1 bis PN-1
{
Von AktuellerPunkt_x bis AktuellerPunkt+1_x in beispielsweise 10 Schritten (also 10 Zwischenpunkte die berechnet werden sollen)
{
Zwischenpunkt_y = ?
}
}


Innerhalb der inneren Schleife weiß ich jetzt nicht so richtig was ich tun muss.
Ich kann zwar die Gleichung Zwischenpunkt_y = a*(ZP+1_x - ZP)³ + b*(ZP+1_x - ZP)² + c*(ZP+1_x - ZP) + ZP_y aufstellen, aber dann weiß ich nicht weiter.
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
Also steht in der Formel s(x)=a(x-x0)³+b(x-x0)²+c(x-x0)+d das x beispielsweise für P3_x und das x0 für P2_x ?


Nein, das x0 ist bei ersten Spline der x-Wert von P1, beim zweiten der von P2, beim dritten der von P3. Also:







Diese drei Gleichungen (also die 12 Koeffizienten) gilt es zu knacken.

Zitat:
Original von Toni_0815
Und wo ist denn da das aktuelle x das berechnet wird ?


Es wird kein x berechnet, nur die Koeffizienten. Wenn Du die drei Spline-Gleichungen dann hast, kannst Du die y-Werte für beliebige x-Werte zwischen 100 und 850 bestimmen.

Deinen Programmansatz verstehe ich nicht. Letztendlich stellst Du doch ein lineares Gleichungssystem (mit hier 12 Variablen) auf, das Du mit den üblichen Verfahren lösen musst.
Toni_0815 Auf diesen Beitrag antworten »

Wenn ich zum Beispiel den Spline zwischen dem 2. und dem 3. Punkt berechnen will, dann ist x=600 und x0=400 ?

Und kann ich also die einzelnen Abschnitte nicht Stück für Stück berechnen ?
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
Wenn ich zum Beispiel den Spline zwischen dem 2. und dem 3. Punkt berechnen will, dann ist x=600 und x0=400 ?


Das liefert Dir nur drei Gleichungen von den zwölf. Du musst, wie beschrieben, in einsetzen, aber auch in sowie .

Zitat:
Original von Toni_0815
Und kann ich also die einzelnen Abschnitte nicht Stück für Stück berechnen ?


Nein, Du bekommst hier alle Splines auf einen Schlag, indem Du das Gleichungssystem löst. Dies ist zunächst wie gesagt ein 12*12-LGS. Das kann man allerdings stark vereinfachen, wie zum Beispiel auf dieser Seite beschrieben wird. Vielleicht hilft die Dir heute abend ein wenig weiter, ich bin nämlich gleich weg und erst morgen wieder hier. Eventuell kann ja auch jemand anders aushelfen.

Viele Grüße
Steffen
Toni_0815 Auf diesen Beitrag antworten »

Ja, das stimmt. Das war auch nur eine Frage zum Verständnis was x und x0 ist.

Den Link habe ich natürlich vorher auch studiert, aber hilft mir momentan auch nicht weiter, da ich erstmal die Vorgehensweise verstehen muss. Wie gesagt bin ich es von den anderen Interpolationsarten gewohnt, Abschnitt für Abschnitt zu berechnen und nicht alles zusammen. Ich denke das ist momentan mein größtes Verständnisproblem.
Steffen Bühler Auf diesen Beitrag antworten »

Du kannst es auch abschnittsweise machen, indem Du die Steigungen der Splines in den einzelnen Punkten vorgibst, z.B. mit Null. Dann läuft es auf die Methode im Workshop raus. Aber das wären nur lokale kubische Splines, Du kannst Dir denken, dass das nicht die ideale Interpolation der Punkte ist.
Toni_0815 Auf diesen Beitrag antworten »

Die Begriffe Steigung und Krümmung habe ich auch schon mehrfach gelesen, aber ich kann sie nicht wirklich einordnen.
Kannst Du mir bitte sagen für was die Buchstaben a-d stehen ? Zwei davon beschreiben doch die Steigung und die Krümmung, oder ?
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
Die Begriffe Steigung und Krümmung habe ich auch schon mehrfach gelesen, aber ich kann sie nicht wirklich einordnen.


Ach so? Das hatte ich jetzt vorausgesetzt, wir sind ja in Analysis.

Nur kurz dazu: Steigung Null ist eine horizontale Linie, Steigung Eins sind 45°. Die Steigung ist also der Tangens des Winkels.

Zitat:
Original von Toni_0815
Kannst Du mir bitte sagen für was die Buchstaben a-d stehen ?


Oh, auch das hatte ich vorausgesetzt. Das sind die vier Koeffizienten der Splinefunktion s(x)=ax³+bx²+cx+d.

Das ist aber nicht einfach Steigung/Krümmung. Die Steigung an der Stelle x wird durch die erste Ableitung s'(x)=3ax²+2bx+c berechnet. Das kann ich aber schon voraussetzen, oder? Sonst wird's schwierig.
Toni_0815 Auf diesen Beitrag antworten »

Also natürlich weiß ich mit den Begriffen Steigung und Krümmung etwas anzufangen. Ich weiß nur nicht welcher Buchstabe a-d in der Formel für die Steigung und die Krümmung steht.
Generell wäre eine einfache Erklärung am Besten, da ich schon eine Weile aus der Schule raus bin und wir sowas dort auch nicht hatten. Augenzwinkern
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
Ich weiß nur nicht welcher Buchstabe a-d in der Formel für die Steigung und die Krümmung steht.


Keiner, wie gesagt. Bei einem Spline ist ja die Steigung und Krümmung nicht überall gleich, also von x abhängig. Daher bildet man ja auch die Ableitungen.

Machen wir doch mal ein kurzes Beispiel mit Deinen ersten zwei Punkten und legen da einen kubischen Spline dazwischen. Vielleicht wird's dann klarer.

Wir suchen die Zahlen a,b,c,d für s(x)=ax³+bx²+cx+d, so dass

s(100)=400
s(400)=350

Also

a*100³+b*100²+c*100+d=400
a*400³+b*400²+c*400+d=350

Das sind aber nur zwei Gleichungen. Wir brauchen vier. Also setzen wir die Steigung in den beiden Punkten willkürlich auf Null, der Spline läuft da also horizontal:

s'(x)=3ax²+2bx+c

s'(100)=0
s'(400)=0

Also

3a*100²+2b*100+c=0
3a*400²+2b*400+c=0

Gut. Jetzt haben wir vier Gleichungen für die vier Variablen und erhalten

a=0,0000037037
b=-0,002777
c=0,444444
d=379,629629

Der Spline wird also durch die Funktion s(x)=0,0000037037*x³-0,002777*x²+0,444444*x+379,629629beschrieben.

Dann schaun wir mal, wie dieser Graph aussieht:



Gar nicht schlecht, oder?

So kannst Du nun die zwei anderen Splines auch berechnen. Aber, wie gesagt: die Steigung in den Übergangspunkten einfach auf Null zu setzen ist zwar nett, aber ergibt nicht unbedingt das Gewünschte. Und daher würde ich hier die erstgenannte Methode verwenden.

Viele Grüße
Steffen
Toni_0815 Auf diesen Beitrag antworten »

Vielen Dank für das ausführliche Beispiel und vor allem für die Geduld die Du mit mir hast. Freude

Ich glaube ich habe mir die Zusammensetzung der Formel völlig falsch vorgestellt. Das könnte der Grund für meinen Knoten im Gehirn gewesen sein.

Lineare Gleichungssysteme mit mehreren Unbekannten zu lösen ist auch schon eine Weile her, aber da war doch irgendwas mit Additions- und Subtraktionsverfahren. Ich werde Dein Beispiel mal nachrechnen und schauen ob ich es verstanden habe. Augenzwinkern
Toni_0815 Auf diesen Beitrag antworten »

Ich habe mir das mal angeschaut, aber es gibt immernoch einige Dinge die ich nicht verstehe.

Du hast ja zum Beispiel folgende Gleichung für den ersten Punkt aufgestellt:

a*100³ + b*100² + c*100 + d = 400

Aber statt beispielsweise a*x³ hatten wir ja auch schon a*(x-x0)³ um das Koordinatensystem zu verschieben. Die Formel müsste (nach meinem momentanen Verständnis) also so aussehen:

a*300³ + b*300² + c*300 + 400 = 400

Wenn ich jetzt das d eliminiere und auf beiden Seiten die 400 wegnehme, bleibt:

a*300³ + b*300² + c*300 = 0

Das kann doch aber gar nicht sein, denn dann müsste der linke Teil der Gleichung ja immer 0 ergeben. Oder irre ich mich da komplett ?
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
a*300³ + b*300² + c*300 + 400 = 400


Hier ist ein kleiner Fehler reingekommen. An dieser Stelle soll der Spline doch den Wert 350 annehmen, nicht 400. Dann stimmt's nämlich, wenn man weiterrechnet. Es ergibt sich hier, wie Du ja schon richtig herausgefunden hast, das angenehmere d=400 und nachher genauso angenehm c=0.

Somit bleibt durch das Verschieben nur noch ein 2*2-LGS zu lösen, und da ergibt sich schnell a=0,0000037037 und b=-0,0016666.

Das ist dann diese Funktion:

Toni_0815 Auf diesen Beitrag antworten »

Also müsste die Gleichung wie folgt lauten ?

a*300³ + b*300² + c*300 + 400 = 350

Wir berechnen doch aber den ersten und nicht den zweiten Punkt. Wieso sollte es dann 350 und nicht 400 sein ?
Steffen Bühler Auf diesen Beitrag antworten »

Nein, das ist der zweite Punkt, also (300|350). Der erste lautet (0|400).

Deine zwei Originalpunkte (100|400) und (400|350) sind doch beide um 100 nach links geschoben worden, so dass der erste Punkt auf Null liegt.

Die Gleichung für den ersten Punkt lautet daher

a*0³ + b*0² + c*0 + d = 400

wodurch sich ja d=400 ergab, was dann in der zweiten Gleichung eingesetzt werden konnte.
Toni_0815 Auf diesen Beitrag antworten »

Ich glaub ich steh im Bahnhof, denn ich seh nur Züge. verwirrt

Hier mal ein paar schrittweise Überlegungen um zu schauen ob ich es bisher richtig verstanden habe:

Berechnet werden soll der erste Spline, also zwischen P1 und P2. Dazu muss ich (vorerst) zwei Gleichungen aufstellen.

Die Grundform der Gleichung lautet: f(x) = a(x-x0)³ + b(x-x0)² + c(x-x0) + d

P1_x ist 100, aber ich will ja P1_x=0 haben, also setze ich P1_x einfach auf 0, was die von Dir geschriebene Formel ergibt:
a*0³ + b*0² + c*0 + d = 400

Da eine Multiplikation mit 0 immer 0 ergibt, bleibt (+)d = 400
Das ist also die erste Gleichung.

Die zweite Gleichung wird genauso aufgebaut, nur das ich jetzt P2_x auch um 100 reduzieren muss, damit der Abstand zwischen P1_x und P2_x der gleiche bleibt. Wenn P1_x beispielsweise 236 wäre, dann müsste ich also die erste Gleichung auch auf 0 bringen und bei der zweiten 400-236 rechnen.


Die zweite Gleichung müsste also so aussehen:

350 = a(400-100)³ + b(400-100) + c(400-100) + d

Oder vereinfacht und eingesetzt:
350 = a*300³ + b*300² + c*300 + 400

Das wären also die ersten beiden Gleichungen. Soweit richtig ?


Für den zweiten Spline würden die beiden Gleichungen also so aussehen:

350 = d
500 = a*200³ + b*200² + c*200 + 350

Und für den dritten Spline so:
500 = d
410 = a*250³ + b*250² + c*250 + 500


Stimmen meine Überlegungen, oder liege ich völlig falsch ?
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Toni_0815
a*0³ + b*0² + c*0 + d = 400
350 = a*300³ + b*300² + c*300 + 400
Das wären also die ersten beiden Gleichungen. Soweit richtig ?


Ja. Und bringen wir's auch hier mal zu Ende:

Die Steigung soll in beiden Punkten Null sein, also im ersten Punkt

f'(x)=3a(x-100)²+2b(x-100)+c=3a*0²+2b*0+c=0

Woraus sich sofort c=0 ergibt, wie gesagt.

Und im zweiten Punkt

3a*300²+2b*300+c=0
-> 270000a+600b=0

Zusammen mit dem schon bekannten

a*300³ + b*300² + c*300 + 400 = 27.000.000a+90.000b+400=350
->27.000.000a+90.000b=-50

ergeben sich die zwei Gleichungen für die zwei Unbekannten a und b. Und damit die Gleichung für den ersten Spline.

Auch die restlichen Gleichungen stimmen.
Toni_0815 Auf diesen Beitrag antworten »

Also ist die dritte Gleichung die Steigung des ersten und die vierte die Steigung des zweiten Punktes des jeweiligen Abschnittes. Da es natürliche Splines sein sollen muss die dritte Gleichung von P1 und die vierte Gleichung von PN 0 sein. Und bei den Punkten dazwischen muss die vierte Gleichung von P gleichgesetzt werden mit der dritten Gleichung von P+1.

Ich glaube jetzt hab ich es verstanden. Freude
Steffen Bühler Auf diesen Beitrag antworten »

Vorsicht! Jetzt zuletzt haben wir einfach drei lokale kubische Splines konstruiert, die jeweils alle mit Steigung Null anfangen und enden. Das waren jeweils vier Gleichungen mit vier Unbekannten. Ansonsten haben die Splines (bis natürlichauf die Übergangspunkte) nichts miteinander zu tun.

Nun scheinst Du aber wieder auf die erste Methode abzuzielen. Da werden in der Tat die (noch zu bestimmenden!) Steigungen in den Übergangspunkten von benachbarten Splines gleichgesetzt. Damit handeln wir uns aber weitere Unbekannte ein. Und deswegen müssen wir eben in diesem Fall noch die Krümmungen gleichsetzen sowie die Krümmung im ersten und letzten Punkt auf Null. Damit landen wir, wie gezeigt, bei einem System mit zwölf Gleichungen und zwölf Unbekannten.
Toni_0815 Auf diesen Beitrag antworten »

Ja, es war gedacht die Steigung und Krümmung der dazwischenliegenden Punkte gleichzusetzen, damit sie eben nur an den Außenpunkten 0 sind. Aber wir haben doch schon die ganze Zeit mit 12 Gleichungen, also 4 pro Spline gerechnet, oder ?
Steffen Bühler Auf diesen Beitrag antworten »

Stimmt, zusammen sind das auch zwölf Gleichungen. Aber im einen Fall musst Du dreimal ein 4*4-LGS lösen, was bedeutend leichter ist als einmal ein 12*12-LGS.

Im 4*4-Fall interessiert uns die Krümmung auch gar nicht, wir setzen sie auch nicht auf irgendeinen Wert.

Im 12*12-Fall bleibt uns aber nichts anderes übrig, als auch die Krümmung zu berücksichtigen, sonst bekommen wir nicht genügend Gleichungen zusammen. Aber an den Randpunkten wird nur die Krümmung auf Null gesetzt, nicht die Steigung! Die wird ja berechnet und ergibt alles andere als Null, damit der Spline hübsch wird.

Gib ruhig mal Deine vier Punkte bei der verlinkten Seite ein, dann siehst Du's.
Toni_0815 Auf diesen Beitrag antworten »

Die Punkte habe ich schon eingegeben, aber Java wird in Browsern ja nicht mehr dargestellt, sodaß es keine grafische Ausgabe gibt. Und den Rechenweg versteh ich nicht wirklich.
Steffen Bühler Auf diesen Beitrag antworten »

Stimmt, ich muss da auch Java explizit erlauben. Hier mal das Ergebnis:

[attach]41161[/attach]

Du siehst, dass die Steigung an den Schnittstellen ungleich Null ist, im Gegensatz zu dem vereinfachten Ansatz, den wir gerechnet haben.

Wenn Du eine Möglichkeit hast, ein 12*12-Gleichungssystem zu lösen (das gibt's auch bei Arndt Brünner), musst Du den Rechenweg nicht verstehen, Du übernimmst einfach das Ergebnis. Beim Eingeben der Daten würdest Du aber merken, dass sehr viele Koeffizienten in einer Zeile Null sind. Und genau das macht eine Vereinfachung eben möglich: das 12*12-System wird damit auf ein 3*3-System eingedampft, das die jeweiligen b-Koeffizienten der drei Spline-Gleichungen ergibt. Und aus denen kann man dann die restlichen a- und c-Koeffizienten berechnen. Die d-Koeffizienten sind auch hier die y-Werte, somit sind die drei Splines schnell berechnet.
Toni_0815 Auf diesen Beitrag antworten »

Interessant. Mit welchem Browser bist Du denn online ? Mein Firefox lässt keinerlei Java-Applets zu. unglücklich

Ich denke das ich den Rechenweg verstehen muss, denn ich muss es ja in einem Computerprogramm umsetzen können.
Steffen Bühler Auf diesen Beitrag antworten »

Ich hab den IE11 hier, mit Firefox bekomme ich ein Fenster, womit ich das Java auf dieser Seite erlauben kann, dann geht's auch.

Den 4*4-Rechenweg verstehst Du jetzt ja, nehme ich an. Und könntest ihn auch in einem Programm umsetzen. Dann gehen die Splines halt horizontal ineinander über. Aber es sind Splines, darum geht's ja in erster Linie.

Schreibt Dir denn irgendjemand vor, dass Du auch den 12*12-Weg umsetzen sollst? Das ist mit den üblichen Lösungsverfahren auch schnell programmiert.

Und wenn Du die Vereinfachungen auf das 3*3-System implementieren willst: das sieht auf der Brünner-Seite schlimmer aus als es ist. Das n ist in Deinem Fall ja 3, die Koeffizientenmatrix für b1, b2 und b3 der drei Splines ist also schnell hingeschrieben. Die rechte Seite ergibt sich wie beschrieben. Nach dem Auflösen nach b1/b2/b3 ist ebenfalls beschrieben, wie man a1/a2/a3 und c1/c2/c3 daraus bekommt. Lies Dir die Seite mal aufmerksam durch, es wird bald klarer.
Toni_0815 Auf diesen Beitrag antworten »

Also bei mir funktioniert das mit keinem Browser. Es steht das man im Java-Control-Panel die gewünschte Seite in eine Whitelist reinschreiben soll, aber das bringt irgendwie auch nichts. Oder ich muss den Rechner erst neu starten. Das kann ich ja mal probieren.

Nein, mir schreibt niemand vor wie ich das machen muss, da ich es aus eigenem Interesse und nicht als Auftrag umsetzen möchte. Aber eigentlich will ich es gleich richtig machen und nicht in jedem Spline die Steigung auf 0 haben.
Allerdings hab ich noch keinen Plan wie ich ein Programm schreibe das Gleichungen lösen kann. Es gibt da wohl was von Gauss das dafür gut geeignet sein soll, aber da sehe ich noch nicht richtig durch.


Ich finde es seltsam das die Berechnungen so (mehr oder weniger) kompliziert sind. Ich weiß nicht ob Du Dich mit Catmull-Rom-Splines auskennst, aber das ist ja etwas ähnliches, nur das die äußeren Punkte die Steigung von P1 und PN-1 bestimmen.
Und da habe ich nur zwei Zeilen die mir die Splines berechnen. Eine Zeile für x und eine für y. Mehr nicht.
Steffen Bühler Auf diesen Beitrag antworten »

Ich hab mich mal etwas bei Wiki eingelesen, ich kannte sowas bisher nicht.

Ja, das ist ein völlig anderer Ansatz. Sehr vereinfacht nimmt man offenbar zwei Punkte und ihre Steigungen und lässt dann eine Kurve vom ersten Punkt in den zweiten laufen, wobei sich gleichzeitig die Steigung vom Wert beim ersten Punkt zum Wert beim zweiten Punkt ändert. Das ergibt dann eine Parametergleichung, in der ein t von Null bis Eins läuft. Bei Null bekommt man die x- und y-Koordinaten des ersten Punktes, bei Eins die des zweiten, dazwischen alle anderen.

So würde man ja auch auf einem Blatt Papier Punkte mit einem Stift verbinden. Man macht sich kleine Striche mit der gewünschten Steigung auf die Punkte, dann verbindet man diese Striche möglichst gleichmäßig.

Bei den kubischen Splines dagegen läuft es weniger praxisbezogen. Es wird zunächst eben die algebraische Polynomfunktion berechnet, die diese zwei Punkte verbindet. Dann kann man da natürlich auch alle möglichen x-Werte einsetzen und erhält die y-Werte. Aber um das Polynom kommt man hier nicht herum.
Toni_0815 Auf diesen Beitrag antworten »

Ja genau das meinte ich. Das ist wesentlich einfacher, weil ich einfach Abschnitt für Abschnitt und t von 0 bis 1 durchgehe und mir in nur zwei Zeilen Code die Werte ausgeben kann. Ich dachte anfangs das kubische Splines ähnlich einfach sind.

Das Java-Applet funktioniert jetzt übrigens. Ich musste den Browser neu starten. Aber die Ausführungen auf der Seite habe ich trotzdem noch nicht verstanden. Ist das so viel anders als wir es bisher gemacht haben ?
Steffen Bühler Auf diesen Beitrag antworten »

Auf der Seite ist ja nur die Vereinfachung beschrieben, wie man vom 12*12-LGS auf ein 3*3-LGS kommt. Aber auch ich müsste mich da erst einmal einlesen.

Ich könnte mir vorstellen, dass Du Dich leichter tust, das 12*12-Gleichungssystem zu lösen, in der Tat am besten mit Gauß. Da sollten ja Programmpakete im Netz zu finden sein, in welcher Sprache auch immer.

Und dann einfach die 12 Gleichungen reinklopfen. Da musst Du noch nicht mal verschieben, der Computer erledigt das auch so.
Toni_0815 Auf diesen Beitrag antworten »

Naja, aber um ein 12*12-Gleichungssystem lösen zu können, müsste ich ja erstmal wissen wie man es aufstellt.
Toni_0815 Auf diesen Beitrag antworten »

Ich habe mir die verlinkte Seite mehrmals durchgelesen, aber ich finde es ziemlich verwirrend. Ist aber auch nicht so schlimm, denn man muss ja nicht alles verstehen. Sicherlich schaue ich mir die ganze Problematik zu einem späteren Zeitpunkt nochmal an.

Bei den Beziersplines und auch bei der Catmull-Rom-Methode hat mich immer gestört das man Punkte hat die nicht direkt zur eigentlichen Kurve gehören. Aus diesem Grund wollte ich mir ja die kubischen Splines anschauen.

Ich habe mich aber gerade mal mit der Hermiteinterpolation beschäftigt, die genau das macht was ich will. Und da ich sie sofort verstanden habe und umsetzen konnte, werde ich wohl erstmal dabei bleiben. Freude

Auf alle Fälle einen riesen Dank für Deine Hilfe und für Deine Geduld mit mir !!! Gott
Ich weiß nicht wo Du wohnst, aber wenn wir uns zufällig mal über den Weg laufen sollten, dann spendier ich Dir einen. Prost Big Laugh


Hier noch ein Bild mit der Umsetzung meiner Beispielpunkte durch die Hermiteinterpolation:
fs5.directupload.net/images/160319/n7fmf7yn.jpg

(Ich kann hier leider keine Bilder hochladen, aber vielleicht kann ein Mod das Bild ja ordentlich verlinken.)
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »