使用scipy求解ODE系统时可否为不同方程设置不同容差
不同状态变量设置独立绝对容差的实现方法
solve_ivp原生支持为不同状态变量设置不同的绝对容差,无需额外改造求解器逻辑,DOP853求解器也完全兼容该特性,具体操作如下:
- 直接给
atol参数传入和状态变量维度一致的数组即可,数组的每个元素对应相同索引位置状态变量的绝对容差。你当前求解2个耦合微分方程,状态变量维度为2,直接传入长度为2的数组即可。
示例调用代码:
from scipy.integrate import solve_ivp # 自定义的2耦合微分方程,可替换为你自己的方程逻辑 def coupled_ode(t, y): dy0 = -0.3 * y[0] + 0.2 * y[1] dy1 = 0.2 * y[0] - 0.3 * y[1] return [dy0, dy1] t_span = (0, 20) init_val = [2, 0] # 分别为第1、第2个状态变量设置1e-8、1e-5的绝对容差 res = solve_ivp( fun=coupled_ode, t_span=t_span, y0=init_val, method="DOP853", rtol=1e-6, atol=[1e-8, 1e-5] # 核心:传入数组形式的atol )
注意事项
- 传入的
atol数组长度必须和你的状态变量维度完全一致,否则会触发参数校验报错 - 该特性对所有
solve_ivp内置求解器均生效,后续如果扩展到更多耦合方程,只要对应调整atol数组的长度和各位置容差值即可
内容的提问来源于stack exchange,提问作者Djridoo
相关产品推荐
相关产品推荐

