第 1 章 · 基础:误差、正交性与稳定性(先立规矩)
这本是数值线性代数的"大部头参考书",开篇先立三条规矩:误差怎么度量、正交为什么金贵、稳定性的严格定义。后文 600 多页都是这三条规矩的应用。
矩阵与向量的度量体系
- 向量范数 $\|\cdot\|_p$ 与诱导矩阵范数;$\|A\|_2 = \sigma_1$、$\|A\|_F = \sqrt{\sum\sigma_i^2}$。
- 内积与正交:$\mathbf{x}^T\mathbf{y} = 0$;正交矩阵 $Q^TQ = I$ 是唯一"不放大任何方向误差"的非退化线性变换:
这条性质是全书算法设计的试金石——每一步都尽量用正交变换,误差就不会在中间环节放大。
浮点算术的模型
第 1 章给出浮点运算的标准模型:$fl(x\odot y) = (x\odot y)(1+\delta)$,$|\delta| \le \mathbf{u}$(单位舍入误差)。由此定义向后误差分析的语言:算法输出 = 输入加扰动后问题的精确解。全书对每个算法都给出"它向后误差多小"的账本。
问题条件 vs 算法稳定
条件数 $\kappa(A) = \|A\|\|A^{-1}\| = \sigma_1/\sigma_n$ 度量问题的敏感性;稳定性度量算法不引入超出必要的误差。总误差的守恒式:
这个乘法关系解释了所有"结果不可信"事故的归因方法:先量 $\kappa$,再看算法向后误差,别把账算错对象。
老师的提醒
- 阅读本书的方法论:每个算法盯三件事——flop 数、存储量、稳定性结论。三栏表格自己列,比读散文有效。
- 正交变换的代价大约是初等变换的两倍,换来的是无条件稳定——大多数场景值得。
自检
- 正交矩阵为什么是数值算法的"安全变换"?
- 写出浮点标准模型与总误差守恒式。
- "阻塞"算法优化的是什么资源?
更深一层:Golub-Van Loan 的"三栏表格"阅读法
这本大部头最容易劝退的地方是它的密度,最有效的读法是把每个算法强制整理成三栏:flop 数 / 存储量 / 稳定性结论。以 QR 为例:Householder QR 是 $2mn^2 - \frac23n^3$ flop、$O(1)$ 额外存储(因子就地覆盖 A)、向后稳定——三栏填完,它在绝大多数场景的统治地位一目了然。这套三栏表还能横向对比:把 Cholesky($\frac13n^3$、免主元、稳定)与 LU($\frac23n^3$、需主元、基本稳定)放一行,"对称正定值不值得特判"的答案自己浮现。数值算法的取舍都可以压缩进三栏——这是把 700 页读薄的方法。
第 1 章另一个常被忽略的宝藏是分级存储模型的引入:算法的"算术最优"与"机器最优"自此分家。blocked 算法的思想(内层高算术强度、外层薄面板)不只属于线性代数——任何"遍历大数据、做小计算"的模式都适用同一优化逻辑(卷积的 im2col+GEMM 是同款操作)。
推导细读:正交变换的"零放大"证明为什么值钱
正交矩阵 $Q$ 满足 $\|Qx\|_2 = \|x\|_2$,一行证明($\|Qx\|^2 = x^TQ^TQx = x^Tx$),却是全书稳定性的柱石。它的价值要在误差传播链里显形:算法是一串变换 $A \to T_1A \to T_2T_1A \to \dots$,若每个 $T_i$ 是初等变换(消元乘子),误差在各步之间被 $\|T_i\|$ 放大;若全是正交变换,误差的范数在传播中严格不增——误差只来自每步自身的舍入,不累积放大。这就是"正交变换是数值安全屋"的精确含义,也解释了为什么 Householder QR(全正交路径)比 Gram-Schmidt(半途丢失正交性)稳、为什么 Schur 形(正交相似)是特征值算法的终点站。
在真实世界里:从书到库的对应表
书里的每个算法在 LAPACK 里都有身份证号,对照表值得一建:第 5-7 章 LU/Cholesky 对应 dgetrf/dpotrf(并行版 ScaLAPACK 的 pdgetrf);第 8 章最小二乘对应 dgelsd(SVD 分支,秩亏自动处理);第 13-14 章特征值对应 dgeev/dsyev/dsyevd(分而治之);第 15 章 SVD 对应 dgesdd。工程实践的三条忠告:能用 LAPACK 别手写(差 10-50 倍);选 routine 前先看"问题类型矩阵"(对称?带状?秩亏?);读懂返回的 INFO 码(正定检验失败、收敛失败都写在里面)——商业求解器的内核也就是这些 routine 的封装。
专题深入:浮点模型的"标准假设"与"非标准现实"
浮点运算的标准模型 $fl(x\odot y) = (x\odot y)(1+\delta)$($|\delta| \le \mathbf{u}$)是全部误差分析的地基。这个模型的边界条件值得列出:它假设"输入已是机器数"(输入本身的表示误差独立处理)、它不管溢出/下溢(梯度下溢与次正规数是单独的坑)、它假设一次运算的误差(复合运算的误差分析靠归纳)。非标准现实:GPU 的 TF32/BF16(半精度的兴起让"低精度 + 误差补偿"成为新范式)、混合精度迭代精化(单精度分解 + 双精度残差)——"精度不是一次购"的预算思维是现代数值计算的主流。
数学细节展开:向后误差分析的"语言系统"
向后误差分析的语言系统值得作为"方法论资产"建立:$fl(AB) = (A + E)B$ 型(结果 = 扰动输入后的精确计算)的误差界写法、分量型 vs 范数型(逐元素的界更精细)、增长因子与条件数的乘积(前向误差 ≤ 条件数 × 向后误差)。这套语言系统的价值:它把"这个算法稳不稳"变成一个有定义、可证明、可比较的数学问题——没有它,"稳不稳"只是口头感受。
工程案例细节:LAPACK 的"分级存储"红利
LAPACK 的性能秘密值得展开:分块算法(内层高算术强度的 BLAS3 矩阵乘 + 外层薄面板处理)——分块大小由缓存容量决定。现代 BLAS 实现(OpenBLAS、MKL)的"分层缓存 + SIMD + 多线程"是同一个思想的三层包装。自己写数值代码前先查 LAPACK——手写三对角 Thomas、小矩阵求逆常能超过库(库的通用性有开销),但稠密矩阵乘与分解永远别手写。
常见误区与辨析(补充)
- "正交变换贵":代价约两倍,换来无条件稳定——大多数场景值得。
- "误差分析是理论家的事":向后稳定性的判断直接决定你的结果可信不可信——这是工程判断不是理论洁癖。
例题
双精度 $\mathbf{u} \approx 1.1\times10^{-16}$。求 $fl(a+b)$ 的相对误差界;连加 $10^4$ 个数,朴素求和的最坏相对误差量级是多少?
解答
单次运算:$fl(a+b) = (a+b)(1+\delta)$,$|\delta| \le \mathbf{u} \approx 1.1\times10^{-16}$。
朴素求和 $n$ 项:最坏相对误差 $\le (n-1)\mathbf{u}$。$n = 10^4$:
——约损失 4 位有效数字。若求和过程中出现灾难性抵消(结果远小于中间项),实际损失更大;对策:成对求和($\log_2 n$ 级误差)或 Kahan 补偿(误差与 $n$ 基本无关)。