Python 2.7 Runge Kutta Orbit GUI

时间:2016-12-01 20:42:37

标签: python-2.7 runge-kutta orbital-mechanics

我正在尝试使用Tkinter在Python中创建一个GUI,它使用Runge-Kutta方法绘制质量的轨道路径。我的GUI工作正常但我的问题是它只绘制一条直线,无论我输入GUI的值是什么。 我希望有人能在GUI中向我展示我的功能有什么问题,以便它能够正确地绘制轨道。

pairs(iris[,1:4])

1 个答案:

答案 0 :(得分:1)

你的物理错误。你对运动方程的处理是错误的。

力量计算为

Force = lambda pos: -G*m*M/(norm2(pos)**3)*pos

并且运动方程是

  

m·pos''(t)=强制(pos(t))

,其中

  

pos''(t)=d²/dt²pos(t)

您必须转换为一阶系统

[ pos' , vel' ] = [ vel, Force(pos)/m ]

对于这个第一个订单系统,您现在可以应用RK4方法。

    k1p = dt *       vel
    k1v = dt * Force(pos        ) / m
    k2p = dt *      (vel+0.5*k1v) 
    k2v = dt * Force(pos+0.5*k1p) / m 
    k3p = dt *      (vel+0.5*k2v) 
    k3v = dt * Force(pos+0.5*k2p) / m 
    k4p = dt *      (vel+    k3v)
    k4v = dt * Force(pos+    k3p) / m
    pos = pos + (k1p+2*k2p+2*k3p+k4p)/6.0 
    vel = vel + (k1v+2*k2v+2*k3v+k4v)/6.0 

注意k向量如何在位置和速度之间交错。

或者您可以使用

自动生成正确的RK4实现
System = lambda pos, vel : vel, Force(pos)/m

然后在时间循环内

    k1p, k1v = System( pos           , vel           )
    k2p, k2v = System( pos+0.5*k1p*dt, vel+0.5*k1v*dt )
    k3p, k3v = System( pos+0.5*k2p*dt, vel+0.5*k2v*dt )
    k3p, k3v = System( pos+    k3p*dt, vel+    k3v*dt )
    pos = pos + (k1p+2*k2p+2*k3p+k4p)*dt/6.0 
    vel = vel + (k1v+2*k2v+2*k3v+k4v)*dt/6.0 

如果您只是想要数值解决方案,即不必证明您可以实现RK4,那么请使用scipy.integrate.odescipy.integrate.odeint