首页 文章

odeint中的“'float'不可订阅”

提问于
浏览
1

我正在尝试在Python中实现耦合微分方程,作为一个新用户,我似乎陷入了困境 . 我使用这个tutorial作为如何解决我的ODE的指南,并查看documentation没有可用

这是我定义函数的地方

def Burnout(t, y, m, nu, S0, V, delta, mu):
    S = y[0];

    E = [0 for i in range(0,m)]
    dEdt = [0 for i in range(0,m)]

    for i in range(0,m):
        E.append(y[i+1])

    P = y[m+1]

    dSdt = -nu*S*P*(S/S0)**V
    dEdt.append(nu*S*P*(S/S0)**V-m*delta*E[0])

    for i in range(1,m):
        dEdt.append(m*delta*E[i-1]-m*delta*E[i])

    dPdt = m*delta*E[m-1]-mu*P

    return [dSdt, *dEdt[0:m], dPdt]

然后,如在教程中,我通过定义初始条件

S0 = N
 y0.append(S0)

 for i in range (0, m):
    E.append(0)
    y0.append(E[i])

 P0 = Z
 y0.append(P0)

其中N和Z是先前定义的东西,E是一个空数组 . 当我最终调用odeint(Burnout,y0,t,args = p)时,我得到一个'float'对象是不可订阅的,指向我在Burnout函数中对S的定义 . 当我将列表传递给odeint时,我对Python为何说我传递了一个浮点数感到困惑 . 有谁看到我做错了什么?提前致谢!

编辑:好的,现在这里是一个最小,完整和可验证的例子,给我同样的错误

从scipy.integrate import odeint导入numpy as np

def Burnout(t, y, m, nu, S0, V, delta, mu):

    S = y[0]

    E = [0 for i in range(0,m)]
    dEdt = [0 for i in range(0,m)]

    for i in range(0,m):
        E.append(y[i+1])

    P = y[m+1]

    dSdt = -nu*S*P*(S/S0)**V
    dEdt.append(nu*S*P*(S/S0)**V-m*delta*E[0])

    for i in range(1,m):
        dEdt.append(m*delta*E[i-1]-m*delta*E[i])

    dPdt = m*delta*E[m-1]-mu*P

    return [dSdt, *dEdt[0:m], dPdt]


V = 2.97
m = 26
delta = 1/6
mu = 1
nu = 10
S0 = 5

t = np.linspace(0,56,100)

y = [10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100]
p = (m, nu, V, S0, delta, mu)
print(odeint(Burnout,y,t,args=p))

1 回答

  • 0

    您在ode定义中对参数进行了错误排序 . 在 y 之前可以有 t ,但是你必须定义 tfirst = True (see docs) .

    交换 Burnout 定义中的参数可以解决我的问题 .

    def Burnout(y, t, m, nu, S0, V, delta, mu):
       # ...
       # rest of function
       # ...
    

    或者,您可以在 odeint 调用中定义其他关键字 tfirst

    odeint(Burnout, y, t, args=p, tfirst=True)
    

相关问题