【问题标题】:scipy.integrate.odeint time dependend stepsizescipy.integrate.odeint 时间相关步长
【发布时间】:2019-03-14 13:35:50
【问题描述】:

我有以下问题:

我必须使用 ode-solver 来求解化学反应方程式。速率常数是时间的函数,可以突然变化(放电脉冲)。

解决这个问题的一种方法是保持步长非常小hmax < dt。这导致高补偿。 afort -> 耗时。我的问题是:有没有一种有效的方法来完成这项工作?我想def hmax(puls_ON)plus_ON=True 在脉冲内和plus_ON=False 之间。然而,由于 dt 随时间增加,它甚至可能无法识别脉冲,因为时间间隔在增加 hmax=hmax(t)。

时间网格将是我认为的最佳选择,但我认为 odeint 不可能做到这一点?

或者是否有可能以某种方式强制求解器在特定时间点进行积分(例如 t0 ->(hmax=False)->tpuls_1_start->(hmax=dt)->tpuls_1_end->(hmax=False) ->puls_2_start.....)?

谢谢

【问题讨论】:

    标签: scipy integrate odeint timestep


    【解决方案1】:

    odeint 有一个可选参数 tcrit,您可以尝试:

    应注意积分的关键点向量(例如奇点)。

    我不知道它实际上做了什么,但它可能有助于不要简单地步入脉搏。

    如果这不起作用,您当然可以手动将集成拆分为不同的时间间隔。集成直到您的tpuls_1_start。然后使用前一个结果作为初始值重新开始集成。

    【讨论】:

    • 感谢 tcrit 的建议。但是,odeint 似乎不是解决此问题的最佳方法。我在 scipy 页面上发现他们现在建议使用 scipy.integrate.solve_ivp 而不是 odeint?最后,我认为 VODE 应该是此类 ODE 问题的最佳选择,因为其他等离子体化学求解器也使用它。集成 ode 具有 VODE,但它也很快吗? (比较到 odenit)。你/任何人都知道一些例子,如何使用它。这似乎更棘手(必须计算 jacobi ......)?我的 odeint 需要很多参数,因为 df(t) 取决于许多时间相关参数!
    • 如果您需要雅可比矩阵,您可能想看看如何用符号表示您的 ODE 并使用 sympy 计算雅可比矩阵。然后可以将符号表达式转换为 python 函数。 Here 是一个示例(使用 odeint,但应该与其他求解器类似)。
    猜你喜欢
    • 2018-02-25
    • 2017-10-25
    • 2019-05-22
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2018-05-24
    • 2010-12-05
    相关资源
    最近更新 更多