CVODE 警告:内部 t = *** 和 h = 2.09813e-13 使得下一步的 t + h = t。求解器将继续

计算科学 有限差分
2021-12-10 04:06:10

我有一个系统可以模拟不同温度条件下的气泡演化。我使用CVODE_DENSE算法来求解 ODE 并获得气泡大小和浓度。但是由于出现上述警告,代码已停止。

我在不同的温度下进行了测试,例如 573 K 和 773 K。代码在大约 129 步处停止在 573 K,但在大约 91 步处停止在 773 K。任何进一步调试此代码的想法将不胜感激。

2个回答

根据我帮助几千人调试这些东西的经验,99% 的时间是由于模型的实现存在问题。几乎总是模型编写方式中的一些错误。因为这个问题经常出现,所以我在 Julia Discourse Forum 上写了一篇 PSA,并在DifferentialEquations.jl FAQ中提到了详细信息,其中包含如何调试它的分步过程。由于PSA非常深入,这里不再赘述(请看链接),但总结如下。

模型发散到无穷大,dt<dtmin 等都是一回事。如果你的模型是发散的,那么适应性将会下降dt,或者它会首先达到 Inf 或者dt<dtmin取决于本质上的随机性。因此,将其视为不稳定。

  1. 首先,尝试不同的求解器。执行此操作时,请将容差设置得非常低,以便为所有事情提供最佳机会。尝试对最稳定的雅可比矩阵使用自动微分,并尝试使用已知非常稳定的求解器(CVODE_BDF、TRBDF2、Rodas4)。如果所有求解器都以相同的方式发散,您几乎可以肯定地将实施归咎于f原因。通常是这种情况,否则打开一个问题。
  2. 既然您知道f可能是问题所在,请仔细检查您的模型是否存在符号问题。做到这一点的一个好方法是在内部打印f并观察分歧附近发生的情况。有什么东西真的很大吗?什么值应该保持它很小?那是符号错误。
  3. 仔细检查你的假设。u=u在有限时间内达到零,它不会渐近线。求解器在遇到问题时将遇到解决方案的唯一性问题。相似地,u=u2u如果初始条件太大(大于 1),将发散到无穷大。如果求解器说它是发散的,那么它就是在做正确的事情。
  4. 仔细检查这f是一个 ODE。如果您f连续两次评估该函数,您是否总是得到相同的结果?有随机性吗?f您是否在调用之间缓存值或“历史记录” ?请记住,自适应 ODE 求解器并不总是及时向前,因此如果您这样做,您的历史可能就是未来,而解决方案将取决于dt您选择的确切内容。由于您定义的不是 ODE,因此适应性测量将难以收敛到任何东西,并且它们将与dt<dtmin.

等等。有关更多详细信息,请参阅完整的 PSA,但这应该可以帮助您入门。

当系统接近开始“爆炸”的奇点时,我经常遇到这个问题,因此需要非常小的时间步才能使积分误差估计保持在规定的误差范围内。这些时间步长是如此之小以至于物理时间t模拟的数值等于t+dt,即双精度舍入误差占主导地位。

我怀疑您的问题仅与潜在的刚度有关,因为 CVODE 会自动在非刚度 (Adams-Moulton) 和刚度 (BDF) 公式之间切换,并且根据我的经验,这非常有效。

一个好主意是查看您的解决方案组件,看看它们在您收到警告时是如何演变的。其中一些很可能是发散的,这可能会为您指明正确的方向以找到问题的根源(例如,如果存在方程中的奇异点)。

无论如何,我们需要更多详细信息才能进一步帮助您;)也许是一个可以轻松运行并重现错误的简单代码(例如,如果您有与您的代码等效的 Python)。