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

`scipy.integrate.odeint` automatically adjusts time steps

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

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

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

编辑:

最终,这是我的代码中的一个错误。我将时间步长的索引传递给 odeint 例程,而不是时间步长本身。不管怎样,谢谢你的解释。

odeint使用了两个时间步长:

  • 采样步骤,这是积分器returns给你结果的时间间隔。 这是由你控制的,通常你会select这个等距离。

  • 积分步骤,这是积分算法使用的时间离散化。 这是自动调整的,以确保(估计的)积分误差不会太高。 还选择了采样步骤,以便准确地执行采样步骤(因此您可以在那里获得输出)。 一个采样步骤由不同数量的积分步骤组成,但至少有一个。 在大多数情况下,集成步骤是在集成器的幕后发生的,您无需处理。

The solver works but it seems to automatically adjust the time intervals and total times (while the number of steps stays constant).

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

I realized that the actual time steps odeint uses are returned via infodict['tcur']. Does this mean I always have to plot the resulting solution against these times?

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