常微分方程组 - 初值问题的时间复杂度

计算科学 matlab 复杂
2021-12-12 03:36:17

我有兴趣知道时间复杂度是多少(在 Big-O符号)用于求解系统N微分方程?

ode15s在 MATLAB 中为此使用,但对时间复杂度一无所知。

1个回答

我将假设您专门讨论的是常微分方程 (ODE) 的初始值问题 (IVP),因为这就是 ode15s() 的用途。

首先,免责声明:好的 ODE 求解器具有步长控制程序,可以自动采取更小或更大的步长来达到所需的精度,这意味着求解 IVP 所花费的实际时间量可能会因问题的细节而有很大差异。此外,大 O 表示法隐藏了在比较不同方法的性能时通常很重要的常量。

也就是说,我们可以很容易地评论求解器所采取的每一步的时间复杂度。假设我们有一个 IVP

x˙=f(x,t),x(0)=x0
xRN,那么对于像 Matlab 的 ode45() 这样的显式求解器,每一步的复杂度与求值的复杂度相同f(x,t). 这是因为显式求解器评估f(x,t)每步固定次数。通常这意味着复杂性O(N2), 因为每个分量f(x,t)可以依赖于所有组件x,但在某些情况下较少。例如,如果f(x,t)是“稀疏”的,因为每个组件最多仅依赖于m的组成部分x,那么每一步的时间复杂度下降到O(mN).

另一方面,如果您使用像 ode15s() 这样的隐式求解器,则每一步都会求解线性方程组。这涉及一个N×N矩阵,求解它们的复杂度为O(N3). 这渐近地大于评估所需的时间f(x,t),这一步的时间复杂度也是如此。尽管如此,稀疏性有时可以减少一组特定 ODE 的这种情况。如果每个组件f(x,t)最多只取决于m的组成部分x,我们通常可以构造线性系统,使其涉及带宽的带状矩阵m,每一步的时间复杂度降低到O(m2N).

现在这里变得复杂了。如果我们要修复步长δt并采取M固定大小的步骤来解决特定的IVP,那么我们可以通过将上述步骤复杂度乘以得到整个算法的时间复杂度M, 例如O(MN3)在隐含的情况下。但通常求解器会采取措施δt 不同的尺寸以达到所需的精度。这使得在不考虑特定 IVP 的细节的情况下就不可能说出整体时间复杂度。尽管像 ode15s() 这样的隐式方法每步的时间复杂度比像 ode45() 这样的显式方法更差,但对于某些问题(称为刚性问题),我们发现隐式方法优于显式方法,因为它们可以在保持准确性的同时采取更大的步骤. 对此进行分析的尝试通常会考虑在特定 ODE 上针对特定步长使用的数值方法的“稳定性”,以及该方法的“精度顺序”,并且有大量关于该主题的文献。

在实践中,通常的过程是尝试像 ode45() 这样的显式求解器(这是 Dormand-Prince 方法),然后如果问题需要很长时间才能解决,请尝试像 ode15s() 这样的隐式方法。有大量不同的方法和软件可用于解决 IVP,因此通常为特定问题找出最佳方法的唯一方法是进行基准测试。