You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过Scipy的solve_ivp单次求解多组初始条件与参数的常微分方程组?

能否单次调用solve_ivp求解多组初始条件与参数的ODE?

答案是可以通过合并ODE系统实现单次调用,但solve_ivp本身不支持直接传入多组初始条件/参数,需要手动将多个独立的ODE系统打包成一个高维系统来求解。

原理说明

每个Lotka-Volterra系统是相互独立的,我们可以把10个系统的状态(每个是2维向量)拼接成一个20维的总状态向量,然后在导数函数中对每个子系统单独计算导数,再拼接回总导数向量。参数也需要对应每个子系统的参数组。

具体实现代码

import numpy as np
from scipy.integrate import solve_ivp

# 定义适配多系统的导数函数
def batch_lotkavolterra(t, z, args_batch):
    # z是形状为(20,)的数组:[x1,y1,x2,y2,...,x10,y10]
    # args_batch是形状为(10,4)的数组,每行对应一个系统的(a,b,c,d)
    z_reshaped = z.reshape(-1, 2)  # 拆成(10,2)的子状态
    dx_dt = args_batch[:,0] * z_reshaped[:,0] - args_batch[:,1] * z_reshaped[:,0] * z_reshaped[:,1]
    dy_dt = -args_batch[:,2] * z_reshaped[:,1] + args_batch[:,3] * z_reshaped[:,0] * z_reshaped[:,1]
    # 拼接回一维数组返回
    return np.concatenate([dx_dt, dy_dt])

# 生成多组初始条件和参数
ICs = np.random.rand(10, 2)
args = np.random.rand(10, 4)

# 合并初始条件为一维数组
y0 = ICs.flatten()

# 单次调用solve_ivp
sol = solve_ivp(batch_lotkavolterra, [0, 15], y0, args=(args,), dense_output=True)

# 提取结果
t = np.linspace(0, 15, 300)
z_total = sol.sol(t)  # shape (20, 300)
# 拆分成10个系统的结果,每个系统是(2, 300)
z_systems = z_total.reshape(10, 2, -1)

# 比如查看第一个系统的x和y
first_system_x = z_systems[0, 0, :]
first_system_y = z_systems[0, 1, :]

注意事项

  • 所有子系统必须使用相同的时间区间、求解器方法和精度控制参数(如rtol、atol),如果不同系统需要不同设置,还是建议循环调用solve_ivp更灵活。
  • 合并后的系统维度更高,求解速度不一定比循环快,取决于求解器的内部优化和系统数量,实际使用时可以对比两种方式的效率。

内容的提问来源于stack exchange,提问作者tommy J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:32