2017-09-27 117 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作爲方程爆炸,但是這是一個不同的故事)