SciPy的solve_ivp运行报错Values in `t_eval` are not properly sorted如何解决
scipy.integrate.solve_ivp 报错
t_eval未正确排序的解决方案 你遇到的报错是参数传递顺序错误导致的,scipy的solve_ivp位置参数顺序为fun, t_span, y0, method, t_eval, ...,你将自定义参数p放在了第五位,直接被识别为t_eval参数,程序对这个参数做排序校验时触发报错,和你t_span的排序没有任何关系。
需要修正的所有问题如下:
- 修正参数传递方式:自定义参数必须通过
args关键字参数传入,不能直接放位置参数里 - 给微分方程函数
pff补充return dy语句,返回导数计算结果 - 修正初始值
x_0的定义:你的方程是二维微分方程,初始值必须是长度为2的数组,你当前定义的是空数组,维度不匹配
修正后的完整可运行代码:
import numpy as np from scipy import integrate def pff(t, y, p): if (2 < t) and (t < 4): z = 1 else: z = 0 dy = np.zeros(2) dy[0]= (p[0] * (y[1] + z)**p[3]) / (1 + (y[1] + z)**p[3]) - (p[2] * y[0]) dy[1]= (p[1] * (y[0] + z)**p[3]) / (1 + (y[0] + z)**p[3]) - (p[2] * y[1]) return dy alpha = 2 beta = 2 gamma = .5 n = 2 k = 1 p = [gamma, k, n, alpha, beta] # 可根据需求修改初始值,此处以全0初始值为例 x_0 = np.zeros(2) t_span = [0, 20] # 自定义参数通过args关键字传入 sol = integrate.solve_ivp(pff, t_span, x_0, 'RK45', args=(p,))
如果需要输出指定时间点的计算结果,再显式传入排序后的t_eval参数即可,示例:sol = integrate.solve_ivp(pff, t_span, x_0, 'RK45', t_eval=np.linspace(0,20,100), args=(p,))
内容的提问来源于stack exchange,提问作者csekedat
相关产品推荐
相关产品推荐

