2. 数值计算误差与稳定性基础

数值分析的核心任务,是把连续的数学问题转化为计算机可执行的有限步运算。这个转化过程必然引入误差,而误差是否会失控,决定了算法结果是否可信。本节围绕误差的度量、来源、放大机制与工程容忍度展开,为后续算法选型建立判断依据。

一、绝对误差与相对误差:两种度量视角

设精确值为 x,近似值为 x*,则绝对误差定义为 e = x* − x,它带有量纲,反映偏差的绝对大小。相对误差定义为 e_r = (x* − x) / x(x ≠ 0),无量纲,反映偏差相对于真值的比例。工程中常关注相对误差的绝对值,并用百分数表示。

两者不可互相替代。例如测量一根轴的长度,真值 1000 mm,近似值 1001 mm,绝对误差 1 mm,相对误差约 0.1%;而测量一个 2 mm 的垫片,同样 1 mm 的绝对误差意味着 50% 的相对误差,完全不可接受。因此判断精度时必须先明确度量口径:绝对误差适合有明确公差带的场景,相对误差适合跨量级比较。

需要注意,真值往往未知,实际工程中常用高精度参考解、解析解或收敛后的数值解代替真值来估算误差,此时得到的是“误差估计”而非严格误差。

二、截断误差与舍入误差:两类误差来源

截断误差来自数学模型的离散化。例如用泰勒展开近似函数时只保留前几项,余项即为截断误差。以向前差商近似导数为例:

f'(x) ≈ (f(x+h) − f(x)) / h
截断误差 ≈ (h/2)·f''(ξ),与步长 h 成正比

步长越小,截断误差越小,这是算法层面的误差,可通过提高阶数或减小步长控制。

舍入误差来自计算机浮点数的有限字长。IEEE 754 双精度浮点数约有 15~16 位有效十进制数字,每次运算都可能产生半个最低有效位的偏差。舍入误差具有随机性,会随运算次数累积。

两类误差存在矛盾:减小步长 h 会降低截断误差,但差商中 f(x+h) − f(x) 的相减会造成有效数字丢失,舍入误差反而被 1/h 放大。总误差随 h 呈“先降后升”的 U 形曲线,存在一个最优步长。这正是数值计算中“精度并非越高越好”的典型体现。

三、条件数与稳定性:问题与算法的双重属性

条件数刻画问题本身的敏感性,与算法无关。对函数求值问题,条件数约为 |x·f'(x)/f(x)|;对线性方程组 Ax = b,条件数 cond(A) = ‖A‖·‖A⁻¹‖。条件数大意味着输入的微小扰动会引起输出的剧烈变化,这类问题称为病态问题。

稳定性则刻画算法对误差的抑制能力。一个稳定的算法不会让初始误差或舍入误差在迭代中被无限放大。典型例子是递推计算积分 I_n = ∫₀¹ xⁿ/(x+5) dx:正向递推 I_n = 1/n − 5·I_{n−1} 中误差每步被放大 5 倍,很快失真;而反向递推 I_{n−1} = (1/n − I_n)/5 误差每步衰减为 1/5,结果稳定可靠。同一数学关系,两种计算方向,稳定性截然不同。

条件数是问题的“体质”,稳定性是算法的“医术”。病态问题配稳定算法仍可能得到可用结果;良态问题配不稳定算法同样会失败。

四、误差传播的简单分析

误差传播分析用于估计输入误差如何传递到输出。对一元函数 y = f(x),一阶近似下有 Δy ≈ f'(x)·Δx,相对误差满足 |Δy/y| ≈ |x·f'(x)/f(x)|·|Δx/x|,系数即条件数。对多元函数,绝对误差按偏导数绝对值加权求和,相对误差则按各项贡献叠加。

以两数相减 y = a − b 为例,若 a ≈ b,则 y 很小,而 Δy = Δa − Δb 并未减小,相对误差 |Δy/y| 被显著放大,这就是“相近数相减”造成有效数字丢失的原因。工程上应尽量改写公式避免此类运算,例如把 √(x+1) − √x 改写为 1/(√(x+1) + √x)。

误差来源、传播与稳定性判断链 原始问题 精确值 x、参数 A、b 截断误差 离散化、泰勒余项、步长 h 舍入误差 浮点字长、相减抵消、累积 误差传播 Δy ≈ f′(x)·Δx 相对误差 × 条件数 相近数相减 → 有效位丢失 迭代中误差放大或衰减 条件数:问题敏感性 cond(A) 大 → 病态问题 与算法无关,需换模型或高精度 稳定性:算法抑制能力 误差不无限放大 → 稳定 反向递推、选主元、改写公式 结果可信度 = 问题条件数 × 算法稳定性 × 误差容忍度

五、工程中误差容忍度的设定

误差容忍度不是拍脑袋决定的数字,而应由工程目标反推。常用做法是:先确定结果允许的物理偏差(如结构位移允许 0.5 mm、温度控制允许 ±0.1 ℃),再换算为相对误差阈值;同时结合输入数据的测量精度,避免“输入只有 3 位有效数字却要求输出 8 位精度”的无效追求。

实践中可参考以下判断逻辑:若输入相对误差约为 ε_in,问题条件数为 κ,则输出相对误差大致不低于 κ·ε_in,算法本身再引入额外误差。因此容忍度设定应满足 ε_out ≥ κ·ε_in,否则需要提高输入精度或改用更稳定的模型。对迭代算法,还应设定收敛判据,例如相邻两次迭代的相对变化小于 1e-8,并设置最大迭代次数防止不收敛时死循环。

常见误区:把“迭代到机器精度”当作目标。对病态问题,过度迭代只会放大舍入误差;对差商类计算,步长过小反而使结果变差。应结合误差曲线选择合理参数,而非一味追求更小步长或更多迭代。

综上,误差分析的关键在于分清误差来源与放大机制:用绝对/相对误差选对度量口径,用截断/舍入误差理解精度上限,用条件数判断问题难度,用稳定性筛选算法,最后以工程目标反推容忍度。这套判断链条,是后续算法选型的直接依据。