在Python中模拟MATLAB的ode15s

4 投票
2 回答
6362 浏览
提问于 2025-04-18 11:13

我正在把一个模型从MATLAB转到Python。这个模型的关键部分是MATLAB里的ode15s。在MATLAB执行时,ode15s有一些标准的选项:

options = odeset()
[t P] = ode15s(@MODELfun, tspan, y0, options, params)

为了说明,y0是一个大小为98的向量,MODELfun也是。

我在Python中尝试做一个类似的实现,代码如下:

ode15s = scipy.integrate.ode(Model.fun)
ode15s.set_integrator('vode', method = 'bdf', order = 15)
ode15s.set_initial_value(y0).set_f_params(params)
dt = 1 
while ode15s.successful() and ode15s.t < duration:
     ode15s.integrate(ode15s.t+dt)

不过,这个似乎不太好用。有没有什么建议,或者其他的替代方案?

补充说明: 在查看输出后,我发现Python得到的结果是y0中的某些元素在一段时间内没有变化,或者其余的y0在每一步都有恒定的变化。有没有人遇到过类似的情况?

2 个回答

1

需要明确的一点是,和Matlab的ode15s不同,scipy的积分器'vode'不支持带有质量矩阵的模型。所以任何建议都应该包含这个注意事项。

2

根据SciPy为Matlab用户提供的维基,使用ode15s的正确方法是

scipy.integrate.ode(f).set_integrator('vode', method='bdf', order=15)

撰写回答