2017-09-27 77 views
0

我想使用的代码整合问题与蟒蛇ODEINT

tmax,dt=5000,1.68 
t=linspace(0,tmax,num=round(tmax/dt)+1) 

def d_displ(x,t,a,b,c,d,e): 
    #x'=y, y'=a*x+(b/(x**2.0+c))*x+d*y+e 
    y=x[0] 
    dy=x[1] 
    dx=[dy,a*x+(b/(x**2.0+c))*x+d*y+e] 
    return dx 

def displ(d_displ,J_merger,a,b,c,d,e): 
    y0=[0.0,a] 
    sol=odeint(d_displ,y0,t,args=(a,b,c,d,e)) 
    return sol 

print displ(d_displ,J_merger,1.0,2.0,3.0,4.0,5.0) 

使用scipy功能odeint但我得到了错误

TypeError: float() argument must be a string or a number 

为什么呢?我想要的是一组x值。

+0

能否请你添加必要的进口? –

回答

0

首先,我没有得到使用J_merger这里,但无论如何:

通过可变的不明智的选择,请你设置了一个陷阱自己。在d_displx是一个数组,而不是你的值x(t)。所以你的第一个返回值是[float, array]而不是[float,float]。在第二次迭代中,因此odeint失败。

应该是这个样子

def d_displ(solList,t,a,b,c,d,e): 
    # we want x'' = a*x + b*x/(x**2+c)+d*x'+e 
    # set x'= u 
    # we get u'= a*x + b*x/(x**2+c)+d*u+e 
    # solList contains [x,u] 
    x,u=solList 
    dx=u 
    du= a*x + b*x/(x**2+c)+d*u+e 
    dsolList=[dx,du] 
    return dsolList 

和它的作品......(当然,没有达到5000作为方程爆炸,但是这是一个不同的故事)