Je crée un simulateur d'astronomie simple qui devrait utiliser la physique newtonienne pour simuler le mouvement des planètes dans un système (ou tout autre objet, d'ailleurs). Tous les corps sont des cercles dans un plan euclidien, qui ont des propriétés telles que la position, la vitesse, la masse, le rayon et la force résultante.
Je veux mettre à jour l'univers par petits pas de temps, généralement quelques millisecondes, mais je ne sais pas comment calculer correctement les changements de position.
La force est simple: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)
.
Mais comment dois-je continuer à partir de là?
Je pourrais faire ça:
a = Fr/body.m
v += a*dt
position += v*dt
Mais ce serait, bien sûr, faux. Peut-être que si j'ajoutais 0,5 comme facteur dans le calcul de la position?
la source
Réponses:
Vous avez essentiellement la réponse - pas besoin du facteur 0,5.
Essentiellement, vous avez un système bidimensionnel d'ODO de premier ordre: où tout est fonction du temps sauf vraisemblablementm, et les points désignent des dérivées temporelles. Si vous effectuez une différenciation simple et directe d'Euler-esque de ceux-ci, vous trouverez x n + 1 -xn
Cependant, forward-Euler est intrinsèquement instable. Heureusement, il existe une méthode symplectique au coin de la rue. (Cet article est lié plus d'un talon, mais il peut contenir des liens utiles.) La clé est de positions à l'avance de à t n + 1 en utilisant des vitesses à t n + 1 / 2 . C'est, supposons que vous avez reçu x 0 et v 1 / 2 pour chaque particule. Ensuite, vous pouvez utiliser x n + 1tn tn + 1 tn + 1 / deux X0 v1 / 2
la source
0.5
facteur? Il semble faire la même chose que de prendre de la vitessen-1/2dt
il y a quelques secondes, ce que vous semblez suggérer.