Jaki jest właściwy sposób włączenia do symulacji astronomicznych?

15

Tworzę prosty symulator astronomiczny, który powinien wykorzystywać fizykę newtonowską do symulacji ruchu planet w układzie (lub dowolnych obiektach, jeśli o to chodzi). Wszystkie ciała są okręgami na płaszczyźnie euklidesowej, które mają takie właściwości, jak położenie, prędkość, masa, promień i wynikowa siła.

Chcę aktualizować wszechświat w krótkich odstępach czasu, zwykle kilka milisekund, ale nie jestem pewien, jak poprawnie obliczyć zmiany położenia.

Siła jest prosta fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2).

Ale jak mam dalej?

Mógłbym to zrobić:

a = Fr/body.m
v += a*dt
position += v*dt

Ale to oczywiście byłoby fałszywe. Może gdybym dodał 0,5 jako czynnik do obliczania pozycji?

jcora
źródło
To zbyt zabawne, aby nie komentować: Rzeczywiście powszechnym problemem astronomicznym jest symulacja ruchu „roślin” ;-)
Wolfgang Bangerth

Odpowiedzi:

17

Zasadniczo masz odpowiedź - nie potrzebujesz współczynnika 0,5.

Zasadniczo masz dwuwymiarowy układ równań różniczkowych zwyczajnych pierwszego rzędu: gdzie wszystko jest funkcją czasu, z wyjątkiem przypuszczalniem, a kropki oznaczają pochodne czasu. Jeśli wykonasz proste różnicowanie pierwszego rzędu według esulera, znajdziesz x n + 1 -xn

x˙=vv˙=fam,
m lub xN+1
xn+1-xnΔt=vnvn+1-vnΔt=fanm,
Tutaj indeksuję znacznik czasu za pomocąn.
xn+1=xn+Δtvnvn+1=vn+Δtfanm.
n

tntn+1tn+1/2)x0v1/2)

xn+1=xn+Δtvn+1/2)vn+1/2)=vn-1/2)+Δtfanm

v1/2)v0

ω=solM.r3),
M.r

źródło
Hej, możesz wyjaśnić, dlaczego nie potrzebuję tego 0.5czynnika? Wydaje się, że robi to samo, co rejestrowanie prędkości n-1/2dtkilka sekund temu, co sugerujesz.
jcora
(n-1)vnvn+1vn0