是否迭代计算了刚性系统的 Rosenbrock 方法的时间步长?

计算科学 C++ 刚性 自适应时间步长
2021-12-18 11:28:50

我有一个一般形式的 ODE 系统

  y' = k(y)(x) + q(z)(x)
  x' = a(z)(x) + b(x)(x) 

其中 k,q,a 和 b 也取决于状态 x 和 y。求解器(ODEINT)抛出错误:“超出最大迭代次数。未找到新的步长”。我在僵硬的系统上使用 Rosenbrock 方法。Rosenbrock 方法的步长是迭代计算的吗?如果是这样,我应该调整哪些参数来防止这个问题?

1个回答

Rosenbrock 方法利用嵌入式低阶方法来计算自适应时间步进的误差。此外,Rosenbrock 方法不必求解隐式系统(只是线性系统)。然后在它们中不会发生任何形式的迭代(除非您使用的是 Krylov 线性求解器)。

刚性求解器的最大步数可能有多种原因。第一个只是求解器发散了。如果它发散,则错误会增加并且时间步长会缩小。在许多情况下,步骤数可能在求解器注意到它发散之前就用完了,并意外抛出此错误。

求解器的发散可能有多种原因。发生这种情况的一个原因是公差太高。虽然理论上这些方法是 L 稳定的,但在实践中,雅可比中的自适应时间步长和误差改变了这一点。但它总是在一定的公差之下保持稳定,所以试试看。如果这不起作用,请查看您的导数函数。很可能是用户错误。

如果不是分歧(您可以从图中看到),那么如果您要求的公差非常低,那么您可能只是采取了太多步骤。在这种情况下,请确保您确实需要这么高的准确性,如果需要,除了增加最大步数之外别无选择。