python中与ODEINT的集成问题

2024-04-19 16:18:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用scipy函数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)

但我错了

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

为什么?我想要的是x的一个值数组


Tags: 函数代码returndefdtscipymergerdy
1条回答
网友
1楼 · 发布于 2024-04-19 16:18:20

首先,我在这里没有使用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,但那是另一回事)

相关问题 更多 >