Skip to content

第1章:浮点运算、条件数与稳定性

数值计算的主要问题

数值方法处理的对象不只有一个数。线性方程求向量,插值和逼近求函数的有限表示,微分方程求随时间变化的轨迹。不同对象最终常被转换为有限维计算,因此线性代数是许多方法的共同组成部分。

数学问题数值方法操作的对象需要控制的误差
线性方程与最小二乘矩阵分解、残差、搜索方向数据扰动与浮点误差
特征值问题不变子空间、特征对近似谱的敏感性与迭代误差
非线性方程局部模型与逐次近似初值影响、线性化与停止误差
插值、逼近与积分节点、基函数、求积权重离散采样与近似误差
常微分方程时间网格与离散状态单步误差的积累和传播

例如隐式微分方程方法每一步可能产生非线性方程,Newton 法又把它转成线性方程组。外层离散方法、非线性迭代和内层线性求解各有误差;把内层解到机器精度,未必能改善由粗时间步主导的总误差。

有限精度表示

浮点数用符号、有效数字与指数表示。相邻可表示数的绝对间距随数量级变化,因此通常用相对误差描述舍入。在正常范围内,一次基本运算常建模为

fl(ab)=(ab)(1+δ),δu,\operatorname{fl}(a\circ b)=(a\circ b)(1+\delta),\qquad|\delta|\le u,

其中 u 是单位舍入误差,\circ 为适用的基本运算。结果溢出、落入某些下溢情形或数学运算无定义时,不能直接套用这个模型。

浮点加法不结合:舍去的小量以后不能因为数学表达式重新分组就自动恢复。求和顺序、补偿求和和更高精度会影响误差,但也有不同计算代价。

问题的敏感性

对标量函数 y=f(x),小相对扰动的一阶放大约为

κ(x)=xf(x)f(x),\kappa(x)=\left|\frac{xf'(x)}{f(x)}\right|,

要求分母等量有意义。条件数大表示输入微小变化就可能显著改变输出,是问题性质,不是某个实现写得差。

线性系统的相对敏感性由矩阵条件数 κ(A)=AA1\kappa(A)=\|A\|\|A^{-1}\| 控制。在二范数下,它是最大与最小奇异值之比。

前向与后向误差

前向误差比较计算结果与精确解;后向误差问计算结果是否是某个邻近输入问题的精确解。后向稳定算法使所需输入扰动与舍入误差同阶,但若问题病态,前向误差仍可能很大。

Ax^bA\hat x\approx b,残差 r=bAx^r=b-A\hat x 很小,只说明 x^\hat x 精确解了右端为 brb-r 的系统;若 A 病态,x^\hat x 仍可能远离原解。

相消与等价改写

计算 x+1x\sqrt{x+1}-\sqrt x,当 x 很大时两个近似数相减会损失相对有效位。代数改写为

1x+1+x\frac1{\sqrt{x+1}+\sqrt x}

避免直接相减,通常更稳定。这个改写修复算法中的相消,不会改变原问题对 x 的条件数。

练习

  1. 用二进制双精度比较上述两个公式在大 x 时的结果,以高精度作为参考。
  2. 构造小残差却大前向误差的病态线性系统。
  3. 区分“题目本身敏感”和“算法引入额外误差”。

上次更新: