【问题标题】:`scipy.integrate.odeint` automatically adjusts time steps`scipy.integrate.odeint` 自动调整时间步长
【发布时间】:2018-02-25 02:03:35
【问题描述】:

我正在使用scipy.integrate.odeint 在空间和时间维度上求解 ODE(扩散方程)。我通过有限差分来表达空间导数,所以整个问题是一个时间问题。

求解器可以工作,但它似乎会自动调整时间间隔和总时间(而步数保持不变)。当我将结果与不调整时间间隔的简单 FCTS 方案进行比较时,它看起来总是不同的。

我意识到odeint 使用的实际时间步长是通过infodict['tcur'] 返回的。这是否意味着我总是必须针对这些时间绘制结果解决方案?为什么在 SciPy 文档中对此有不同的解释? (在示例中,他们针对参数t 进行绘图,即我传递给odeint 的初始时间。)

编辑:

最后,这是我的代码中的一个错误。我将时间步长的索引传递给odeint 例程,而不是时间步长本身。无论如何,谢谢你的解释。

【问题讨论】:

    标签: scipy ode


    【解决方案1】:

    odeint使用了两个时间步:

    • 采样步骤,是积分器返回结果给您的时间间隔。 这是由你控制的,通常你会等距离地选择它。

    • 积分步骤,是积分算法使用的时间离散化。 这是自动调整的,以确保(估计的)积分误差不会太高。 它的选择也使得采样步骤被准确地踩到(所以你在那里得到一个输出)。 一个采样步骤由不同数量的积分步骤组成,但至少有一个。 在大多数情况下,集成步骤是在集成商内部发生的事情,您无需处理任何事情。

    求解器可以工作,但它似乎会自动调整时间间隔和总时间(而步数保持不变)。

    情况不应该如此。 总时间和采样步骤应该始终是您在参数t 中指定的。 您的结果与 FCTS 方案的结果不同也可能是后者的错。 您可能想要进行的一项简单的完整性检查是降低准确度阈值(rtolatol),这将导致更小的集成步骤(除非您的采样步骤非常小)。 这应该不会显着影响您的结果。

    我意识到odeint 使用的实际时间步长是通过infodict['tcur'] 返回的。这是否意味着我总是必须针对这些时间绘制结果解决方案?

    不,在大多数情况下,infodict['tcur'] 会比您的解决方案更长,因为集成步骤多于采样步骤。 SciPy 文档是正确的。

    【讨论】:

    • 感谢您的回答。这听起来有道理。然而,我多次检查它,即使对于简单的扩散问题,它也给了我不同的结果,如 FTCS 和 Crank-Nicolson 方案。我还将采样时间步长更改为较低的值,但 odeint 不断给我一个不同的结果,我可以通过在 FTCS/CN 方案中增大时间步长来重现该结果。这很令人困惑......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多