§1
数值分析研究如何用有限步骤的算术运算去近似求解数学问题。绝大多数科学与工程问题——微分方程、定积分、非线性方程、特征值——都没有初等函数的解析解,或者其解析解过于复杂而无法直接计算;即便有解析表达式,也往往含有无穷级数、特殊函数等难以精确求值的形式。因此我们必须把连续问题离散化,用有限次四则运算得到近似解。本章确立贯穿全书的两条主线:误差如何产生并传播,以及算法在误差扰动下是否"稳定"。
核心问题可抽象为:给定问题 $P$ 与(含误差的)输入 $x^*$,数值算法给出近似输出 $\tilde{y}$;我们关心 $\tilde{y}$ 与真值 $y=P(x)$ 的差距,以及该差距相对于输入误差的放大程度。
一、为什么需要数值方法
- 无解析解:如方程 $e^{-x}=x$、积分 $\int e^{-x^2}\,dx$、绝大多数 PDE 的解,无法写成初等函数。
- 解析解不可用:即使存在级数解 $\sum a_n$,也需截断为有限项来近似。
- 计算成本:符号推导在多维、大规模问题中代价过高,数值离散更实际。
数值方法的基本思路是"以直代曲、以有限代无限":用多项式、分段线性、差商等简单对象近似复杂对象,并用迭代不断修正。近似不可避免,关键是为误差定量并控制其增长。
二、误差的来源
把"真值 $x$"与"计算值 $\tilde{x}$"的差距逐层拆解:
| 误差类型 | 来源 | 是否可控 |
|---|---|---|
| 模型误差 | 对真实世界的简化(忽略次要因素) | 取决于建模 |
| 观测 / 输入误差 | 测量、初始数据不精确 | 一般不可控 |
| 截断(离散化)误差 | 用有限近似无限(如泰勒截断、步长) | 算法可控 |
| 舍入误差 | 浮点数只能表示有限位有效数字 | 受机器精度限制 |
数值分析主要研究后两类——它们是计算方法本身引入、并可通过改进算法控制的误差。前两类属于问题定义阶段,不在本书范围内。
三、绝对误差与相对误差
定义. 设 $x$ 为真值,$x^*$ 为其近似值,则
- 绝对误差:$e=|x-x^*|$;
- 相对误差:$e_r=\dfrac{|x-x^|}{|x^|}$(要求 $x^*\neq0$)。
相对误差刻画"误差占真值的比例",更适合比较量级不同的量。例如 $x=1000$ 时误差 $1$ 与 $x=0.001$ 时误差 $1$ 的绝对误差同为 $1$,但相对误差相差 $10^6$ 倍——后者完全不可用。实践中常以 $\hat{e}_r=|x-x^*|/|x|$ 作为相对误差的可计算近似(因 $x$ 通常未知)。
四、浮点数与机器精度
计算机按 IEEE 754 标准用浮点数近似实数:
$$\mathrm{fl}(x)=(-1)^s\cdot m\cdot 2^E,$$
其中 $s$ 为符号位,$m\in[1,2)$ 为尾数(有效数字),$E$ 为阶码。双精度(64 位)尾数约 $53$ 位二进制,即约 $15\text{–}16$ 位十进制有效数字。
舍入到最近的可表示数引入舍入误差。定义机器精度 $\varepsilon_{\mathrm{mach}}$ 为 $1$ 与大于 $1$ 的最小可表示浮点数之差的一半(双精度约 $2.2\times10^{-16}$)。对任意实数 $x$,有
$$\mathrm{fl}(x)=x(1+\delta),\qquad |\delta|\le\varepsilon_{\mathrm{mach}}.$$
即每个浮点运算的相对误差不超过机器精度。多次运算会累积舍入误差,但若操作数不相近、运算良好,误差通常维持在 $\varepsilon_{\mathrm{mach}}$ 量级。
五、良态与病态:条件数
同样的输入误差,对不同问题放大的程度截然不同。
定义(函数条件数). 对单变量函数 $f$,在 $x$ 附近的条件数
$$\kappa=\left|\frac{x\,f'(x)}{f(x)}\right|.$$
它衡量:输入相对扰动 $\delta x/x$ 引起的输出相对扰动约为 $\kappa\cdot(\delta x/x)$。
- $\kappa\approx1$:问题良态(well-conditioned),误差不被放大;
- $\kappa\gg1$:问题病态(ill-conditioned),微小输入误差被放大为巨大输出误差。
对线性系统 $Ax=b$,条件数定义为 $\kappa(A)=\|A\|\cdot\|A^{-1}\|$。若用谱范数,则 $\kappa_2(A)=\sigma_{\max}/\sigma_{\min}$(最大、最小奇异值之比)。接近奇异的矩阵 $\kappa\gg1$,求解时极不稳定。
例子. 计算 $f(x)=x^3$ 在 $x=1$ 附近:
$$\kappa=\left|\frac{x\cdot 3x^2}{x^3}\right|=3.$$
即 $1\%$ 的输入误差会导致约 $3\%$ 的输出误差。$f(x)=x$ 时 $\kappa=1$ 误差不放大;$f(x)=x^{10}$ 时 $\kappa=10$,敏感性更高。
六、算法的数值稳定性
误差分析有两种视角:
- 向前误差(forward error):计算结果 $\tilde{y}$ 与真值 $y$ 的距离 $|\tilde{y}-y|$。
- 向后误差(backward error):把 $\tilde{y}$ 解释为"对某个略有扰动的输入 $x+\Delta x$ 的精确解",即找最小 $\Delta x$ 使 $P(x+\Delta x)=\tilde{y}$。
一个数值稳定的算法:其向前误差对应的向后扰动(输入误差)在问题本身的病态所允许的范围内——换言之,算法的误差可解释为"只因输入有合理的小扰动"。反之,若小输入误差经算法被剧烈放大,则为数值不稳定。
典型陷阱:相近数相减损失有效数字(见例题 1),以及大规模递推中误差的指数累积。
七、例题与解答
例题1(相近数相减). 当 $x$ 很大时,直接计算 $\sqrt{x+1}-\sqrt{x}$ 会让两个相近的大数相减,丢失大量有效数字。用有理化改写:
$$\sqrt{x+1}-\sqrt{x}=\frac{(\sqrt{x+1}-\sqrt{x})(\sqrt{x+1}+\sqrt{x})}{\sqrt{x+1}+\sqrt{x}}=\frac{1}{\sqrt{x+1}+\sqrt{x}}.$$
取 $x=10^8$:原式 $=10000.00005-10000\approx5\times10^{-5}$(受舍入影响仅保留极少有效位);改写后 $=1/(10000.00005+10000)\approx5.000\times10^{-5}$,有效数字完整。✓
例题2(条件数). 对 $f(x)=x^3$,取 $x=1+\delta$($\delta=10^{-3}$)。精确变化 $\Delta f\approx f'(1)\delta=3\delta=3\times10^{-3}$,相对变化 $\approx3\delta/1=3\times10^{-3}$,恰为 $\kappa=3$ 倍的输入相对误差 $10^{-3}$。对比 $g(x)=x$:$\kappa=1$,输出相对误差等于输入相对误差,不放大。验证一致。✓
练习
1. 设真值 $x=12.3456$,近似值 $x^*=12.3$。求绝对误差与相对误差。
2. 双精度机器精度约 $2.2\times10^{-16}$,用浮点计算 $10^{16}+1$ 会得到什么?说明原因。
3. 求 $f(x)=\sqrt{x}$ 在 $x=4$ 处的条件数,并判断良态与否。
4. 解释为何计算 $1-\cos x$($x$ 很小时)会损失有效数字,并给出改进写法。
参考答案与提示
1. 绝对误差 $e=|12.3456-12.3|=0.0456$;相对误差 $e_r=0.0456/12.3\approx3.71\times10^{-3}$。
2. $10^{16}+1$ 在双精度下舍入后仍为 $10^{16}$,因为 $1$ 远小于 $10^{16}\cdot\varepsilon_{\mathrm{mach}}$,被舍入忽略;说明大规模数与小数相加会丢失小数。
3. $\kappa=\left|\frac{x\cdot(1/2)x^{-1/2}}{\sqrt{x}}\right|=\frac12<1$,良态。
4. $\cos x\approx1-x^2/2$ 使两数相近相减损失有效位;改用 $1-\cos x=2\sin^2(x/2)$ 可避免。
本章小结
- 数值方法用离散化、有限步运算近似连续问题;误差不可避免但须受控。
- 误差四类:模型、观测、截断、舍入;数值分析主要关注后两类。
- 绝对误差 $e=|x-x^|$,相对误差 $e_r=|x-x^|/|x^*|$ 更适合跨量级比较。
- 浮点遵循 IEEE 754,舍入误差由机器精度 $\varepsilon_{\mathrm{mach}}$ 界定。
- 条件数 $\kappa$ 衡量问题的良态 / 病态:$\kappa\gg1$ 时微小输入误差被放大。
- 稳定算法使误差对应合理的向后扰动;警惕相近数相减等陷阱。
互动演示
拖动下方控件观察动态过程。
数值分析导论:同一小扰动在良态(绿)与病态(粉)映射下被放大的程度对比。