我正在使用scipy.integrate.odeint
来解决空间和时间维度上的ODE(扩散方程)。我通过有限差分表达的空间导数,使整个问题成为时间问题。
求解器有效,但似乎会自动调整时间间隔和总时间(步数保持不变)。当我将结果与不调整时间间隔的简单FCTS方案进行比较时,它总是看起来不同。
我意识到odeint
使用的实际时间步长是通过infodict['tcur']
返回的。这是否意味着我总是需要针对这些时间绘制最终的解决方案?为什么在SciPy文档中对此有不同的解释? (在示例中,他们根据参数t
绘制,即我传递给odeint
的初始时间。)
编辑:
最后,这是我的代码中的错误。我将时间步长的索引传递给odeint
例程,而不是时间步骤本身。无论如何,谢谢你的解释。
答案 0 :(得分:3)
odeint
使用了两个时间步骤:
采样步骤,它是积分器向您返回结果的时间间隔。 这是由你控制的,通常你会等距离选择。
集成步骤,它是集成算法使用的时间的离散化。 这会自动调整以确保(估计的)积分误差不会太高。 还选择使得采样步骤精确地踩踏(因此在那里得到输出)。 一个采样步骤包括不同数量的积分步骤,但至少有一个。 在大多数情况下,集成步骤是在集成商的引擎下发生的,并且您无需处理任何事情。
求解器有效,但似乎会自动调整时间间隔和总时间(步数保持不变)。
不应该是这种情况。
总时间和采样步骤应始终是您在参数t
中指定的内容。
您的结果与FCTS方案的结果不同也可能是后者的错误。
您可能想要做的一个简单的完整性检查是降低准确度阈值(rtol
和atol
),这将导致更小的集成步骤(除非您的采样步骤非常小)。
这不会对您的结果产生太大影响。
我意识到
odeint
使用的实际时间步长是通过infodict['tcur']
返回的。这是否意味着我总是必须在这些时间内绘制出最终的解决方案?
不,在大多数情况下,infodict['tcur']
比解决方案更长,因为集成步骤多于采样步骤。
SciPy文档是正确的。