Ich erstelle einen einfachen Astronomiesimulator, der die Newtonsche Physik verwenden soll, um die Bewegung von Planeten in einem System (oder anderen Objekten) zu simulieren. Alle Körper sind Kreise in einer euklidischen Ebene mit Eigenschaften wie Position, Geschwindigkeit, Masse, Radius und der resultierenden Kraft.
Ich möchte das Universum in kleinen Zeitschritten aktualisieren, normalerweise in wenigen Millisekunden, bin mir aber nicht sicher, wie ich die Positionsänderungen korrekt berechnen soll.
Die Kraft ist einfach: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)
.
Aber wie gehe ich von dort aus weiter?
Ich könnte das machen:
a = Fr/body.m
v += a*dt
position += v*dt
Aber das wäre natürlich falsch. Vielleicht, wenn ich 0,5 als Faktor für die Positionsberechnung hinzufüge?
time-integration
jcora
quelle
quelle
Antworten:
Sie haben im Wesentlichen die Antwort - keine Notwendigkeit für den Faktor 0,5.
Im Wesentlichen haben Sie ein zweidimensionales System von ODEs erster Ordnung: wobei alles eine Funktion der Zeit ist, außer vermutlichm, und Punkte Zeitableitungen bezeichnen. Wenn Sie eine einfache, vorwärts Euler-ähnliche Differenzierung erster Ordnung von diesen durchführen, finden Sie x n + 1 -xn
Forward-Euler ist jedoch von Natur aus instabil. Glücklicherweise gibt es gleich um die Ecke eine symplektische Methode . (Das verbundene Artikel mehr ein Stub ist, aber es könnte einige nützlichen Verbindungen enthalten.) Der Schlüssel ist , um vorab Positionen von bis t n + 1 Geschwindigkeiten bei Verwendung von t n + 1 / 2 . Das heißt, angenommen , Sie erhielten x 0 und v 1 / 2 für jedes Teilchen. Dann könnten Sie x n + 1 verwendentn tn + 1 tn + 1 / 2 x0 v1 / 2
quelle
0.5
Faktor nicht brauche ? Es scheint dasselbe zu tun, als würde man die Geschwindigkeit vorn-1/2dt
Sekunden messen, wie es scheint, als würden Sie vorschlagen.