调用solve_ivp报错TypeError: 'numpy.ndarray' object is not callable如何解决
问题定位
- 数组索引语法错误:numpy数组取元素需使用方括号
[],你代码中x(0)、x(1)使用了函数调用的圆括号语法,而solve_ivp传入的状态变量x是numpy.ndarray类型,不是可调用对象,这是触发TypeError: 'numpy.ndarray' object is not callable的直接原因。 - 初始状态维度不匹配:你定义的初始值
x_0 = np.zeros([0,])是长度为0的空数组,但你的微分方程包含2个状态变量,初始值必须为长度为2的数组。 - 返回值维度冗余:
eqs函数返回的数组多嵌套了一层方括号,solve_ivp要求微分方程返回一维数组,当前返回的二维列向量会触发后续维度不匹配错误。 - 模块命名冲突:代码中
int.solve_ivp的int是Python内置的整数类型,你需要修正scipy.integrate模块的导入命名,同时需要显式导入numpy。
修复后的完整代码
import numpy as np from scipy.integrate import solve_ivp # 阈值判断函数 f = lambda x, thresh: x >= thresh # 时间窗函数,t在[2,4]区间返回1,否则返回0 z = lambda t: np.multiply((t >= 2), (t <= 4)) # 阈值参数 z_thresh = 0.5 y_thresh = 0.5 x_thresh = 0.5 def eqs(t, x): # 修正数组索引为方括号,返回一维数组 return np.array([ (1 - np.multiply((1 - f(z(t), z_thresh)), (1 - f(x[1], y_thresh)))) - x[0], (1 - np.multiply((1 - f(z(t), z_thresh)), (1 - f(x[0], x_thresh)))) - x[1] ]) # 初始值改为长度为2的数组 x_0 = np.array([0.0, 0.0]) # 调用solve_ivp,时间范围为[0,6] sol = solve_ivp(eqs, [0, 6], x_0)
内容的提问来源于stack exchange,提问作者csekedat
相关产品推荐
相关产品推荐

