【问题标题】:Emulating MATLAB's ode15s in Python在 Python 中模拟 MATLAB 的 ode15s
【发布时间】:2014-08-17 16:03:09
【问题描述】:

我正在将模型从 MATLAB 转换为 Python。该模型的症结在于 MATLAB 的 ode15s。在 MATLAB 执行中,ode15s 有标准选项:

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

作为参考,y0 和 MODELfun 一样是一个向量(大小为 98)。

我的 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 的其余部分在每个步骤中都保持不变。有这样的经验吗?

【问题讨论】:

  • "...似乎无法正常工作。"那是什么意思?你有错误吗?意想不到的结果?请澄清。
  • 您确定您已将MODELfun 中的Matlab 代码正确翻译成Python 吗? (仔细检查代码,并通过选择一些随机时间和参数值进行验证,并检查函数 MODELfunModel.fun 是否给出相同的结果。)

标签: python matlab scipy ode integrate


【解决方案1】:

需要明确的一点是,与 Matlab 的 ode15s 不同,scipy 积分器“vode”不支持具有质量矩阵的模型。因此,任何建议都应包含此警告。

【讨论】:

    【解决方案2】:

    根据SciPy wiki for Matlab Users,正确使用ode15s的方法是

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

    【讨论】:

    • 方法部分合理; order 参数没有任何意义。 VODE 没有实现大于 5 阶的 BDF 方法;对于大于 6 阶的 BDF 方法,该方法不是零稳定的,因此数值解对于初始条件下的扰动是不稳定的。省略order 参数可能没问题,因为ode15s 使用类似的方法系列(NDF 或BDF)。
    • Wiki 链接已过期
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2013-06-19
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多