Numerische Integration Bewegungsgleichung

Hallo,

ich habe eine Beschleunigung in Abhängigkeit von Ort und Zeit a(x,t) gegeben.
Daraus möchte ich auf die Position integrieren.

Ich habe mir selber etwas gebaut, was ganz gut funktioniert, aber wie wird sowas
„professionell“ gemacht? Habt ihr vllt einen guten Link für mich wo sowas erklärt wird?

Grüße
Huddi

Mein (simpler) Ansatz bisher, falls es jemanden interessiert:

a2 = a1 // wird am Anfang gesetzt, da a2 noch unbekannt

Folgendes wird dann einige male wiederholt:

  1. dv = (a1 + a2)/2*step;
  2. v2 = v1+dv
  3. dx = (v1+v2)/2 * step
  4. a2 = a(t2,x1+dx)

x: Position
v: Geschwindigkeit
a: Beschleunigung
d: delta, also die Veränderung zum nächsten Punkt
1: aktueller Punkt
2: vorherzusagender Punkt
step: Zeit Schrittweite

Hi,

Dein Vorgehen nennt sich Euler-Trapez-Verfahren oder Heun-Verfahren (als Variante des allgemeinen Runge-Kutta-Schemas).

Je nach Anwendung ist das schon ein ausreichend gutes Verfahren. Es hat Ordnung 2, d.h., mit einer Schrittweite von 10^-3 kann man 5-6 Stellen Genauigkeit im Ergebnis erwarten.

Als bester Kompromiss zwischen gerade noch verständlicher Komplexität und erreichbarer Genauigkeit hat sich das klassische Runge-Kutta-Verfahren (Ordnung 4) etabliert bzw. nie verdrängen lassen.

Alternativ gibt es Mehrschritt-Verfahren, die den nächsten Punkt als Extrapolation aus den Daten mehrerer vergangener Punkte bestimmt.

Gruß, Lutz

Zusatz: Dein Verfahren ist nicht das Heun-Verfahren in Reinform, da müssten einige Schritte vertauscht werden. Es gibt gewisse Anklänge an das Verlet-Verfahren, genauer die Variante Velocity-Verlet.

Um auszuprobieren, wie gut Dein Verfahren ist, rechne denselben gesamten Zeitschritt mit unterschiedlichen Schrittweiten 0.1, 0.01, 0.001, 0.0001 oder in der Folge 0.2, 0.1, 0.05, 0.025, 0.0125 aus. Die Verhältnisse der Differenzen der Ergebnisse zu aufeinanderfolgenden Schrittweiten sollten sich quadratisch zu den Verhälnissen der Schrittweiten, also wie 1/100 oder 1/4, verhalten.

Bei kleineren Schrittweiten macht sich zunehmend die Akkumulation von Rundungsfehlern bemerkbar.

Gruß, Lutz

Als bester Kompromiss zwischen gerade noch verständlicher
Komplexität und erreichbarer Genauigkeit hat sich das
klassische Runge-Kutta-Verfahren (Ordnung 4) etabliert bzw.
nie verdrängen lassen.

Um das im vorliegenden Fall anzuwenden, müsste man aber erst einmal ein Differentialgleichungssystem erster Ordnung basteln. Da ist der Runge-Kutta-Nyström deutlich bequemer:

http://theory.gsi.de/~vanhees/faq/gravitation/node62…

Wenn es nicht so genau sein muss, aber dafür schnellgehen soll, nehme ich auch gern den Geschwindigkeits-Störmer-Verlet:

x_{k + 1} = x_k + \Delta t \cdot v_k + {\textstyle{1 \over 2}}\Delta t^2 \cdot a\left( {t_k ,x_k } \right)
v_{k + 1} = v_k + {\textstyle{1 \over 2}}\Delta t \cdot \left[{a\left( {t_k ,x_k } \right) + a\left( {t_{k + 1} ,x_{k + 1} } \right)} \right]

Der hat den besonderen Vorteil energieerhaltend zu sein.

Die Fragestellung hat durch Einführung der Geschwindigkeit das Problem schon auf ein System erster Ordnung zurückgeführt.

Verlet ist, unter allen Verfahren zweiter Ordnung, das günstigste, wenn denn die exakte Lösung der Differentialgleichung auch energieerhaltend ist. Das läßt sich aus der Fragestellung, die ja eine zeitabhängige Beschleunigung vorsieht, nicht ablesen.

Übrigens ist das mit der Energieerhaltung nicht ganz so einfach, selbst die Kurzversion, die ich dazu in den Wikipedia-Artikel geschrieben habe, Hairer et.al. folgend, wurde kürzlich als so nicht haltbar kritisiert.

Und um vollständig den Horizont des Fragestellers zu verlassen: Was hältst Du von den Beeman-Verfahren, den originalen wie der oft gebrauchten Kurzfassung?

Gruß, Lutz

Danke für die Tipps, das Stichwort war das Runge-Kutta-Verfahren.
Unter dem Überbegriff „Anfangswertproblem“ habe ich jetzt auch einiges gefunden.

Grüße
Huddi