python - 求解 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)
解决方案
我建议你阅读odeint文档,你用错了。为了将参数传递给函数,您必须将它们放在args
odeint 内部的参数中,有些像这样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
.
推荐阅读
- python - 使用递归或迭代方法在 Python 中构建嵌套的树状结构
- android - Firebase Recycler Adapter:调用 getItemViewType() 方法时应用程序崩溃
- python - Django pip 安装 mysqlclient 错误
- reactjs - 如何取消订阅componentwillunmount中的订阅和事件?
- docker - docker-compose ip/hostname for the host machine
- python - 使用用户定义的函数绘制导数
- c# - 实体框架通过包含查询具有相同列名的相关数据
- python - Python - ValueError:未转换的数据仍然存在:09
- vba - 使用宏在 Excel 中进行多选,如何取消选择选择
- html - 将UL的位置设置为固定,下拉菜单不起作用