在Python中模拟MATLAB的ode15s
我正在把一个模型从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)