2017-09-15 158 views
1

我使用scipy.integrate.odeint来解决空间和时间维度上的ODE(扩散方程)。我通过有限差异来表达空间导数,所以整个问题都是时间问题。`scipy.integrate.odeint`自动调整时间步骤

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

我意识到实际的时间步骤odeint使用是通过infodict['tcur']返回。这是否意味着我总是不得不根据这些时间绘制结果解决方案?为什么SciPy文档中的解释不同? (在该例子中它们暗算参数t,即初始倍我传递给odeint。)

编辑:

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

回答

3

有由odeint使用两个时间步骤:

  • 采样步骤,这是间隔中积分结果返回给你。 这是由你控制,通常你会选择这个等距离。

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

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

这不应该是这种情况。 总时间和采样步数应始终为您在参数t中指定的值。 您的结果与FCTS计划的结果不同,也可能是后者的错。 您可能想要做的一个简单的完整性检查就是降低精度阈值(rtolatol),这将导致更小的积分步骤(除非您的采样步骤非常小)。 这不应该对你的结果有很大的影响。

我意识到实际时间步骤odeint使用是通过infodict['tcur']返回。这是否意味着我总是不得不根据这些时间绘制结果解决方案?

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

+0

感谢您的回答。这听起来很合理。然而,我对它进行了多次检查,甚至给出了一个简单的扩散问题,与FTCS不同的结果,还有Crank-Nicolson方案。我还将采样时间步长改为较低值,但odeint不断给我提供了一个不同的结果,我可以通过在FTCS/CN方案中增加时间步长来重现这一结果。这是相当混乱的... – Guiste

+0

问题解决了(请参阅我上面的编辑) – Guiste