使用物理定律模拟轨道运动

5
在过去的几周里,我一直在尝试模拟太阳系中的轨道,这是我作为大学课程的一部分制作的太阳系模拟。简而言之,我的模拟是使用Ogre3D渲染引擎编写的C++代码。我尝试使用牛顿的普遍引力定律来实现轨道,但是行星会沿着一条直线朝向太阳,穿过太阳,然后回到起始位置。我也尝试了维基百科“时间函数”部分的步骤 article,但对我也没有用。
我使用简单的欧拉积分方法来驱动模拟。如果有人对这种模拟有任何经验,或者对这些物理定律有很多了解,那么任何帮助或指导都将不胜感激。

2
这里确实有很多专业人士,但是除非你提出更具体的问题,否则他们几乎肯定无法帮助你。请发布您的代码/算法,最好作为SSCCE格式。 - TypeIA
5
行星静止时会准确地坠入太阳,它们需要一定的轨道速度来产生离心力以“抵消”引力。 - Agent_L
@Agent_L:胡说八道。你不需要离心力来解释轨道。在我看来,引用离心力来解释轨道是一种非常糟糕的方式。 - David Hammen
1
用户2484294 - 一颗直线朝向太阳的行星很快就会成为一颗前行星。这不是行星的本来面貌。它们有一个切向速度。它们非常接近于沿着椭圆轨道运动。它们主要因与其他行星的相互作用而偏离椭圆形。 - David Hammen
1
如果这只是用于可视化,欧拉方法就足够了。(我相信这不会成为即将到来的火星任务的基础...)正如其他人已经指出的那样,行星需要有初始速度。 - Aki Suihkonen
显示剩余2条评论
3个回答

11

请查看项目“星移斗转”,其中包含旧版 C 语言和现代化的 Ruby 版本。(现在还有一个 C++ 版本吗?)

简短建议:欧拉方法对于能量守恒不利。显式欧拉会增加能量,隐式欧拉会降低能量。只需在谐振子 y''+y=0 的相空间图中检查即可。

使用辛普勒克积分器,最简单和著名的是Leapfrog 或 Verlet 方法,牛顿已经用它来推理行星运动。


对于“移动星星”,我给一个赞。这确实是一篇关于模拟天体力学的精彩阅读。 - Hristo Iliev

6
你必须给行星一个初始速度v = (vx, vy, vz),使其切向所需轨道。如果太阳的位置是s,行星的位置是p,则两者之间始终存在作用力:行星上的力指向太阳,矢量t = (s-p),反之亦然。这种力的大小为g Ms Mp /(t点积t),其中“点”是点积,g是标准重力加速度,Ms,Mp是各自的质量。
如果您正在进行详细模型,其中所有物体都可以对所有其他物体施加牵引力,则算法是累积所有成对力以获得作用于每个物体(行星或太阳)的单个合力矢量。否则,您可能会接受近似值,在该近似值中,只有太阳对行星施加牵引力,而其他力被认为太小而无关紧要。
因此,算法如下:
Choose dt, the time step, a small interval.
Set initial positions and velocities 
    (for planets, velocity is tangent to desired orbit. Sun has velocity zero.)
loop
  Accumulate all forces on all bodies with current positions.
  For each body position=p, velocity=v, net resultant force=f, mass=m, 
    update its velocity: v_new = v + f / m dt
    update position p_new = p + 0.5 * (v + v_new) 
    v = v_new; p = p_new
  Render
end loop

正如先前所提到的,欧拉法简单易懂,但需要非常小的时间步长才能获得合理的精度。有时您可以在系统中引入一点点阻力(将速度乘以略低于1的因子),以使事物保持稳定,否则它们会崩溃。


这是二阶欧拉积分法吗?它看起来不像我一直使用的欧拉方法。 - user2484294
这是速度Verlet方法的一种实现。 - Lutz Lehmann

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接