`scipy`:`scipy.integrate.odeint`的重复收敛失败(可能是雅可比或容差不好)是什么意思。”错误是什么意思?

计算科学 Python 收敛 时间积分 scipy
2021-12-21 19:17:47

以下scipy.integrate.odeint错误在数字上是什么意思?

Repeated convergence failures (perhaps bad Jacobian or tolerances).

也就是说,如果我确定模型的程序实现是正确的,那么关于数值方案与解决方案过程的问题的错误消息本身是什么?

1个回答

以下 scipy.integrate.odeint 错误在数字上是什么意思?

Repeated convergence failures (perhaps bad Jacobian or tolerances).

您必须告诉我们您使用的是什么方法。我可以想到两个广泛的(不一定是详尽的)场景:

  • 您使用的是显式方法,因此没有非线性方程求解。然后,任何自适应时间步长方法都将根据误差标准调整时间步长,该误差标准涉及您、用户或软件中默认设置的一些容差。如果误差相对于容差太大,则误差标准中的测试将减少时间步长,并且一旦建议的时间步长变得太小,程序通常会返回一条错误消息,指出无法满足误差容差。(例如,参见 Hairer 和 Wanner,第 I 卷,第 II.4 节,他们在其中讨论了 Runge-Kutta 方法的策略;在SUNDIALS 文档中围绕公式(2.6)在该文本中也简要讨论了类似的策略。)
  • 您正在使用隐式方法,在这种情况下,存在非线性方程求解,以及更多潜在的故障点。例如,容差可能存在问题,这通常表现为上述显式方法的情况:如果容差太小,并且最小时间步长不能满足步长选择步骤中的误差标准在实现中定义,实现将返回收敛失败。也可能存在非线性求解器无法在足够数量的迭代内收敛到给定容差(用户设置或实现中的硬编码)的问题。根据用于求解隐式方法中嵌入的非线性方程的方法,可能存在嵌入的线性求解,这些求解可能不会收敛;在很多情况下,这种收敛失败可能是由于实施雅可比时的错误,或者是由于雅可比的近似不够准确。(例如,当使用雅可比矩阵的有限差分逼近时,我已经看到刚性问题的收敛失败,并且当用雅可比矩阵的解析表达式替换有限差分逼近时,我看到这些收敛失败解决。)第 2 章SUNDIALS 文档很好地概述了这些一般注意事项,因为它们适用于 CVODE 中实现的 BDF 方法。

也就是说,如果我确定模型的程序实现是正确的,那么关于数值方案与解决方案过程的问题的错误消息本身是什么?

这真的意味着你必须做更多的诊断。

SciPy 是一个很好的包,它们在 Python 包装器(dopri5、vode 等)中包装已建立的数值软件方面做得很好,但是这些代码在编写时并没有考虑到易于数值诊断,因此,你会与使用 PETSc 之类的库(开发人员通过拥有为了尝试不同的数值方法,内置了许多提供有用诊断输出的工具)。

这两组工具之间的权衡是,类似 SciPy 的工具更易于学习,在“正常工作”时非常出色,并提供小型、简单的公共 API,而类似 PETSc 的工具具有更大和更复杂的公共 API,是更强大,需要更多的时间和精力来学习。

一般来说,您需要查看 ODE 求解器中任何方程求解的残差与迭代输出,并且可能还需要查看 ODE 求解器中步长误差测试的输出,以便区分应用程序中的故障点,然后从那里,您需要弄清楚如何解决该故障点(这可能像放松公差一样简单,也可能像使用不同的离散化一样复杂,因为您使用的数值方法可能存在根本缺陷,可能不适用于您的问题)。