我试图在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为何说我传递了一个浮点数感到困惑。有谁看到我做错了什么?提前谢谢!
编辑:好的,现在这里是一个最小,完整且可验证的示例,它给出了同样的错误
将numpy导入为np 来自scipy.integrate import odeint
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))
答案 0 :(得分:0)
您订购了ode定义中的参数是错误的。在t
之前可以y
,但您必须定义tfirst = True
(see docs)。
交换Burnout
定义中的参数可以解决我的问题。
def Burnout(y, t, m, nu, S0, V, delta, mu):
# ...
# rest of function
# ...
或者,您可以在tfirst
来电中定义其他关键字odeint
:
odeint(Burnout, y, t, args=p, tfirst=True)