我是Python的新手并且已经生成了以下代码,但它无法正常工作。
此代码试图以接近y
和x
距离(即2维空间)的方式映射接近火星的卫星的运动。目前,火星被认为是静止的。
import scipy as sp
import numpy as np
import pylab as pl
import scipy.integrate as spi
G=6.67*(10**-11)
mm=6.4*(10**23)
#^mm is the mass of mars and G is the gravitational constant
def f(b,t):
xx=b[0]
vx=b[1]
yy=b[2]
vy=b[3]
ax=-(G*mm*b[0])/((b[0]**2) + (b[2]**2))**1.5
ay=-(G*mm*b[2])/((b[0]**2) + (b[2]**2))**1.5
return [vx,ax,vy,ay]
t=sp.linspace(0.,10000000.,1000)
xx0=[800000., 0., 10000, 0]
soln=spi.odeint(f,xx0,t)
print soln
x=soln[:,0]
v1=soln[:,1]
y=soln[:,2]
v2=soln[:,3]
pl.figure(1)
pl.plot(x,y)
pl.xlabel("x displacement")
pl.ylabel("y displacement")
pl.show()
这绘制了一条直线图...也许我误解了物理学,但代码是否有问题?
仅供参考 - 我使用牛顿万有引力定律和几何定律计算了加速度方程。我主要是询问代码中的问题,但如果有任何物理学家注意到物理学中的任何问题,那么我很乐意听到它们!
答案 0 :(得分:3)
如果它让你安心,我检查了方程式并且它们是正确的(并不是你有任何理由怀疑自己)。 :)
我认为事情出错的原因首先是,如果你需要对初始条件非常小心G * mm~10**10
这么大的数量,那么初始条件的一个数量级差异可能是卫星之间的差异轨道上的火星和太阳系外的火星。其次,即使找到一个明智的解决方案(我相信你的初始条件),一旦方程式接近(x=0, y=0
),事情变得奇异,你最终得到巨大的加速度,导致卫星迅速消失在当地规模。
要解决此问题,您可以在x,y不接近零的函数中进行合适的检查,如果是,则以某种方式结束ode求解器。
其次,在解决此类问题时,使用nondimensionalisation是明智的。这是一种重新缩放因变量(x->x', y->y')
的方法,使得引用的版本具有单位整数。
在你的情况下,我会忽略时间坐标并让它 x = x' * L. y = y' * L
其中L是特征长度尺度。如果您在等式中替换它,您将得到一个术语G * mm / L**3
。设置特征长度,使此数量为单位:L = (G * mm)**(1/3.0)
。
这样做的好处是,求解器会更容易处理数字,从而提高速度。现在唯一的困难是设置合适的初始条件,这是通过简单地采用合理的值来完成的,例如xx = 10km并重新缩放xx' = xx / L等。
使用这种方法,我可以让你的代码做一个很好的轨道。