我有一个 ODE:
我知道这个特殊的 ODE 在分析上是僵硬的。我也知道,如果我们使用显式(前向)时间步长方法(Euler、Runge-Kutta、Adams 等),如果时间步长太大,该方法应该返回非常大的错误。所以,我有两个问题:
通常,当误差项的解析表达式不可用或无法导出时,这是如何确定 ODE 的刚性吗?
一般来说,当 ODE 很僵硬时,我如何确定“足够小”的时间步长?
我有一个 ODE:
我知道这个特殊的 ODE 在分析上是僵硬的。我也知道,如果我们使用显式(前向)时间步长方法(Euler、Runge-Kutta、Adams 等),如果时间步长太大,该方法应该返回非常大的错误。所以,我有两个问题:
通常,当误差项的解析表达式不可用或无法导出时,这是如何确定 ODE 的刚性吗?
一般来说,当 ODE 很僵硬时,我如何确定“足够小”的时间步长?
一个更好的看待它的方法是,对于一个僵硬的问题,任何稳定的显式计算都会导致一个比所需的容错小得多的误差。
有许多使用显式方案自动检测刚度的好方法,尤其是嵌入式 Runge-Kutta 对。参见例如:
在 faleichik 的第二个例子中,随着步长的减小,当超过稳定的时间步长阈值时,人们会看到误差突然急剧下降到远低于典型所需容差的水平。因此,一个好的误差估计器确实会揭示问题的刚性。在第一个问题中,以稳定步长获得的误差将在典型的所需公差范围内,表明非刚度。
因此,请注意,如果需要足够严格的容错能力,任何问题都会变得不那么僵硬。
假设您对某个 ODE 存在初始值问题. 你采取相当大的步长和一个显式的欧拉方法,以恒定的步长进行计算 并获得以下几点:
您估计错误,它似乎很大。好,那你拿 并获得
误差估计现在是可以接受的。一步的大小相对较小.
那么,这个问题很棘手吗?答案是否定的!这里需要小步长来正确再现解的振荡。
我们解决的问题是
现在你在相同的时间间隔内取另一个 ODE,和显式欧拉给你几乎相同的数值解:
你拿现在数值解是
现在的误差估计很小。一步的大小相对较小.
这个问题是硬的吗?是的!我们已经采取了非常小的步骤来重现变化非常缓慢的解决方案。这是不合理的!这里时间步长的大小受到显式欧拉的稳定性属性的限制。
这个问题是
请注意,如果我们采用更长的积分间隔,步长的数量可能会更大。
结论:有关时间步长和相应误差的信息不足以检测刚度。您还应该查看获得的解决方案。如果它变化缓慢并且步长非常小,则问题很可能是僵硬的。如果解决方案快速振荡并且您信任您的误差估计技术,那么这个问题并不难解决。
如果您使用一些带有自动步长控制的黑盒显式求解器,那么您无需做任何事情:该软件将自适应地采用所需的步长。
但是假设您想手动获得具有恒定步长的解决方案,或者只是想估计您应该等待多少小时,直到您的显式方法解决问题。然后你应该知道你的雅可比矩阵的频谱。假设它是真实的并且存在于(在你的例子中)。
然后,您应该计算显式方法的实际稳定性区间(复杂情况下的稳定性域)。这不是太难,您只需查阅有关此主题的任何教科书即可。在显式欧拉的情况下,这个区间是. 现在,如果你想让你的解决方案不爆炸,你应该采取这样在于稳定区间,即在我们的例子中
如果你想要更多的一致性,你应该采取
当然,这种分析主要适用于已知频谱的线性问题。对于更实际的问题,我们应该依靠刚度检测的数值方法(参见其他答案中的参考资料和评论)。
要回答您的问题:
据我所知,在实践中,如果显式方法需要相对于您感兴趣的时间尺度非常小的时间步长(请参阅这个问题的答案,了解 ODE 变得僵硬意味着什么)才能产生准确的结果,那么对于所有的意图和目的,你的问题是僵硬的。要确定对步长的要求,请依赖专家编写的众多库之一(MATLAB 套件就是一个例子,还有 SUNDIALS、VODE、DASPK、DASSL、LSODE 等),它们具有自适应时间步进启发式。SUNDIALS 手册解释了他们用来确定包所用时间步长大小的决策规则,并为您提供了在实践中使用的规则示例。
同样,我会在实践中使用具有自适应时间步进的库,因为这样做更有效。但是,如果您自己编写一个方法,使用固定的步长,如果您注意到大的振荡,或者您的解决方案“爆炸”,那么您会怀疑您的时间步长太大,并减少它。重复,直到你得到一个行为合理的数值解。像 Ascher 和 Petzold 以及 Hairer 和 Wanner 这样的教科书就是这种现象的好例子。