在数字分析的领域中,数值稳定性是数学算法一项非常可取的属性。稳定性的精确定义取决于上下文,尤其在数值线性代数和通过离散近似解决常微分方程及偏微分方程的算法中,这一点尤为显著。
“稳定性可以确保在对输入数据做微小更改时,最终结果不会剧烈波动。”
在数值线性代数中,主要关注在近乎奇异的问题附近出现的不稳定性,例如非常小的或几乎重合的特征值。而在解决微分方程的数值算法中,则关注于舍入误差或初始数据的小波动可能导致最终答案与精确解之间的巨大偏差。一些数值算法可能会消减输入数据中的小波动及误差,其他的则可能放大这些误差。那些被证明不会放大近似误差的计算称为数值稳定的。
数字分析的一个常见任务是选择稳健的算法,这意味着当输入数据发生微小变化时,结果不会产生天壤之别的情况。相反的现象则是算法的不稳定性。通常,算法涉及到一种近似方法,而在某些情况下,可以证明该算法在使用实数而非浮点数时会趋近于正确解。然而,在这种情况下,并不保证它会收敛到正确的解,因为浮点数的舍入或截断误差可能被放大,造成从正确解的偏差指数性增长。
在数值线性代数中,稳定性的概念可以用几种不同方式来形式化。常用的前向、后向和混合稳定性的定义通常出现于这一领域。令我们考虑一个被数值算法解决的问题,这里的函数 f 将数据 x 映射为解 y。算法的结果 y* 通常会偏离 “真实” 解 y。造成误差的主要原因是舍入误差和截断误差。
“算法的前向误差是结果与解之间的差距;而后向误差则是最小的 Δx,使得 f(x + Δx) = y*。”
前向误差是 y* 与 y 之间的差异;而后向误差则是满足 f(x + Δx) = y* 的最小 Δx。前向误差与后向误差之间存在着条件数的关系:前向误差的大小至多为条件数与后向误差之间的乘积。在许多情况下,更自然的做法是考虑相对误差。当后向误差针对所有输入 x 都很小时,我们称该算法为后向稳定。当然,「小」是一个相对的术语,其定义将取决于具体的上下文。
通常数值稳定性的定义更为通用,称为混合稳定性,它结合了前向误差和后向误差。如果一个算法能够大致解决一个相邻问题,即存在一个小的 Δx,使得 f(x + Δx) - y* 也小,则该算法是稳定的。因此,一个后向稳定的算法总是稳定的。相对于前向稳定性而言,若一个算法的前向误差除以问题的条件数相对较小,则该算法就是前向稳定的。
在求解微分方程的过程中,稳定性的定义却有所不同。在数值常微分方程中,存在多种数值稳定性的概念,例如 A-稳定性。这些概念通常与动力系统中的某些稳定性概念相关,特别是 Lyapunov 稳定性。当求解刚性方程时,使用稳定的方法非常重要。
“稳定性有时需要通过引入数值扩散来实现,这样可以确保计算中的舍入误差不会累积到危险的程度。”
对于线性演化型偏微分方程的解算法来说,若在步长趋向于零时数值解的总变化保持有界,则该算法被认为是稳定的。 Lax 等价定理表明,如果一个算法是一致的且稳定的,则它会收敛。然而,对于非线性偏微分方程,稳定性的定义则复杂得多,因为非线性方程中的许多性质在其线性对应中是不存在的。
计算平方根 2(约为 1.41421)是一个良定义的问题。许多算法通过从一个初始近似 x0 开始来解决此问题,例如 x0 = 1.4,然后不断计算改进的猜测 x1、x2 等等。著名的巴比伦(Babylonian)方法是一个典型的可能会被使用的方法,其公式为 xk+1 = (xk + 2/xk) / 2。
而另一种方法称作「方法 X」,其公式为 xk+1 = (xk^2 − 2)² + xk。该表格下记录了每种方法的一些迭代,并且看到巴比伦方法无论初始猜测为何都能快速收敛,而方法 X 则在 x0 = 1.4 时收敛非常缓慢,在 x0 = 1.42 时则稀奇地发散。因此,巴比伦方法被认为是数值稳定的,而方法 X 则是数值不稳定的。
数值稳定性还受到机器保留有效位数的影响。如果一个机器只保留四位有效数字,就可能给出一个良好的例子,说明显著性丧失可能会造成的后果。比如考虑 equivalent functions f(x) 和 g(x)。在计算 f(500) 和 g(500) 时,即使这两个函数是相等的,但却得出截然不同的结果,显示了小的误差如何导致大的变异。
总而言之,数值稳定性在数字分析中至关重要,它影响着我们解决问题的准确性与效率。然而,在你心中,什么样的算法或方法能在不稳定的条件下依然保持稳定性呢?