[HERMITE SPLINE] Interpolation mit bekannten Ableitungen
Verfasst: Dienstag 5. März 2019, 13:36
Hallo liebe Community,
ich arbeite derzeit an einem etwas größerem Projekt. Genauer ist es ein Fahrzeugsimulator in 2D.
Input: Liste mit Wegpunkten (viele), die zu einer bestimmten Zeit passiert werden soll
Output: Animation eines Fahrzeugs (von oben, also ein Rechteck), wie es die Wegpunkte passiert. Am Startpunkt steht es und am letzten Punkt soll es stehen bleiben.
Ansatz: Diverse Verarbeitungsschritte erzeugen für mich 3 Listen. Jeweils eine Liste mit x und y Koordinaten (sortiert nach der Zeit, wann sie duchfahren werden sollen) und eine t-Liste, die die passenden Zeiten meiner Koordinaten enthält. Die Listen sind richtig, das konnte ich mehrfach bestätigen.
Mein derzeitiger Ansatz funktioniert einigermaßen gut (quick and dirty). Ich habe einfach die interp1d-Funktion von scipy genutzt und jeweils x und y mit t interpoliert. Dieses Funktion generiert aus zwei eingegebenen Listen einen B-Spline. [ACHTUNG MATHE!] Das zu erwähnen ist wichtig, weil ein B-Spline die Eigenschaften hat, dass am Start- und Endpunkt die zweite Ableitung auf 0 gesetzt wird (Wendepunkt). Da es sich bei meinen Interpolationen um Weg-Zeit Zusammenhänge handelt, ist die zweite Ableitung meiner Funktion die Beschleunigung. So weit so gut. Allerdings ist die erste Ableitung, also die Geschwindigkeit viel wichtiger. Denn diese ist durch die Bedingung des B-Splines (meistens) am Start- und Endpunkt maximal und das geht gar nicht. Wie oben beschrieben, muss das Auto aus dem Stand losfahren und am Ende wieder anhalten. ein B-Spline erzeugt zwar eine schöne Kurve, jedoch muss ich viel tricksen, um es für meine Anwendung zu verwenden.
Aus diesem Grund habe ich meinen Start und Endpunkt 10 mal wiederholt (mit jeweils sehr kurzen zeitlichen Abständen). Das sorgt dafür, dass zumindest die Animation gut aussieht, die Diagramme der Verläufe (bei näherem hinsehen) allerdings nicht schön sind. Da es sich hierbei um ein wissenschaftliches Programm handeln soll, kann ich das nicht so stehen lassen. Daher...
Mein Problem: Ich möchte gerne eine Funktion finden, die all meine Wünsche beachtet (erste Ableitung am Start-/Endpunkt = 0, glatte Kurven, schnelle Berechnung). In der Mathematik wird sowas häufig als "Hermite Interpolation" bezeichnet. Es gibt auch einige Funktionen, jedoch kann ich keine dieser Funktionen in meinem Programm verwenden.
Ich bin auf scipy.inteprolate.PiecewisePolynomial gestoßen, leider habe ich das Problem, dass die Zeile in PyCharm zu einer Fehlermeldung führt. Vielleicht kennt ja jemand meinen Fehler "Cannot find reference 'PiecewisePolynomial' in '__init__.py'" und kann mir helfen.
Vielen Dank
Z18Aplha
ich arbeite derzeit an einem etwas größerem Projekt. Genauer ist es ein Fahrzeugsimulator in 2D.
Input: Liste mit Wegpunkten (viele), die zu einer bestimmten Zeit passiert werden soll
Output: Animation eines Fahrzeugs (von oben, also ein Rechteck), wie es die Wegpunkte passiert. Am Startpunkt steht es und am letzten Punkt soll es stehen bleiben.
Ansatz: Diverse Verarbeitungsschritte erzeugen für mich 3 Listen. Jeweils eine Liste mit x und y Koordinaten (sortiert nach der Zeit, wann sie duchfahren werden sollen) und eine t-Liste, die die passenden Zeiten meiner Koordinaten enthält. Die Listen sind richtig, das konnte ich mehrfach bestätigen.
Mein derzeitiger Ansatz funktioniert einigermaßen gut (quick and dirty). Ich habe einfach die interp1d-Funktion von scipy genutzt und jeweils x und y mit t interpoliert. Dieses Funktion generiert aus zwei eingegebenen Listen einen B-Spline. [ACHTUNG MATHE!] Das zu erwähnen ist wichtig, weil ein B-Spline die Eigenschaften hat, dass am Start- und Endpunkt die zweite Ableitung auf 0 gesetzt wird (Wendepunkt). Da es sich bei meinen Interpolationen um Weg-Zeit Zusammenhänge handelt, ist die zweite Ableitung meiner Funktion die Beschleunigung. So weit so gut. Allerdings ist die erste Ableitung, also die Geschwindigkeit viel wichtiger. Denn diese ist durch die Bedingung des B-Splines (meistens) am Start- und Endpunkt maximal und das geht gar nicht. Wie oben beschrieben, muss das Auto aus dem Stand losfahren und am Ende wieder anhalten. ein B-Spline erzeugt zwar eine schöne Kurve, jedoch muss ich viel tricksen, um es für meine Anwendung zu verwenden.
Aus diesem Grund habe ich meinen Start und Endpunkt 10 mal wiederholt (mit jeweils sehr kurzen zeitlichen Abständen). Das sorgt dafür, dass zumindest die Animation gut aussieht, die Diagramme der Verläufe (bei näherem hinsehen) allerdings nicht schön sind. Da es sich hierbei um ein wissenschaftliches Programm handeln soll, kann ich das nicht so stehen lassen. Daher...
Mein Problem: Ich möchte gerne eine Funktion finden, die all meine Wünsche beachtet (erste Ableitung am Start-/Endpunkt = 0, glatte Kurven, schnelle Berechnung). In der Mathematik wird sowas häufig als "Hermite Interpolation" bezeichnet. Es gibt auch einige Funktionen, jedoch kann ich keine dieser Funktionen in meinem Programm verwenden.
Ich bin auf scipy.inteprolate.PiecewisePolynomial gestoßen, leider habe ich das Problem, dass die Zeile
Code: Alles auswählen
from scipy.interpolate import PiecewisePolynomial
Vielen Dank
Z18Aplha