物理月球地球太阳系
Physical Moon Earth Sun System
您好,我编写这段代码是为了尝试模拟月球地球太阳系。我得到了一个地球的圆形轨道,但是月亮疯了。
是否有更好的方法在仍然使用 euler/leapfrog 方法的同时尝试并执行此操作?
我没有仔细检查您的代码或测试其行为,但众所周知,欧拉方法在此类模拟中获得能量,因此通常使用 "trapezoidal"。
https://en.wikipedia.org/wiki/Trapezoidal_rule
如果我理解正确,你的方法是位置和速度之间关系的二阶(我假设是为了避免能量增益)但它似乎是加速度和速度之间关系的一阶。
您也许可以保留蛙跳式设计(而不是梯形),但在尝试这样做时,您应该更好地使额外状态显式化以消除二阶导数的使用。
编辑:我重读了关于 leapfrog 的维基百科页面并重读了你的代码,很明显你没有使用 leapfrog(正如我之前所说,因为你只将它应用于 position\velocity 而不是 velocity\acceleration ).请注意,该页面还向您展示了如何针对加速度取决于位置而不是速度的情况(您所拥有的)简化 leapfrog 方程:
https://en.wikipedia.org/wiki/Leapfrog_integration
如果您想继续使用显式积分,也许您可以尝试使用 Runge Kutta 方法:https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
RK4通常就够了。
您好,我编写这段代码是为了尝试模拟月球地球太阳系。我得到了一个地球的圆形轨道,但是月亮疯了。
是否有更好的方法在仍然使用 euler/leapfrog 方法的同时尝试并执行此操作?
我没有仔细检查您的代码或测试其行为,但众所周知,欧拉方法在此类模拟中获得能量,因此通常使用 "trapezoidal"。
https://en.wikipedia.org/wiki/Trapezoidal_rule
如果我理解正确,你的方法是位置和速度之间关系的二阶(我假设是为了避免能量增益)但它似乎是加速度和速度之间关系的一阶。
您也许可以保留蛙跳式设计(而不是梯形),但在尝试这样做时,您应该更好地使额外状态显式化以消除二阶导数的使用。
编辑:我重读了关于 leapfrog 的维基百科页面并重读了你的代码,很明显你没有使用 leapfrog(正如我之前所说,因为你只将它应用于 position\velocity 而不是 velocity\acceleration ).请注意,该页面还向您展示了如何针对加速度取决于位置而不是速度的情况(您所拥有的)简化 leapfrog 方程: https://en.wikipedia.org/wiki/Leapfrog_integration
如果您想继续使用显式积分,也许您可以尝试使用 Runge Kutta 方法:https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods RK4通常就够了。