我只有一小段代码试图运行ODE。首先,我定义一些常量和数组,这些常量和数组应使用for循环中的计算值填充。我定义了一个方程式位于其中的函数,当我运行代码时,我得到了
错误:该函数及其Jacobian函数必须是可调用函数。
它向我显示第17行是问题。
我尝试以不同的方式定义变量,因此前面提到的float Typeerror不会有问题,但这没有帮助。现在我不确定该错误消息的实际含义。
tOut = np.linspace(t0,tmax,33)
t = tOut[0] #starting point
K = 0.17
r = 3.25
k = 0.24
P = np.array([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,0,0,0,0,0,0,0])
d_P_dt = np.array([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,0,0,0,0,0,0,0])
P0 = 1
def fun(K,r,k,tOut):
for i in np.arange(0, 33):
d_P_dt[i] = (K-k)*P[i]
d_P_dt[i+1] = P[i]
return d_P_dt
yx = spi.odeint(fun(K,r,k,tOut),P0,tOut)
答案 0 :(得分:0)
Odeint需要一个函数句柄,该句柄只是函数fun
的名称和函数参数的数组。因此,集成调用应为:yx = spi.odeint(fun,P0,tOut)
,其中P0 = np.array([K, r, k])
。因此,正确的代码应如下所示:
P0 = np.array([K,r,k])
def fun(parameters,t):
K,r,k = parameters[0], parameters[1],parameters[2]
for i in np.arange(0, 33):
d_P_dt[i] = (K-k)*P[i]
d_P_dt[i+1] = P[i]
return d_P_dt
yx = spi.odeint(fun,P0,tOut)
答案 1 :(得分:0)
我建议您阅读odeint文档,因为使用错误。为了将参数传递给函数,您必须将其放入odeint内部的args
参数中,例如odeint(fun,P0,tOut,args = (K,r,k,))
。这就是您的代码给您带来Jacobian错误的方式。我已经整理了一下您的代码,这样就可以了
import scipy as spi
from scipy.integrate import odeint
import numpy as np
t0 = 0
tmax = 2
tOut = np.linspace(t0,tmax,33)
K = 0.17
r = 3.25
k = 0.24
P0 = 1
def fun(P,K,r,k,t):
d_P_dt = (K-k)*P
return d_P_dt
P = odeint(fun,P0,tOut,args = (K,r,k,))
如果您还想要dPdt,则可以使用dP_dt = (K-k)*P
来获取。