我有兴趣知道时间复杂度是多少(在 Big-符号)用于求解系统微分方程?
我ode15s
在 MATLAB 中为此使用,但对时间复杂度一无所知。
我有兴趣知道时间复杂度是多少(在 Big-符号)用于求解系统微分方程?
我ode15s
在 MATLAB 中为此使用,但对时间复杂度一无所知。
我将假设您专门讨论的是常微分方程 (ODE) 的初始值问题 (IVP),因为这就是 ode15s() 的用途。
首先,免责声明:好的 ODE 求解器具有步长控制程序,可以自动采取更小或更大的步长来达到所需的精度,这意味着求解 IVP 所花费的实际时间量可能会因问题的细节而有很大差异。此外,大 O 表示法隐藏了在比较不同方法的性能时通常很重要的常量。
也就是说,我们可以很容易地评论求解器所采取的每一步的时间复杂度。假设我们有一个 IVP
另一方面,如果您使用像 ode15s() 这样的隐式求解器,则每一步都会求解线性方程组。这涉及一个矩阵,求解它们的复杂度为. 这渐近地大于评估所需的时间,这一步的时间复杂度也是如此。尽管如此,稀疏性有时可以减少一组特定 ODE 的这种情况。如果每个组件最多只取决于的组成部分,我们通常可以构造线性系统,使其涉及带宽的带状矩阵,每一步的时间复杂度降低到.
现在这里变得复杂了。如果我们要修复步长并采取固定大小的步骤来解决特定的IVP,那么我们可以通过将上述步骤复杂度乘以得到整个算法的时间复杂度, 例如在隐含的情况下。但通常求解器会采取措施 不同的尺寸以达到所需的精度。这使得在不考虑特定 IVP 的细节的情况下就不可能说出整体时间复杂度。尽管像 ode15s() 这样的隐式方法每步的时间复杂度比像 ode45() 这样的显式方法更差,但对于某些问题(称为刚性问题),我们发现隐式方法优于显式方法,因为它们可以在保持准确性的同时采取更大的步骤. 对此进行分析的尝试通常会考虑在特定 ODE 上针对特定步长使用的数值方法的“稳定性”,以及该方法的“精度顺序”,并且有大量关于该主题的文献。
在实践中,通常的过程是尝试像 ode45() 这样的显式求解器(这是 Dormand-Prince 方法),然后如果问题需要很长时间才能解决,请尝试像 ode15s() 这样的隐式方法。有大量不同的方法和软件可用于解决 IVP,因此通常为特定问题找出最佳方法的唯一方法是进行基准测试。