Ableitung kub. Spline-Funktion < Ganzrationale Fktn < Analysis < Oberstufe < Schule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 16:37 Di 19.04.2005 | Autor: | Fabi_K |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo,
ich würde gerne wissen, wie man die Ableitung zu einer kubischen Spline-Funktion bildet.
Die Funktion an sich habe ich hinbekommen.
Ich berechne x(t) und y(t) [bei bedarf auch z(t)]. t läuft von 0 bis t_max.
Für jede Dimension habe ich ein eigenes Polynom 3. Grades.
f(t) ist also das Ergebnis aus x(t) und y(t).
t berechnet sich aus den Punkten, die ich angegeben habe:
[mm] d_{k} [/mm] = [mm] \wurzel{ x_{k}^{2}+y_{k}^{2}}
[/mm]
[mm] t_{1} [/mm] = 1
[mm] t_{k} [/mm] = [mm] t_{k-1} [/mm] + [mm] d_{k-1} [/mm] (k=2, ... , k=n)
wobei k für einen der Punkte steht, durch die die Splinefunktion laufen soll.
Für die Steigung von f(t) muss ich also f'(t) bilden.
Alternativ würde ich die Steigung aus f(t) und f(t+1) berechnen, was ich jedoch ungern so machen möchte.
Für alle die sich Fragen warum ich das wissen will:
Ich sitze an meiner Abschlussarbei, in die ich ein Programm schreiben soll, welches Punkte miteinander interpoliert. Auf dieser Strecke soll dann ein Auto fahren. Je nach Krümmung der Kurve soll dann die Fliehkraft, die auf das Auto wirkt, berechnet werden. Dafür benötige ich die Steigung von f(t).
Programm
Danke Schonmal
Gruss Fabian
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:51 Di 19.04.2005 | Autor: | leduart |
Hallo
> ich würde gerne wissen, wie man die Ableitung zu einer
> kubischen Spline-Funktion bildet.
> Die Funktion an sich habe ich hinbekommen.
> Ich berechne x(t) und y(t) [bei bedarf auch z(t)]. t läuft
> von 0 bis t_max.
> Für jede Dimension habe ich ein eigenes Polynom 3.
> Grades.
> f(t) ist also das Ergebnis aus x(t) und y(t).
Verstehe ich richtig: f(t) ist ein Vektor f(t)= [mm] \vektor{x(t) \\ y(t)}
[/mm]
Dann ist der Tangentialvektor t= [mm] \vektor{x'(t) \\ y'(t)}
[/mm]
> t berechnet sich aus den Punkten, die ich angegeben habe:
> [mm]d_{k}[/mm] = [mm]\wurzel{ x_{k}^{2}+y_{k}^{2}}[/mm]
> [mm]t_{1}[/mm] = 1
> [mm]t_{k}[/mm] = [mm]t_{k-1}[/mm] + [mm]d_{k-1}[/mm] (k=2, ... , k=n)
[mm] x_{k},y_{k} [/mm] geben die Koordinaten der gegebenen Punkte in deinem gewählten KOOs an?
dann ist [mm] d_{k} [/mm] der Abstand von 0,0? wieso kommst du dann so auf [mm] t_{k}? [/mm] versteh ich nicht!
kannst du schreiben, wie du die Splinefkt herstellst.
Dein Programm müsste ich Quellcode haben, es läuft nicht auf meinem Mac
> wobei k für einen der Punkte steht, durch die die
> Splinefunktion laufen soll.
>
> Für die Steigung von f(t) muss ich also f'(t) bilden.
>
> Alternativ würde ich die Steigung aus f(t) und f(t+1)
> berechnen, was ich jedoch ungern so machen möchte.
>
>
> Für alle die sich Fragen warum ich das wissen will:
> Ich sitze an meiner Abschlussarbei, in die ich ein
> Programm schreiben soll, welches Punkte miteinander
> interpoliert. Auf dieser Strecke soll dann ein Auto fahren.
> Je nach Krümmung der Kurve soll dann die Fliehkraft, die
> auf das Auto wirkt, berechnet werden. Dafür benötige ich
> die Steigung von f(t).
aus f' kann man keine Krümmung ausrechnen!
Gruss leduart
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:43 Mi 20.04.2005 | Autor: | Fabi_K |
Hallo Leduart, danke schonmal für deine Antwort.
> Verstehe ich richtig: f(t) ist ein Vektor f(t)=[mm]\vektor{x(t) \\ y(t)}[/mm]
f(t) ist eine Funktion, welche eine X- und eine Y-Koordinate liefert.
Also aus Programmierer Sicht füttere ich die Funktion 'f()' mit dem Wert von 't' und erhalte eine Record(Pascal)/Struct(C) in dem ein X- und ein Y-Wert stehen.
f(t).x und f(t).y
(Bisher kenne ich nur lineare Vektoren)
> Dann ist der Tangentialvektor t=[mm]\vektor{x'(t) \\ y'(t)}[/mm]
Ich hoffe mal, daß sich f'(t) aus [mm] \vektor{x'(t) \\ y'(t)} [/mm] berechnen lässt. Da liegt ja meine Frage.
> > t berechnet sich aus den Punkten, die ich angegeben habe:
> > [mm]d_{k}[/mm] = [mm]\wurzel{ x_{k}^{2}+y_{k}^{2}}[/mm]
> > [mm]t_{1}[/mm] = 1
Sorry, da habe ich mich verschrieben.
[mm]t_{1}[/mm] = 0
> > [mm]t_{k}[/mm] = [mm]t_{k-1}[/mm] + [mm]d_{k-1}[/mm] (k=2, ... , k=n)
> [mm]x_{k},y_{k}[/mm] geben die Koordinaten der gegebenen Punkte in
> deinem gewählten KOOs an?
Genau.
> dann ist [mm]d_{k}[/mm] der Abstand von 0,0?
[mm] d_{k} [/mm] ist nur ein temporärer Wert, zur Berechnung von [mm] t_{k}
[/mm]
> wieso kommst du dann so auf [mm]t_{k}?[/mm] versteh ich nicht!
für t gilt: [mm] t_{1} [/mm] < [mm] t_{k} [/mm] < [mm] t_{n} [/mm] n ist die Anzahl an Punkten, durch die die Splinefunktion laufen soll.
Durch [mm]d_{k}[/mm] = [mm]\wurzel{ x_{k}^{2}+y_{k}^{2}}[/mm] ist garantiert, daß [mm] d_{k} [/mm] einen Positiven Wert hat.
[mm] t_{k} [/mm] = [mm] t_{k-1} [/mm] + [mm] d_{k-1} [/mm] dient dazu, daß [mm] t_{k} [/mm] einen größeren Wert als [mm] t_{k-1} [/mm] hat.
Somit ist die Bedingung für t erfüllt.
> kannst du schreiben, wie du die Splinefkt herstellst.
Für jedes Intervall berechne ich ein Polynom 3. Grades. Damit ich glatte Kurven erhalte, muss die 1. und 2. Ableitung an den Rändern der Intervalle gleich sein.
[mm] f'_{k-1}(t_{k}) [/mm] = [mm] f'_{k}(t_{k}) [/mm] (k=2, ... , k=n-1)
[mm] f''_{k-1}(t_{k}) [/mm] = [mm] f''_{k}(t_{k}) [/mm] (die Formel habe ich zwar nirgens gefunden, aber es sollte so stimmen).
Polynom 3. Grades.
[mm] f_{k}(t) [/mm] = [mm] A_{k}(t-t_{k})^{3} [/mm] + [mm] B_{k}(t-t_{k})^{2} [/mm] + [mm] C_{k}(t-t_{k}) [/mm] + [mm] D_{k}
[/mm]
Die Koeffizienten für jedes Polynom rechne ich über ein lineares Gleichungssystem aus.
Dieses ist tridiagonal, symmetrisch, diagonal dominant und besitzt positive Diagonalelemente, ist also positiv definit (das alles sagt mir herzlich wenig , aber vielleicht kannst du ja damit was anfangen)
[mm] \vmat{ 2( \Delta t_{1} + \Delta t_{2}) & \Delta t_{2} & & &
\\ \Delta t_{2} & 2( \Delta t_{2} + \Delta t_{3}) & \Delta t_{3} & &
\\ & \Delta t_{3} & 2( \Delta t_{3} + \Delta t_{4}) & \Delta t_{4} &
\\ & ... & ... & ...
\\ & & \Delta t_{n-2} & 2( \Delta t_{n-2} + \Delta t_{n-1}) } [/mm] * [mm] \vmat{ u''_{2} \\ u''_{3} \\ u''_{4} \\ ... \\ u''_{n-1} } [/mm] = [mm] \vmat{ 6(\bruch{\Delta u_{2}}{\Delta t_{2}} - \bruch{\Delta u_{1}}{\Delta t_{1}} )-\Delta t_{1}u''_{1}
\\ 6(\bruch{\Delta u_{3}}{\Delta t_{3}} - \bruch{\Delta u_{2}}{\Delta t_{2}} )
\\ 6(\bruch{\Delta u_{4}}{\Delta t_{4}} - \bruch{\Delta u_{3}}{\Delta t_{3}} )
\\ ...
\\ 6(\bruch{\Delta u_{n-1}}{\Delta t_{n-1}} - \bruch{\Delta u_{n-2}}{\Delta t_{n-2}} )-\Delta t_{n-1}u''_{n} }
[/mm]
u''_{1} in der 1. Zeile und u''_{n} in der letzten Zeile sind bekannt und werden gewöhnlich mit 0 vorgegeben.
alle anderen u''_{k} sind unbekannt und können berechnet werden. Aus diesen werden die Koeffizienten der Polynome 3. Grades für jedes Intervall ausgerechnet.
> Dein Programm müsste ich Quellcode haben, es läuft nicht
> auf meinem Mac
Ich habe das Programm in Borland Delphi geschrieben. Evtl. läuft es auch mit Kylix. Habe ich nicht getestet. Man müsste dann die XLC-Library für die Oberfläche benutzen. Bisher ist das VCL.
Quellcode
Wichtig sind die Units uSplineBase.pas und uSplineCompute.pas. Und dort die Methoden 'fCreateMatrix1()', 'fBuild_Ts()', 'pResolveUnknown1()' und 'pComputeKoeffs()'
> aus f' kann man keine Krümmung ausrechnen!
Ist das jetzt eine Antwort auf meine Frage, oder ist das Wort Krümmung hier falsch gewählt?
mfg
Fabian
PS: Die Generierung der Formeln als PNG-Bilder gefällt mir richtig gut :-D
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:49 Mi 20.04.2005 | Autor: | leduart |
Hallo Fabian.
Erstens x'(t),y'(t) ist wirklich f'(t). Deine Wahl für [mm] t_{k} [/mm] versteh ich immer noch nicht wirklich, dein Ergebnis, [mm] t_{k}>t_{k-1} [/mm] erreicht man doch auch durch [mm] t_{k}=t_{k-1}+a [/mm] bei irgendeinem pos. Wert von a. oder, um es etwas natürlicher zu machen
[mm] d_{k}= \wurzel{(x_{k}-x_{k-1})^{2}+(y_{k}-y_{k-1})^{2}}.
[/mm]
Aber das ist eigentlich egal.
Nur, wenn du f' hast weisst du über die Krümmung noch nichts. f'(t) ist ein Vektor (für festes t das was du einen linearen Vektor nennst. Er gibt die Tangentenrichtung im Pkt x(t), y(t)an. Die Krümmung ist nun definiert als Änderung des Tangentialvektors pro Bogenlänge. Wenn t also die Bogenlänge wäre f''.
Andere Definition der Krümmung: das Reziproke des Radius des Kreises der an der Stelle berührt und die gleiche 2.Ableitung hat. Das ist aber für dich schwierig! Will das dein Lehrer von dir?
Beste Methode, die mir einfällt: Mach aus f' einen Einheitsvektor (Vektor der Länge 1) :
[mm] \vec{e_{T}(t)}=f'(t)/|f'(t)| [/mm] mit |f'(t)|= [mm] \wurzel{x'(t)^{2}+y'(t)^{2}}
[/mm]
Der Krümmungsvektor ist dann die Ableitung von [mm] \vec{e_{T}(t)}/|f'| [/mm] die Krümmung selbst der Betrag davon.
Wenn du das nicht verstehst oder Schwierigkeiten mit dem Differenzieren hast, schreib noch mal!
Allerdings ist die Krümmung an deinen Punkten tk nicht stetig, d.h. sie macht i.A. Sprünge,d.h. dein Auto wird Schwierigkeiten haben. ( Im richtigen Strassenbau gleicht man deshalb nicht mit Splines aus!)
Ich hoff ich konnte dir was helfen.
Gruss leduart
|
|
|
|