6

我有一个大学项目,我们被要求使用ODE和SciPy的odeint函数来模拟火星的卫星方法。解决ODE的python时的错误

我设法通过将二阶ODE分解为两个一阶ODE来模拟2D。然而,由于我的代码使用SI单元,因此我停留在时间限制内,因此在几秒钟内运行,而Python的内部空间限制甚至不能模拟一个完整的轨道。

我试着将变量和常量转换成小时和公里,但现在代码不断给出错误。

我跟着这个方法:

http://bulldog2.redlands.edu/facultyfolder/deweerd/tutorials/Tutorial-ODEs.pdf

而且代码:

import numpy 

import scipy 

from scipy.integrate import odeint 

def deriv_x(x,t): 
    return array([ x[1], -55.3E10/(x[0])**2 ]) #55.3E10 is the value for G*M in km and hours 

xinit = array([0,5251]) # this is the velocity for an orbit of period 24 hours 

t=linspace(0,24.0,100) 

x=odeint(deriv_x, xinit, t) 

def deriv_y(y,t): 
    return array([ y[1], -55.3E10/(y[0])**2 ]) 

yinit = array([20056,0]) # this is the radius for an orbit of period 24 hours 

t=linspace(0,24.0,100) 

y=odeint(deriv_y, yinit, t) 

我不知道如何复制/粘贴PyLab错误代码,所以我花了PRINTSCREEN的错误:

Error when running odeint for x

第二误差具有t = linspace(0.01,24.0,100)和xinit的=阵列([0.001,5251):

Second type of error

如果任何人有关于如何提高代码任何建议我会很感激。

非常感谢!

+1

您将需要显示您所得到的确切错误。 – BrenBarn

+0

我刚编辑原帖。谢谢! – user1937000

+2

是否重要 deriv_x(xinit,0) 未定义。 –

回答

5
odeint(deriv_x, xinit, t) 

使用xinit作为其x初始猜测。评估deriv_x时使用x的此值。

deriv_x(xinit, t) 

提出了一个除以零错误,因为x[0] = xinit[0]等于0,和deriv_x除以x[0]


看起来你正在试图解决的二阶ODE

r'' = - C rhat 
     --------- 
     |r|**2 

其中RHAT是在径向方向上的单位向量。

您似乎分离xy坐标转换为单独的二阶ODES:

x'' = - C    y'' = - C 
     ----- and   ----- 
     x**2     y**2 

初始条件X0 = 0和Y0 = 20056.

这是非常成问题的。其中的问题是,当x0 = 0x''爆炸。 r''的原始二阶ODE不存在此问题 - 因为y0 = 20056,因此r0 = (x**2+y**2)**(1/2)远离零,因此分母不会爆炸x0 = 0

结论:将r'' ODE划分为x''y''的两个ODE的方法不正确。

尝试搜索以不同方式解决r'' ODE。

提示:

  • ,如果你的 “状态” 向量是什么z = [x, y, x', y']
  • 你能写下的xyx'y'条款z'一阶微分方程?
  • 你能解决吗一个打电话给integrate.odeint
+0

非常感谢您的回复! 我相信这正是错误的来源。不过,我修改了t和xinit,如原始帖子中的第二张图片所示,但仍然出现错误。 你有什么建议如何解决这个问题? 对于相当明显的问题抱歉,我对Python和编程一般都很陌生,而且我的课程教学也不是很好...... 再次感谢! – user1937000