地球和月球计算机模拟

计算科学 模拟
2021-12-21 04:04:35

编辑:我制作了一个有 2 个身体的测试模型。太阳和地球或 w/e。但是我现在每次坐标之一为零时都会遇到零除法的问题。

import numpy as np
from numpy import exp, sqrt, pi, linspace
from time import clock,time
import pylab as pylab

S1 = 1E3                   #Mass Star
M1 = 1                     #Mass Planet


Rs = np.array([0, 0])      #position
R1 = np.array([0,200])

Vs = np.array([0,0])       #velocity
V1 = np.array([10,0])

As = np.array([0,0])       #acceleration
A1 = np.array([0,0])


dt = 0.1                   #timestep
N = 1000                   #steps
G = 1                       #G const

for i in range(1,N):

    deltaR = Rs - R1
    Rsq = deltaR**2
    F12 = -G*M1*S1/(Rsq) 
    F21 = -F12

    As = F21/S1
    A1 = F12/M1

    Vs += As*dt
    V1 += A1*dt

    Rs += Vs*dt + 0.5*As*dt**2
    R1 += V1*dt + 0.5*A1*dt**2

    x = [ Rs[0], R1[0]]
    y = [ Rs[0], R1[0]]
    pylab.ion()
    pylab.scatter( x, y )
    pylab.axis([-200, 200, -200, 200])
    pylab.plot
    pylab.clf()

有小费吗?

所以我想模拟太阳系,但想从一个轨道物体开始。但是,我以前从未做过这样的事情,并且想知道这里是否有人可以给我一些提示。

显然,我们需要使用的第一件事是万有引力定律和开普勒定律。然后我想把所有东西都放入一个数组中,然后计算时间步长。但是,我不确定如何将行星/月球的位置作为时间的函数。(我可以通过万有引力定律整合加速度吗?)

2个回答

对于这类问题,越级时间积分法是一个不错的选择,详见此处

如果你想从简单开始,你可以使用简单的运动学:

a(t)=Gravity[x(t)]v(t+Δt)=v(t)+a(t)Δtx(t+Δt)=x(t)+v(t)Δt+a(t)(Δt)2/2
这应该给你一些看起来不错的小时间步长,Δt, 持续时间短。我还认为它有助于展示连续物理和显式方法之间的联系。

由于各种原因,像这样的简单方法无法长期有效。对于定量有效的方案,请查看问题的评论或不同的答案。