【问题标题】:Integration issue with ODEINT in pythonpython中ODEINT的集成问题
【发布时间】:2017-09-27 09:41:45
【问题描述】:

我正在尝试使用 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 的一组值。

【问题讨论】:

  • 你能添加必要的导入吗?

标签: python python-2.7 integration odeint


【解决方案1】:

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

通过不明智地选择变量命名,您为自己设置了一个陷阱。在d_displ x 是一个数组,而不是你的值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,但那是另一回事)

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2016-04-28
    • 2014-05-26
    • 2017-08-12
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多