科学仿真 · 从零学起 第 1 / 7 节

第 1 章 · 基础:误差、正交性与稳定性(先立规矩)

这本是数值线性代数的"大部头参考书",开篇先立三条规矩:误差怎么度量、正交为什么金贵、稳定性的严格定义。后文 600 多页都是这三条规矩的应用。

矩阵与向量的度量体系

  • 向量范数 $\|\cdot\|_p$ 与诱导矩阵范数;$\|A\|_2 = \sigma_1$、$\|A\|_F = \sqrt{\sum\sigma_i^2}$。
  • 内积与正交:$\mathbf{x}^T\mathbf{y} = 0$;正交矩阵 $Q^TQ = I$ 是唯一"不放大任何方向误差"的非退化线性变换:
$$\|Q\mathbf{x}\|_2 = \|\mathbf{x}\|_2$$

这条性质是全书算法设计的试金石——每一步都尽量用正交变换,误差就不会在中间环节放大。

浮点算术的模型

第 1 章给出浮点运算的标准模型:$fl(x\odot y) = (x\odot y)(1+\delta)$,$|\delta| \le \mathbf{u}$(单位舍入误差)。由此定义向后误差分析的语言:算法输出 = 输入加扰动后问题的精确解。全书对每个算法都给出"它向后误差多小"的账本。

问题条件 vs 算法稳定

条件数 $\kappa(A) = \|A\|\|A^{-1}\| = \sigma_1/\sigma_n$ 度量问题的敏感性;稳定性度量算法不引入超出必要的误差。总误差的守恒式:

$$\text{前向误差} \lesssim \kappa \times \text{向后误差}$$

这个乘法关系解释了所有"结果不可信"事故的归因方法:先量 $\kappa$,再看算法向后误差,别把账算错对象。

原文要点:第 1 章以"秩一矩阵乘法的分块缓存优化"预告全书的工程取向:flop 数不再是唯一指标,存储层次与并行度同样设计变量;书中给出分级存储与阻塞(blocked)算法的基本账目,这是它与本科数值分析教材最大的区别。

老师的提醒

  • 阅读本书的方法论:每个算法盯三件事——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$:

$$(n-1)\mathbf{u} \approx 10^4 \times 1.1\times10^{-16} = 1.1\times10^{-12}$$

——约损失 4 位有效数字。若求和过程中出现灾难性抵消(结果远小于中间项),实际损失更大;对策:成对求和($\log_2 n$ 级误差)或 Kahan 补偿(误差与 $n$ 基本无关)。

本页是《矩阵计算》第 1 节的学习笔记:为便于初学,讲解、例题与要点概括均为本站原创整理,公式与章节定位供对照原书使用。

📑 本书目录 经典研读