我正在尝试使用Tkinter在Python中创建一个GUI,它使用Runge-Kutta方法绘制质量的轨道路径。我的GUI工作正常但我的问题是它只绘制一条直线,无论我输入GUI的值是什么。 我希望有人能在GUI中向我展示我的功能有什么问题,以便它能够正确地绘制轨道。
pairs(iris[,1:4])
答案 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.ode
或scipy.integrate.odeint
。