解决ODE时出错:该函数及其Jacobian函数必须是可调用函数

时间:2019-08-08 08:33:54

标签: python typeerror odeint

我只有一小段代码试图运行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)

2 个答案:

答案 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来获取。