首页 > 解决方案 > 求解 ODE 时出错:函数及其雅可比矩阵必须是可调用函数

问题描述

我有一小段代码尝试运行 ODE。首先,我定义了一些常量和数组,这些常量和数组应该用 for 循环中的计算值填充。我定义了一个方程在里面的函数,当我运行代码时,我得到一个

错误:函数及其雅可比必须是可调用函数。

它向我显示第 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)

标签: pythontypeerrorodeint

解决方案


我建议你阅读odeint文档,你用错了。为了将参数传递给函数,您必须将它们放在argsodeint 内部的参数中,有些像这样odeint(fun,P0,tOut,args = (K,r,k,))。这就是你的代码给你雅可比错误的方式。我已经清理了一点你的代码,所以这应该可以工作

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.


推荐阅读