`scipy.integrate.odeint`自动调整时间步长

时间:2017-09-15 20:24:14

标签: scipy ode

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

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

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

编辑:

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

1 个答案:

答案 0 :(得分:3)

odeint使用了两个时间步骤:

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

  • 集成步骤,它是集成算法使用的时间的离散化。 这会自动调整以确保(估计的)积分误差不会太高。 还选择使得采样步骤精确地踩踏(因此在那里得到输出)。 一个采样步骤包括不同数量的积分步骤,但至少有一个。 在大多数情况下,集成步骤是在集成商的引擎下发生的,并且您无需处理任何事情。

  

求解器有效,但似乎会自动调整时间间隔和总时间(步数保持不变)。

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

  

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

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