我正在尝试使用牛顿第二定律来模拟太阳 - 地月系统。我可以让月球和地球在太阳周围平行旋转。但是月亮并没有围绕地球旋转。
我知道月亮和太阳之间以及月球和地球之间应该有吸引力。所以我加上了加速度。但在3D可视化中,似乎地球对月球没有影响。
任何人都可以在动作部分检查我的代码:
def movePlanets(self):
rate(200)
G = (6.673e-11)
dt = 12*3600 # half day
for p in self.planets:
p.moveTo((p.getXPos() + dt * p.getXVel()),
(p.getYPos() + dt * p.getYVel()),
(p.getZPos() + dt * p.getZVel()))
rx = self.thesun.getXPos() - p.getXPos()
ry = self.thesun.getYPos() - p.getYPos()
rz = self.thesun.getZPos() - p.getZPos()
r = math.sqrt(rx**2 + ry**2 + rz**2)
accx = G * self.thesun.getMass()*rx/r**3
accy = G * self.thesun.getMass()*ry/r**3
accz = G * self.thesun.getMass()*rz/r**3
for pTwo in self.planets:
if(pTwo != p):
rx = pTwo.getXPos() - p.getXPos()
ry = pTwo.getYPos() - p.getYPos()
rz = pTwo.getZPos() - p.getZPos()
r = math.sqrt(rx**2 + ry**2 + rz**2)
accx = accx + (G * pTwo.getMass()*rx/r**3)
accy = accy + (G * pTwo.getMass()*ry/r**3)
accz = accz + (G * pTwo.getMass()*rz/r**3)
p.setXVel(p.getXVel() + dt * accx)
p.setYVel(p.getYVel() + dt * accy)
p.setZVel(p.getZVel() + dt * accz)
非常感谢你!
答案 0 :(得分:1)
我已完成此模拟,我认为你没有使用足够的"物理学,使代码更容易理解。老实说,我无法理解你的代码。这是方法(正如我的物理学教授教我的那样):
:
while True:
for each "planet":
calculate net force (use the gravity formula)
update momentum: P = P + net_force*dt
update velocity: v = P/mass
update position: pos = pos + v*dt
注意:以下变量(属性)应为矢量类型,以便使用矢量运算符(加法,减法和标量乘法)进行简单计算:位置,速度和net_force
答案 1 :(得分:1)
我认为第三个明星'可以轻松添加:
from visual import *
G = 6.7e-11
giant = sphere(pos=(-1e11,0,0), radius=2e10, color=color.red,
make_trail=True, interval=10)
giant.mass = 2e30
giant.p = vector(0, 0, -1e4) * giant.mass
dwarf = sphere(pos=(1.5e11,0,0), radius=1e10, color=color.yellow,
make_trail=True, interval=10)
dwarf.mass = 1e30
dwarf.p = -giant.p
dt = 1e5
while True:
rate(200)
dist = dwarf.pos - giant.pos
force = G * giant.mass * dwarf.mass * dist / mag(dist)**3
giant.p = giant.p + force*dt
dwarf.p = dwarf.p - force*dt
for star in [giant, dwarf]:
star.pos = star.pos + star.p/star.mass * dt
我希望这个有帮助!