数值线性代数 #
这讲讲什么 :把「解方程、最小二乘、求特征值」从纸上的精确推导,变成机器上真能跑完、并且知道误差有多大的算法。核心工具只有两类:矩阵分解 (LU / QR / Cholesky)与迭代法 (Jacobi / SOR / 幂法 / 共轭梯度)。前置 :09 讲(矩阵乘法与分块)、10 讲(可逆)、20 讲(特征值与可对角化)、22 讲(内积与范数)、23 讲(Gram–Schmidt)、27 讲(正算子)、29 讲(奇异值与条件数)。A1 篇的高斯消元是本文 LU 一节的前身,读过更顺。一句话 :理论问「解存不存在、唯不唯一」,数值计算问「用有限位浮点数、几步能算到几位有效数字」;后一个问题的答案由两个不同的量 决定——矩阵的条件数 (问题有多敏感)与算法的稳定性 (方法会不会自己放大误差)。
一、为什么需要它 #
1.1 同一个方程组,两种算法差 10¹⁰ 年 #
取一个 25 × 25 25\times25 25 × 25 的非奇异方程组 A x = b Ax=b A x = b 。Cramer 法则写得漂亮:
x i = det A i det A , i = 1 , … , n x_i=\frac{\det A_i}{\det A},\qquad i=1,\dots,n x i = det A det A i , i = 1 , … , n
其中 A i A_i A i 是把 A A A 的第 i i i 列换成 b b b 。照定义硬算行列式(完全展开),一共要 ( n − 1 ) ( n + 1 ) ! (n-1)(n+1)! ( n − 1 ) ( n + 1 )! 次乘法。n = 25 n=25 n = 25 时这是
24 × 26 ! ≈ 9.7 × 10 27 24\times 26!\approx 9.7\times10^{27} 24 × 26 ! ≈ 9.7 × 1 0 27
次乘法。一台每秒 10 10 10^{10} 1 0 10 次浮点运算的机器要跑 3 × 10 10 3\times10^{10} 3 × 1 0 10 年——宇宙年龄的两倍多。而同一个方程组,高斯消去法的乘法数是
∑ i = 1 n ( i − 1 ) ( i + 1 ) = n ( n + 1 ) ( 2 n + 1 ) 6 − n \sum_{i=1}^{n}(i-1)(i+1)=\frac{n(n+1)(2n+1)}{6}-n i = 1 ∑ n ( i − 1 ) ( i + 1 ) = 6 n ( n + 1 ) ( 2 n + 1 ) − n
n = 25 n=25 n = 25 时等于 5500 5500 5500 次,不到一秒。
一个算法是 O ( n ! ) O(n!) O ( n !) 还是 O ( n 3 ) O(n^3) O ( n 3 ) ,差别不在快慢,在能不能算 。 你以后遇到的矩阵是 10 3 10^3 1 0 3 到 10 6 10^6 1 0 6 阶,任何指数级算法连一行都跑不完。
1.2 机器里没有「精确」 #
双精度浮点数用 53 位二进制尾数,机器精度
ε = 2 − 53 ≈ 1.11 × 10 − 16 \varepsilon=2^{-53}\approx 1.11\times10^{-16} ε = 2 − 53 ≈ 1.11 × 1 0 − 16
每一次四则运算的结果都被悄悄乘上一个 1 + δ 1+\delta 1 + δ ,∣ δ ∣ ≤ ε |\delta|\le\varepsilon ∣ δ ∣ ≤ ε 。由此有三件事必须记住:
1 + 10 − 17 1+10^{-17} 1 + 1 0 − 17 存不下来 ,它被存成 1 1 1 。这个「差一点」在后面会要命(见 3.2 节的小主元)。
相近的数相减会吃掉有效位 。1.000000001 − 1 = 10 − 9 1.000000001-1=10^{-9} 1.000000001 − 1 = 1 0 − 9 ,两个 10 位数相减,结果只剩 1 位有效数字。
误差会沿着运算链累积并放大 ,放大的倍数由矩阵决定,不由你写代码的习惯决定。
1.3 为什么「求逆矩阵」在实践里几乎没人用 #
理论上 x = A − 1 b x=A^{-1}b x = A − 1 b 天经地义,A A A 可逆时这就是唯一解。实践里没人这么干,三条原因,每条都能量化:
(一)求解这一步慢一个 n n n 倍。 解一个右端项:先花 O ( 2 n 3 / 3 ) O(2n^3/3) O ( 2 n 3 /3 ) 做一次 LU 分解,再花 O ( 2 n 2 ) O(2n^2) O ( 2 n 2 ) 前代加回代。求 A − 1 A^{-1} A − 1 :要么对 e 1 , … , e n e_1,\dots,e_n e 1 , … , e n 解 n n n 次,总代价约 2 n 3 / 3 + 2 n 3 ≈ 2.7 n 3 2n^3/3+2n^3\approx2.7n^3 2 n 3 /3 + 2 n 3 ≈ 2.7 n 3 ;要么按伴随矩阵硬算,更贵。关键差距在三角形那一步:一次解是 2 n 2 2n^2 2 n 2 ,求逆是 2 n 3 2n^3 2 n 3 ,正好差 n n n 倍。 n = 10 3 n=10^3 n = 1 0 3 时前者约 2 × 10 6 2\times10^{6} 2 × 1 0 6 次运算,后者约 2 × 10 9 2\times10^{9} 2 × 1 0 9 。
真正要紧的不是这点常数:你通常只需要 A − 1 b A^{-1}b A − 1 b ,不需要 A − 1 A^{-1} A − 1 。 付了 n n n 倍的代价,换来一个你根本不会去看的矩阵。
(二)稀疏结构被毁掉。 三对角矩阵的逆通常是稠密 的。你手上有一个 10 6 10^6 1 0 6 阶、每条对角线都非零的矩阵,存它只要 3 × 10 6 3\times10^6 3 × 1 0 6 个数;存它的逆要 10 12 10^{12} 1 0 12 个数,8 TB。
(三)求逆不能改善条件数。 这一点最容易被误解:κ ( A − 1 ) = κ ( A ) \kappa(A^{-1})=\kappa(A) κ ( A − 1 ) = κ ( A ) 。病态问题求了逆还是病态,只是多绕一道、多叠一层舍入。
用双精度解 12 12 12 阶 Hilbert 方程组 H x = b Hx=b H x = b (b = H ⋅ 1 b=H\cdot\mathbf{1} b = H ⋅ 1 ,精确解全是 1 1 1 ),算出来的解满足
∥ b − H x ^ ∥ ∞ ∥ b ∥ ∞ ≈ 1.4 × 10 − 16 , ∥ x ^ − 1 ∥ ∞ ∥ 1 ∥ ∞ ≈ 0.70 \frac{\|b-H\hat x\|_\infty}{\|b\|_\infty}\approx 1.4\times10^{-16},\qquad \frac{\|\hat x-\mathbf{1}\|_\infty}{\|\mathbf 1\|_\infty}\approx 0.70 ∥ b ∥ ∞ ∥ b − H x ^ ∥ ∞ ≈ 1.4 × 1 0 − 16 , ∥ 1 ∥ ∞ ∥ x ^ − 1 ∥ ∞ ≈ 0.70
残差小到机器精度,解错了 70%。 残差衡量的是「x ^ \hat x x ^ 是某个附近方程组的解」,不是「x ^ \hat x x ^ 接近真解」。两者之间隔着一个 κ ( A ) \kappa(A) κ ( A ) 。
1.4 两个必须分开的概念:病态与不稳定 #
这一节最重要的一句话:
概念
属于谁
判据
你能做什么
病态 (ill-conditioned)
问题
κ ( A ) \kappa(A) κ ( A ) 很大
换公式、换模型、加正则化;算法救不了
不稳定 (unstable)
算法
误差被算法放大
换算法(例如加主元选取)
一个良态 的矩阵可以被一个不稳定 的算法算得面目全非——第三节的小主元例子就是:κ ∞ ( A ) ≈ 16 \kappa_\infty(A)\approx16 κ ∞ ( A ) ≈ 16 ,四位有效数字的算术,算出来的解第一位就错了。反过来,Hilbert 矩阵是病态的,换任何算法都救不回来。
拿同一个问题跑两个不同算法(比如不选主元的 LU 与选主元的 LU)。结果差得多 → 至少有一个算法不稳定;两个都给不出可信数字 → 问题本身病态。
二、定义与最小例子 #
2.1 范数与条件数 #
向量范数(22 讲)搬到矩阵上,最常用的四个:
∥ A ∥ 1 = max 1 ≤ j ≤ n ∑ i = 1 n ∣ a i j ∣ , ∥ A ∥ ∞ = max 1 ≤ i ≤ n ∑ j = 1 n ∣ a i j ∣ \|A\|_1=\max_{1\le j\le n}\sum_{i=1}^{n}|a_{ij}|,\qquad \|A\|_\infty=\max_{1\le i\le n}\sum_{j=1}^{n}|a_{ij}| ∥ A ∥ 1 = 1 ≤ j ≤ n max i = 1 ∑ n ∣ a ij ∣ , ∥ A ∥ ∞ = 1 ≤ i ≤ n max j = 1 ∑ n ∣ a ij ∣
∥ A ∥ 2 = λ max ( A T A ) , ∥ A ∥ F = ( ∑ i , j ∣ a i j ∣ 2 ) 1 / 2 \|A\|_2=\sqrt{\lambda_{\max}(A^{\mathsf T}A)},\qquad \|A\|_F=\Big(\sum_{i,j}|a_{ij}|^2\Big)^{1/2} ∥ A ∥ 2 = λ m a x ( A T A ) , ∥ A ∥ F = ( i , j ∑ ∣ a ij ∣ 2 ) 1/2
∥ A ∥ 1 \|A\|_1 ∥ A ∥ 1 是「绝对值最大的列 和」,∥ A ∥ ∞ \|A\|_\infty ∥ A ∥ ∞ 是「绝对值最大的行 和」,这两个能手算。∥ A ∥ 2 \|A\|_2 ∥ A ∥ 2 就是 29 讲的最大奇异值 σ max = λ max ( A T A ) \sigma_{\max}=\sqrt{\lambda_{\max}(A^{\mathsf T}A)} σ m a x = λ m a x ( A T A ) ——注意它既不是 最大特征值、也不是 谱半径,除非 A A A 半正定(那时 σ k = λ k \sigma_k=\lambda_k σ k = λ k 且全非负)。对称只能保证 ∣ λ k ∣ |\lambda_k| ∣ λ k ∣ 是奇异值,即 ∥ A ∥ 2 = max ∣ λ k ∣ = ρ ( A ) \|A\|_2=\max|\lambda_k|=\rho(A) ∥ A ∥ 2 = max ∣ λ k ∣ = ρ ( A ) ,仍不等于 λ max \lambda_{\max} λ m a x ——例如 A = diag ( 1 , − 3 ) A=\operatorname{diag}(1,-3) A = diag ( 1 , − 3 ) :∥ A ∥ 2 = 3 \|A\|_2=3 ∥ A ∥ 2 = 3 ,而 λ max = 1 \lambda_{\max}=1 λ m a x = 1 。
条件数 定义为
κ ( A ) = ∥ A ∥ ⋅ ∥ A − 1 ∥ \kappa(A)=\|A\|\cdot\|A^{-1}\| κ ( A ) = ∥ A ∥ ⋅ ∥ A − 1 ∥
它满足 κ ( A ) ≥ 1 \kappa(A)\ge 1 κ ( A ) ≥ 1 (因为 1 = ∥ I ∥ = ∥ A A − 1 ∥ ≤ ∥ A ∥ ∥ A − 1 ∥ 1=\|I\|=\|AA^{-1}\|\le\|A\|\|A^{-1}\| 1 = ∥ I ∥ = ∥ A A − 1 ∥ ≤ ∥ A ∥∥ A − 1 ∥ )。κ \kappa κ 小叫良态,大叫病态。注意 κ \kappa κ 依赖你选哪个范数 ,κ 2 \kappa_2 κ 2 与 κ ∞ \kappa_\infty κ ∞ 可以差几倍,但「大不大」的结论通常一致。
条件数管什么?两个基本不等式:
∥ x − x ^ ∥ ∥ x ∥ ≤ κ ( A ) ∥ b − b ^ ∥ ∥ b ∥ \frac{\|x-\hat x\|}{\|x\|}\le \kappa(A)\,\frac{\|b-\hat b\|}{\|b\|} ∥ x ∥ ∥ x − x ^ ∥ ≤ κ ( A ) ∥ b ∥ ∥ b − b ^ ∥
右端项 的相对扰动被放大最多 κ \kappa κ 倍。若连 A A A 本身有扰动 E E E ,则
∥ x − x ^ ∥ ∥ x ∥ ≤ κ ( A ) 1 − κ ( A ) ∥ E ∥ / ∥ A ∥ ( ∥ E ∥ ∥ A ∥ + ∥ δ b ∥ ∥ b ∥ ) \frac{\|x-\hat x\|}{\|x\|}\le \frac{\kappa(A)}{1-\kappa(A)\|E\|/\|A\|}\left(\frac{\|E\|}{\|A\|}+\frac{\|\delta b\|}{\|b\|}\right) ∥ x ∥ ∥ x − x ^ ∥ ≤ 1 − κ ( A ) ∥ E ∥/∥ A ∥ κ ( A ) ( ∥ A ∥ ∥ E ∥ + ∥ b ∥ ∥ δ b ∥ )
这就是「有效数字会掉几位」的定量版本:κ ≈ 10 k \kappa\approx10^k κ ≈ 1 0 k 意味着大约损失 k k k 位十进制有效数字。 双精度有 16 位,所以 κ ≈ 10 16 \kappa\approx10^{16} κ ≈ 1 0 16 的矩阵在双精度下一位都不对 (1.3 节的 Hilbert 例子正是如此)。
2.2 三种三角分解 #
LU 分解 :把 A A A 拆成一个单位下三角 L L L 与一个上三角 U U U ,
A = L U A=LU A = LU
于是 A x = b Ax=b A x = b 变成两步三角形方程组:L y = b Ly=b L y = b (前代,O ( n 2 ) O(n^2) O ( n 2 ) )与 U x = y Ux=y U x = y (回代,O ( n 2 ) O(n^2) O ( n 2 ) )。
带主元的 LU :一般矩阵不保证 A = L U A=LU A = LU 存在(某个顺序主子式为零就卡住)。引进置换矩阵 P P P (单位矩阵换行得到的矩阵,满足 P − 1 = P T P^{-1}=P^{\mathsf T} P − 1 = P T 、det P = ± 1 \det P=\pm1 det P = ± 1 ),写成
P A = L U PA=LU P A = LU
P P P 的作用是把「绝对值最大的元素」换到当前主元位置。部分主元 (partial pivoting)只在当前列里挑最大;全主元 (complete pivoting)在整个右下子块里挑最大,更稳但比较本身就要 O ( n 3 ) O(n^3) O ( n 3 ) ,代价太高,实践中几乎只用部分主元。
Cholesky 分解 :A A A 对称正定时(27 讲),存在对角元为正的下三角 L L L 使
A = L L T A=LL^{\mathsf T} A = L L T
它不需要选主元 :Cholesky 只做「开平方 + 除法」,永远不构造需要互相比较的乘数,所以没有「小主元」这回事;而正定性保证每一步开方的数都为正,计算不会中断。乘法的另一半优势在运算量(见 3.4 节的对比)。
QR 分解 :A = Q R A=QR A = QR ,Q Q Q 正交(Q T Q = I Q^{\mathsf T}Q=I Q T Q = I ),R R R 上三角。m ≥ n m\ge n m ≥ n 时写成 A = Q ( R 0 ) A=Q\begin{pmatrix}R\\0\end{pmatrix} A = Q ( R 0 ) 。它的价值在于正交变换不改变 2 范数 :∥ A x − b ∥ 2 = ∥ Q R x − b ∥ 2 = ∥ R x − Q T b ∥ 2 \|Ax-b\|_2=\|QRx-b\|_2=\|Rx-Q^{\mathsf T}b\|_2 ∥ A x − b ∥ 2 = ∥ QR x − b ∥ 2 = ∥ R x − Q T b ∥ 2 ,于是最小二乘问题(24 讲)直接化成解一个上三角方程组 R x = c 1 Rx=c_1 R x = c 1 。
2.3 两种造 Q Q Q 的办法 #
Householder 变换 :取单位向量 w w w ,令
H = I − 2 w w T H=I-2ww^{\mathsf T} H = I − 2 w w T
H H H 对称、正交、H 2 = I H^2=I H 2 = I ,几何上是「关于过原点且垂直于 w w w 的平面的镜面反射」。给定 x ≠ 0 x\ne0 x = 0 ,取
v = x + sign ( x 1 ) ∥ x ∥ 2 e 1 , H = I − 2 v T v v v T v=x+\operatorname{sign}(x_1)\|x\|_2e_1,\qquad H=I-\frac{2}{v^{\mathsf T}v}vv^{\mathsf T} v = x + sign ( x 1 ) ∥ x ∥ 2 e 1 , H = I − v T v 2 v v T
就有 H x = − sign ( x 1 ) ∥ x ∥ 2 e 1 Hx=-\operatorname{sign}(x_1)\|x\|_2e_1 H x = − sign ( x 1 ) ∥ x ∥ 2 e 1 :一次反射把 x x x 的后面所有分量清零 。用 n n n 次反射就把 A A A 打成上三角。
Givens 旋转 :只在第 i , k i,k i , k 两个坐标上转一下,
G ( i , k , θ ) = ( 1 c s ⋱ − s c 1 ) , c 2 + s 2 = 1 G(i,k,\theta)=\begin{pmatrix}1&&&&\\&c&&s&\\&&\ddots&&\\&-s&&c&\\&&&&1\end{pmatrix},\qquad c^2+s^2=1 G ( i , k , θ ) = 1 c − s ⋱ s c 1 , c 2 + s 2 = 1
取 c = x i / x i 2 + x k 2 c=x_i/\sqrt{x_i^2+x_k^2} c = x i / x i 2 + x k 2 、s = x k / x i 2 + x k 2 s=x_k/\sqrt{x_i^2+x_k^2} s = x k / x i 2 + x k 2 ,就只把 x k x_k x k 一个分量清零。一次只杀一个元素 ,比 Householder 慢,但对带状、稀疏矩阵可以只转需要的地方,反而省。
2.4 迭代法的统一写法 #
把 A A A 拆成 A = D − L − U A=D-L-U A = D − L − U (D D D 是对角部分,L , U L,U L , U 分别是严格下、上三角部分的相反数 ),任何定常迭代都写成
x k + 1 = B x k + g x_{k+1}=Bx_k+g x k + 1 = B x k + g
误差满足 x − x k + 1 = B ( x − x k ) x-x_{k+1}=B(x-x_k) x − x k + 1 = B ( x − x k ) ,于是 x − x k = B k ( x − x 0 ) x-x_k=B^k(x-x_0) x − x k = B k ( x − x 0 ) 。收敛 ⟺ B k → 0 B^k\to0 B k → 0 ⟺ 谱半径 ρ ( B ) < 1 \rho(B)<1 ρ ( B ) < 1 。三种经典取法:
方法
迭代矩阵 B B B
一句话
Jacobi
B J = D − 1 ( L + U ) B_J=D^{-1}(L+U) B J = D − 1 ( L + U )
全用旧 值算新分量
Gauss–Seidel
B G S = ( D − L ) − 1 U B_{GS}=(D-L)^{-1}U B GS = ( D − L ) − 1 U
新算出的分量立刻 用上
SOR
L ω = ( D − ω L ) − 1 ( ( 1 − ω ) D + ω U ) L_\omega=(D-\omega L)^{-1}\big((1-\omega)D+\omega U\big) L ω = ( D − ω L ) − 1 ( ( 1 − ω ) D + ω U )
在旧值与 GS 值之间取加权平均,ω ∈ ( 0 , 2 ) \omega\in(0,2) ω ∈ ( 0 , 2 )
ω = 1 \omega=1 ω = 1 就是 GS,ω > 1 \omega>1 ω > 1 叫超松弛(加速),ω < 1 \omega<1 ω < 1 叫低松弛。ω ∉ ( 0 , 2 ) \omega\notin(0,2) ω ∈ / ( 0 , 2 ) 时必然发散 ,因为 det L ω = ( 1 − ω ) n \det L_\omega=(1-\omega)^n det L ω = ( 1 − ω ) n 给出 ρ ( L ω ) ≥ ∣ 1 − ω ∣ ≥ 1 \rho(L_\omega)\ge|1-\omega|\ge1 ρ ( L ω ) ≥ ∣1 − ω ∣ ≥ 1 。
2.5 一个贯穿全篇的矩阵 #
后面所有分解、所有迭代,都拿同一个矩阵算,你才能看出不同工具的视角差别。取
A = ( 2 − 1 0 − 1 2 − 1 0 − 1 2 ) A=\begin{pmatrix}2&-1&0\\-1&2&-1\\0&-1&2\end{pmatrix} A = 2 − 1 0 − 1 2 − 1 0 − 1 2
它是一维 Poisson 矩阵 :把 u ′ ′ = f u''=f u ′′ = f 在等距网格上用二阶差分离散,就得到它(乘以 − 1 / h 2 -1/h^2 − 1/ h 2 )。化学里的扩散方程、材料的稳态热传导,离散后都是它的高维推广。
先确认它是对称正定 的,用手算顺序主子式:2 > 0 2>0 2 > 0 ,det ( 2 − 1 − 1 2 ) = 3 > 0 \det\begin{pmatrix}2&-1\\-1&2\end{pmatrix}=3>0 det ( 2 − 1 − 1 2 ) = 3 > 0 ,det A = 4 > 0 \det A=4>0 det A = 4 > 0 。三个全正,由 27 讲的判据,A A A 正定。
它的特征值有闭式:
λ k = 2 − 2 cos k π 4 , k = 1 , 2 , 3 ⟹ λ = 2 − 2 , 2 , 2 + 2 \lambda_k=2-2\cos\frac{k\pi}{4},\qquad k=1,2,3\quad\Longrightarrow\quad \lambda=2-\sqrt2,\ 2,\ 2+\sqrt2 λ k = 2 − 2 cos 4 k π , k = 1 , 2 , 3 ⟹ λ = 2 − 2 , 2 , 2 + 2
即约 0.5858 , 2 , 3.4142 0.5858,\ 2,\ 3.4142 0.5858 , 2 , 3.4142 。于是
κ 2 ( A ) = 2 + 2 2 − 2 = 3 + 2 2 ≈ 5.83 \kappa_2(A)=\frac{2+\sqrt2}{2-\sqrt2}=3+2\sqrt2\approx5.83 κ 2 ( A ) = 2 − 2 2 + 2 = 3 + 2 2 ≈ 5.83
而 ∥ A ∥ ∞ = 4 \|A\|_\infty=4 ∥ A ∥ ∞ = 4 ,∥ A − 1 ∥ ∞ = 2 \|A^{-1}\|_\infty=2 ∥ A − 1 ∥ ∞ = 2 ,所以 κ ∞ ( A ) = 8 \kappa_\infty(A)=8 κ ∞ ( A ) = 8 。两个都是精确值 ,后面拿来对账。
它的逆也干净:
A − 1 = 1 4 ( 3 2 1 2 4 2 1 2 3 ) A^{-1}=\frac14\begin{pmatrix}3&2&1\\2&4&2\\1&2&3\end{pmatrix} A − 1 = 4 1 3 2 1 2 4 2 1 2 3
三、几个必须自己算一遍的结论 #
3.1 LU 手算:Doolittle 一遍到底 #
Doolittle 的规矩是「L L L 对角元取 1 1 1 」。按列推进,第 k k k 步用 U U U 的第 k k k 行去消 A A A 下面各行。
第一步,u 11 = a 11 = 2 u_{11}=a_{11}=2 u 11 = a 11 = 2 ,u 12 = − 1 u_{12}=-1 u 12 = − 1 ,u 13 = 0 u_{13}=0 u 13 = 0 ;乘数 l 21 = a 21 / u 11 = − 1 / 2 l_{21}=a_{21}/u_{11}=-1/2 l 21 = a 21 / u 11 = − 1/2 ,l 31 = 0 l_{31}=0 l 31 = 0 。
第二步,把第 1 1 1 行乘 − 1 / 2 -1/2 − 1/2 加到第 2 2 2 行:新 ( 2 , 2 ) (2,2) ( 2 , 2 ) 元 = 2 − 1 2 = 3 2 =2-\frac12= \frac32 = 2 − 2 1 = 2 3 ,新 ( 2 , 3 ) (2,3) ( 2 , 3 ) 元 = − 1 − 0 = − 1 =-1-0=-1 = − 1 − 0 = − 1 。故 u 22 = 3 2 u_{22}=\frac32 u 22 = 2 3 ,u 23 = − 1 u_{23}=-1 u 23 = − 1 ,l 32 = a 32 ( 1 ) / u 22 = ( − 1 ) / ( 3 2 ) = − 2 3 l_{32}=a^{(1)}_{32}/u_{22}=(-1)/(\frac32)=-\frac23 l 32 = a 32 ( 1 ) / u 22 = ( − 1 ) / ( 2 3 ) = − 3 2 。
第三步,u 33 = 2 − ( − 2 3 ) ( − 1 ) = 2 − 2 3 = 4 3 u_{33}=2-\big(-\frac23\big)(-1)=2-\frac23=\frac43 u 33 = 2 − ( − 3 2 ) ( − 1 ) = 2 − 3 2 = 3 4 。
于是
L = ( 1 0 0 − 1 2 1 0 0 − 2 3 1 ) , U = ( 2 − 1 0 0 3 2 − 1 0 0 4 3 ) L=\begin{pmatrix}1&0&0\\-\tfrac12&1&0\\0&-\tfrac23&1\end{pmatrix},\qquad U=\begin{pmatrix}2&-1&0\\0&\tfrac32&-1\\0&0&\tfrac43\end{pmatrix} L = 1 − 2 1 0 0 1 − 3 2 0 0 1 , U = 2 0 0 − 1 2 3 0 0 − 1 3 4
乘回去验一遍:( 2 , 2 ) (2,2) ( 2 , 2 ) 元 = ( − 1 2 ) ( − 1 ) + 3 2 = 2 =(-\frac12)(-1)+\frac32=2 = ( − 2 1 ) ( − 1 ) + 2 3 = 2 ✓,( 3 , 3 ) (3,3) ( 3 , 3 ) 元 = ( − 2 3 ) ( − 1 ) + 4 3 = 2 =(-\frac23)(-1)+\frac43=2 = ( − 3 2 ) ( − 1 ) + 3 4 = 2 ✓。主元是 2 , 3 2 , 4 3 2,\ \frac32,\ \frac43 2 , 2 3 , 3 4 ,全为正。
解 A x = b Ax=b A x = b ,取 b = ( 1 , 0 , 1 ) T b=(1,0,1)^{\mathsf T} b = ( 1 , 0 , 1 ) T (正好是 A 1 A\mathbf 1 A 1 ,所以真解是 1 \mathbf 1 1 )。前代 L y = b Ly=b L y = b :
y 1 = 1 , y 2 = 0 − ( − 1 2 ) ( 1 ) = 1 2 , y 3 = 1 − ( − 2 3 ) ( 1 2 ) = 4 3 y_1=1,\qquad y_2=0-\Big(-\tfrac12\Big)(1)=\tfrac12,\qquad y_3=1-\Big(-\tfrac23\Big)\Big(\tfrac12\Big)=\tfrac43 y 1 = 1 , y 2 = 0 − ( − 2 1 ) ( 1 ) = 2 1 , y 3 = 1 − ( − 3 2 ) ( 2 1 ) = 3 4
回代 U x = y Ux=y U x = y :x 3 = 4 / 3 4 / 3 = 1 x_3=\frac{4/3}{4/3}=1 x 3 = 4/3 4/3 = 1 ,x 2 = 1 2 + 1 3 2 = 1 x_2=\frac{\frac12+1}{\frac32}=1 x 2 = 2 3 2 1 + 1 = 1 ,x 1 = 1 + 1 2 = 1 x_1=\frac{1+1}{2}=1 x 1 = 2 1 + 1 = 1 。✓
LU 没有「解方程」,它只是把消元的过程 存下来:L L L 记的是「我做了哪些行变换」,U U U 记的是「消完长什么样」。所以 L L L 的乘数可以重复用于任意多个右端项——分解一次,解无穷多次 。这正是它比求逆划算的地方。
3.2 小主元为什么必须换行(一个四位算术的完整验算) #
这是全篇最该亲手算一遍的例子。取
A = ( 10 − 5 1 1 3 ) , b = ( 2 7 ) A=\begin{pmatrix}10^{-5}&1\\1&3\end{pmatrix},\qquad b=\begin{pmatrix}2\\7\end{pmatrix} A = ( 1 0 − 5 1 1 3 ) , b = ( 2 7 )
先看它有多良态:∥ A ∥ ∞ = 4 \|A\|_\infty=4 ∥ A ∥ ∞ = 4 ,而
A − 1 = 1 3 ⋅ 10 − 5 − 1 ( 3 − 1 − 1 10 − 5 ) A^{-1}=\frac{1}{3\cdot10^{-5}-1}\begin{pmatrix}3&-1\\-1&10^{-5}\end{pmatrix} A − 1 = 3 ⋅ 1 0 − 5 − 1 1 ( 3 − 1 − 1 1 0 − 5 )
其行和最大是 4 0.99997 ≈ 4.0001 \frac{4}{0.99997}\approx4.0001 0.99997 4 ≈ 4.0001 ,故 κ ∞ ( A ) ≈ 16.0005 \kappa_\infty(A)\approx16.0005 κ ∞ ( A ) ≈ 16.0005 。这是相当好的矩阵 ——κ ε \kappa\varepsilon κ ε 只有 10 − 15 10^{-15} 1 0 − 15 量级,双精度下能保住十几位有效数字。
精确解是
x 1 = 2 ⋅ 3 − 1 ⋅ 7 10 − 5 ⋅ 3 − 1 = − 1 − 0.99997 = 1.00003 … , x 2 = 2 − 10 − 5 x 1 = 1.99999 … x_1=\frac{2\cdot3-1\cdot7}{10^{-5}\cdot3-1}=\frac{-1}{-0.99997}=1.00003\ldots,\qquad x_2=2-10^{-5}x_1=1.99999\ldots x 1 = 1 0 − 5 ⋅ 3 − 1 2 ⋅ 3 − 1 ⋅ 7 = − 0.99997 − 1 = 1.00003 … , x 2 = 2 − 1 0 − 5 x 1 = 1.99999 …
不换行 ,用四位十进制浮点:
乘数 m = a 21 / a 11 = 1 / 10 − 5 = 10 5 m=a_{21}/a_{11}=1/10^{-5}=10^{5} m = a 21 / a 11 = 1/1 0 − 5 = 1 0 5 (四位正好存下)
u 22 = 3 − 10 5 ⋅ 1 = 3 − 100000 = − 99997 ⟶ − 1.000 × 10 5 u_{22}=3-10^{5}\cdot1=3-100000=-99997\ \longrightarrow\ -1.000\times10^{5} u 22 = 3 − 1 0 5 ⋅ 1 = 3 − 100000 = − 99997 ⟶ − 1.000 × 1 0 5
y 2 = 7 − 10 5 ⋅ 2 = − 199993 ⟶ − 2.000 × 10 5 y_2=7-10^{5}\cdot2=-199993\ \longrightarrow\ -2.000\times10^{5} y 2 = 7 − 1 0 5 ⋅ 2 = − 199993 ⟶ − 2.000 × 1 0 5
x 2 = ( − 2.000 × 10 5 ) / ( − 1.000 × 10 5 ) = 2.000 x_2=(-2.000\times10^{5})/(-1.000\times10^{5})=2.000 x 2 = ( − 2.000 × 1 0 5 ) / ( − 1.000 × 1 0 5 ) = 2.000
x 1 = ( 2 − 1 ⋅ 2.000 ) / 10 − 5 = 0 x_1=(2-1\cdot2.000)/10^{-5}=0 x 1 = ( 2 − 1 ⋅ 2.000 ) /1 0 − 5 = 0
得到 x ≈ ( 0 , 2.000 ) x\approx(0,\ 2.000) x ≈ ( 0 , 2.000 ) 。真解 x 1 = 1.00003 x_1=1.00003 x 1 = 1.00003 ,相对误差 100% 。
换行之后 (交换两行,b b b 也换):
A ′ = ( 1 3 10 − 5 1 ) , b ′ = ( 7 2 ) A'=\begin{pmatrix}1&3\\10^{-5}&1\end{pmatrix},\qquad b'=\begin{pmatrix}7\\2\end{pmatrix} A ′ = ( 1 1 0 − 5 3 1 ) , b ′ = ( 7 2 )
m = 10 − 5 / 1 = 10 − 5 m=10^{-5}/1=10^{-5} m = 1 0 − 5 /1 = 1 0 − 5
u 22 = 1 − 10 − 5 ⋅ 3 = 0.99997 ⟶ 1.000 u_{22}=1-10^{-5}\cdot3=0.99997\ \longrightarrow\ 1.000 u 22 = 1 − 1 0 − 5 ⋅ 3 = 0.99997 ⟶ 1.000
y 2 = 2 − 10 − 5 ⋅ 7 = 1.99993 ⟶ 2.000 y_2=2-10^{-5}\cdot7=1.99993\ \longrightarrow\ 2.000 y 2 = 2 − 1 0 − 5 ⋅ 7 = 1.99993 ⟶ 2.000
x 2 = 2.000 / 1.000 = 2.000 x_2=2.000/1.000=2.000 x 2 = 2.000/1.000 = 2.000 ,x 1 = ( 7 − 3 ⋅ 2.000 ) / 1 = 1.000 x_1=(7-3\cdot2.000)/1=1.000 x 1 = ( 7 − 3 ⋅ 2.000 ) /1 = 1.000
得到 ( 1.000 , 2.000 ) (1.000,\ 2.000) ( 1.000 , 2.000 ) ,四位全对 。
不换行时,u 22 = 3 − 10 5 u_{22}=3-10^5 u 22 = 3 − 1 0 5 是两个量级差 10 5 10^5 1 0 5 的数相减:3 3 3 的信息被完全吞掉(这正是 1.2 节的「相消」)。 换行后主元从 10 − 5 10^{-5} 1 0 − 5 变成 1 1 1 ,所有乘数都 ≤ 1 \le1 ≤ 1 (部分主元保证 ∣ l i j ∣ ≤ 1 |l_{ij}|\le1 ∣ l ij ∣ ≤ 1 ),误差不再被放大。注意:矩阵没变、条件数没变、精度没变,只有「先除哪个」变了。 这就是「不稳定」的教科书样子。
一般结论:带部分主元的 LU 对任何非奇异 A A A 都能进行到底,得到 P A = L U PA=LU P A = LU 。代价只是选主元时多 O ( n 2 ) O(n^2) O ( n 2 ) 次比较。
3.3 QR:Gram–Schmidt 与 Householder 的差别在哪 #
对 2.5 节的 A A A 走一遍古典 Gram–Schmidt (23 讲的算法,作用在列向量上)。
r 11 = ∥ a 1 ∥ = 2 2 + ( − 1 ) 2 = 5 r_{11}=\|a_1\|=\sqrt{2^2+(-1)^2}=\sqrt5 r 11 = ∥ a 1 ∥ = 2 2 + ( − 1 ) 2 = 5 ,q 1 = 1 5 ( 2 , − 1 , 0 ) T q_1=\frac{1}{\sqrt5}(2,-1,0)^{\mathsf T} q 1 = 5 1 ( 2 , − 1 , 0 ) T 。
r 12 = q 1 T a 2 = 1 5 ( 2 ⋅ ( − 1 ) + ( − 1 ) ⋅ 2 ) = − 4 5 r_{12}=q_1^{\mathsf T}a_2=\frac{1}{\sqrt5}(2\cdot(-1)+(-1)\cdot2)=-\frac{4}{\sqrt5} r 12 = q 1 T a 2 = 5 1 ( 2 ⋅ ( − 1 ) + ( − 1 ) ⋅ 2 ) = − 5 4 ,
v 2 = a 2 − r 12 q 1 = ( − 1 2 − 1 ) + 4 5 ( 2 − 1 0 ) = ( 3 / 5 6 / 5 − 1 ) v_2=a_2-r_{12}q_1=\begin{pmatrix}-1\\2\\-1\end{pmatrix}+\frac45\begin{pmatrix}2\\-1\\0\end{pmatrix}=\begin{pmatrix}3/5\\6/5\\-1\end{pmatrix} v 2 = a 2 − r 12 q 1 = − 1 2 − 1 + 5 4 2 − 1 0 = 3/5 6/5 − 1
r 22 = ∥ v 2 ∥ = 9 + 36 25 + 1 = 70 5 r_{22}=\|v_2\|=\sqrt{\frac{9+36}{25}+1}=\frac{\sqrt{70}}{5} r 22 = ∥ v 2 ∥ = 25 9 + 36 + 1 = 5 70 ,q 2 = 1 70 ( 3 , 6 , − 5 ) T q_2=\frac{1}{\sqrt{70}}(3,6,-5)^{\mathsf T} q 2 = 70 1 ( 3 , 6 , − 5 ) T 。
r 13 = q 1 T a 3 = 1 5 r_{13}=q_1^{\mathsf T}a_3=\frac{1}{\sqrt5} r 13 = q 1 T a 3 = 5 1 ,r 23 = q 2 T a 3 = − 16 70 r_{23}=q_2^{\mathsf T}a_3=-\frac{16}{\sqrt{70}} r 23 = q 2 T a 3 = − 70 16 ,于是
v 3 = a 3 − r 13 q 1 − r 23 q 2 = ( 2 7 , 4 7 , 6 7 ) , r 33 = 56 7 v_3=a_3-r_{13}q_1-r_{23}q_2=\Big(\tfrac27,\tfrac47,\tfrac67\Big),\qquad r_{33}=\frac{\sqrt{56}}{7} v 3 = a 3 − r 13 q 1 − r 23 q 2 = ( 7 2 , 7 4 , 7 6 ) , r 33 = 7 56
结果(检算:R R R 对角元之积 = 5 ⋅ 70 5 ⋅ 56 7 = 16 = 4 = det A =\sqrt5\cdot\frac{\sqrt{70}}{5}\cdot\frac{\sqrt{56}}{7}=\sqrt{16}=4=\det A = 5 ⋅ 5 70 ⋅ 7 56 = 16 = 4 = det A ✓)
R = ( 5 − 4 5 1 5 0 70 5 − 16 70 0 0 56 7 ) , Q = ( 2 5 3 70 1 14 − 1 5 6 70 2 14 0 − 5 70 3 14 ) R=\begin{pmatrix}\sqrt5&-\frac{4}{\sqrt5}&\frac{1}{\sqrt5}\\[2pt]0&\frac{\sqrt{70}}{5}&-\frac{16}{\sqrt{70}}\\[2pt]0&0&\frac{\sqrt{56}}{7}\end{pmatrix},\qquad Q=\begin{pmatrix}\frac{2}{\sqrt5}&\frac{3}{\sqrt{70}}&\frac{1}{\sqrt{14}}\\[2pt]-\frac{1}{\sqrt5}&\frac{6}{\sqrt{70}}&\frac{2}{\sqrt{14}}\\[2pt]0&-\frac{5}{\sqrt{70}}&\frac{3}{\sqrt{14}}\end{pmatrix} R = 5 0 0 − 5 4 5 70 0 5 1 − 70 16 7 56 , Q = 5 2 − 5 1 0 70 3 70 6 − 70 5 14 1 14 2 14 3
检查一下:R R R 的对角元平方是 5 , 14 5 , 8 7 5,\ \frac{14}{5},\ \frac87 5 , 5 14 , 7 8 。这不是巧合——由 A T A = R T Q T Q R = R T R A^{\mathsf T}A=R^{\mathsf T}Q^{\mathsf T}QR=R^{\mathsf T}R A T A = R T Q T QR = R T R (正交矩阵 Q T Q = I Q^{\mathsf T}Q=I Q T Q = I ),R T R^{\mathsf T} R T 正是 A T A A^{\mathsf T}A A T A 的 Cholesky 因子 (把 R R R 的对角元取正号后逐个比对,二者完全相同)。
A T A A^{\mathsf T}A A T A 的条件数是 33.97 33.97 33.97 ,而 A A A 只有 5.83 5.83 5.83 ——差了整整 5.83 5.83 5.83 倍,正好是 κ 2 ( A ) 2 \kappa_2(A)^2 κ 2 ( A ) 2 。 所以「R T R^{\mathsf T} R T 是 A T A A^{\mathsf T}A A T A 的 Cholesky 因子」这句话在数学上对、在数值上不该照做:直接对 A A A 做 QR 得到的 R R R 比对 A T A A^{\mathsf T}A A T A 做 Cholesky 稳定得多 ,虽然两者的 R R R 长得一样。差别在于「先乘出 A T A A^{\mathsf T}A A T A 」这一步会把 κ \kappa κ 平方。
为什么 Householder 更稳? 关键不在「公式更复杂」,而在误差的传播方式 :
Gram–Schmidt 算 q j q_j q j 时,是把已经算出的 q ^ 1 , … , q ^ j − 1 \hat q_1,\dots,\hat q_{j-1} q ^ 1 , … , q ^ j − 1 拿来减。这些 q ^ i \hat q_i q ^ i 本身已经带误差,而且它们不严格正交 。第 j j j 步的误差里有一份正比于 κ ( A ) 2 \kappa(A)^2 κ ( A ) 2 的项——条件数被平方 了。
Householder 从不显式造 Q Q Q :它对 A A A 连续左乘正交矩阵,每步只算 v v v 与 β = 2 / v T v \beta=2/v^{\mathsf T}v β = 2/ v T v 。正交矩阵在 2 范数下保距(∥ H A ∥ 2 = ∥ A ∥ 2 \|HA\|_2=\|A\|_2 ∥ H A ∥ 2 = ∥ A ∥ 2 ),误差不会被放大 ,总误差只正比于 κ ( A ) \kappa(A) κ ( A ) 。
用 Läuchli 矩阵 A = ( 1 1 1 ϵ 0 0 0 ϵ 0 0 0 ϵ ) A=\begin{pmatrix}1&1&1\\ \epsilon&0&0\\0&\epsilon&0\\0&0&\epsilon\end{pmatrix} A = 1 ϵ 0 0 1 0 ϵ 0 1 0 0 ϵ 实测(ϵ = 10 − 8 \epsilon=10^{-8} ϵ = 1 0 − 8 ,κ 2 ( A ) ≈ 1.7 × 10 8 \kappa_2(A)\approx1.7\times10^{8} κ 2 ( A ) ≈ 1.7 × 1 0 8 ),比较算出的 Q Q Q 有多正交:
算法
∥ Q T Q − I ∥ max \|Q^{\mathsf T}Q-I\|_{\max} ∥ Q T Q − I ∥ m a x
古典 Gram–Schmidt
5.0 × 10 − 1 5.0\times10^{-1} 5.0 × 1 0 − 1
修正 Gram–Schmidt(逐个减)
7.1 × 10 − 9 7.1\times10^{-9} 7.1 × 1 0 − 9
Householder
1.1 × 10 − 15 1.1\times10^{-15} 1.1 × 1 0 − 15
古典 GS 的 Q Q Q 已经完全不正交 (误差 0.5 0.5 0.5 ),Householder 稳在机器精度。这就是「κ \kappa κ 被平方」的具体样子。
解最小二乘时最诱人的写法是 A T A x = A T b A^{\mathsf T}Ax=A^{\mathsf T}b A T A x = A T b 。但 κ 2 ( A T A ) = κ 2 ( A ) 2 \kappa_2(A^{\mathsf T}A)=\kappa_2(A)^2 κ 2 ( A T A ) = κ 2 ( A ) 2 (这就是 29 讲提过的那件事)。 更进一步:若 A = ( 1 1 1 ϵ 0 0 0 ϵ 0 0 0 ϵ ) A=\begin{pmatrix}1&1&1\\ \epsilon&0&0\\0&\epsilon&0\\0&0&\epsilon\end{pmatrix} A = 1 ϵ 0 0 1 0 ϵ 0 1 0 0 ϵ 、ϵ = 10 − 3 \epsilon=10^{-3} ϵ = 1 0 − 3 ,在六位 十进制下 1 + ϵ 2 = 1 + 10 − 6 1+\epsilon^2=1+10^{-6} 1 + ϵ 2 = 1 + 1 0 − 6 被舍入成 1 1 1 ,A T A A^{\mathsf T}A A T A 变成全 1 1 1 矩阵,秩从 3 掉到 1 ,正规方程直接无解。 用 QR 就没有这一步:R R R 的对角元是 ∥ v j ∥ \|v_j\| ∥ v j ∥ ,不涉及平方。
Givens 什么时候赢? 对 2.5 节的 A A A ,要清掉 a 21 = − 1 a_{21}=-1 a 21 = − 1 :取 c = 2 / 5 c=2/\sqrt5 c = 2/ 5 、s = − 1 / 5 s=-1/\sqrt5 s = − 1/ 5 ,旋转后第一行变成 ( 5 , − 4 / 5 , 1 / 5 ) (\sqrt5,\ -4/\sqrt5,\ 1/\sqrt5) ( 5 , − 4/ 5 , 1/ 5 ) ——和上面 R R R 的第一行一模一样。但 Givens 每次只动两行,做完整三角化要 ∼ n 2 / 2 \sim n^2/2 ∼ n 2 /2 次旋转;Householder 只要 n n n 次反射。所以稠密矩阵用 Householder,带状或只需要局部清零(比如把某个元素单独打掉)时才用 Givens。
3.4 Cholesky:为什么它比 LU 便宜一半,而且不用选主元 #
对 2.5 节的 A A A 逐元比较 A = L L T A=LL^{\mathsf T} A = L L T 。记 L = ( l i j ) L=(l_{ij}) L = ( l ij ) 下三角。
( 1 , 1 ) (1,1) ( 1 , 1 ) :l 11 2 = 2 ⇒ l 11 = 2 l_{11}^2=2\Rightarrow l_{11}=\sqrt2 l 11 2 = 2 ⇒ l 11 = 2 。( 2 , 1 ) (2,1) ( 2 , 1 ) :l 21 l 11 = − 1 ⇒ l 21 = − 1 / 2 l_{21}l_{11}=-1\Rightarrow l_{21}=-1/\sqrt2 l 21 l 11 = − 1 ⇒ l 21 = − 1/ 2 。( 2 , 2 ) (2,2) ( 2 , 2 ) :l 21 2 + l 22 2 = 2 ⇒ l 22 = 2 − 1 2 = 3 / 2 l_{21}^2+l_{22}^2=2\Rightarrow l_{22}=\sqrt{2-\frac12}=\sqrt{3/2} l 21 2 + l 22 2 = 2 ⇒ l 22 = 2 − 2 1 = 3/2 。( 3 , 2 ) (3,2) ( 3 , 2 ) :l 31 l 21 + l 32 l 22 = − 1 l_{31}l_{21}+l_{32}l_{22}=-1 l 31 l 21 + l 32 l 22 = − 1 ,而 l 31 = 0 l_{31}=0 l 31 = 0 ,故 l 32 = − 1 / 3 / 2 = − 2 / 3 l_{32}=-1/\sqrt{3/2}=-\sqrt{2/3} l 32 = − 1/ 3/2 = − 2/3 。( 3 , 3 ) (3,3) ( 3 , 3 ) :l 32 2 + l 33 2 = 2 ⇒ l 33 = 2 − 2 3 = 2 3 l_{32}^2+l_{33}^2=2\Rightarrow l_{33}=\sqrt{2-\frac23}=\frac{2}{\sqrt3} l 32 2 + l 33 2 = 2 ⇒ l 33 = 2 − 3 2 = 3 2 。
L = ( 2 0 0 − 1 2 3 2 0 0 − 2 3 2 3 ) L=\begin{pmatrix}\sqrt2&0&0\\-\frac{1}{\sqrt2}&\sqrt{\frac32}&0\\0&-\sqrt{\frac23}&\frac{2}{\sqrt3}\end{pmatrix} L = 2 − 2 1 0 0 2 3 − 3 2 0 0 3 2
把它的对角元平方,和 3.1 节的 LU 主元逐个对照:
2 , 3 2 , 4 3 ⏟ LU 主元 ⟺ 2 , 3 2 , 4 3 ⏟ l 11 2 , l 22 2 , l 33 2 \underbrace{2,\ \tfrac32,\ \tfrac43}_{\text{LU 主元}}\qquad\Longleftrightarrow\qquad\underbrace{2,\ \tfrac32,\ \tfrac43}_{l_{11}^2,\ l_{22}^2,\ l_{33}^2} LU 主元 2 , 2 3 , 3 4 ⟺ l 11 2 , l 22 2 , l 33 2 2 , 2 3 , 3 4
完全一致。 这不是巧合:Cholesky 就是「L D L T LDL^{\mathsf T} L D L T 分解里把对角元开方塞进 L L L 」,而 L D L T LDL^{\mathsf T} L D L T 的 D D D 正是 LU 的主元。A A A 正定时每个主元恒正,开方永远合法——所以不需要选主元 。
代价对比:LU 约 2 3 n 3 \frac23n^3 3 2 n 3 次乘法,Cholesky 约 1 3 n 3 \frac13n^3 3 1 n 3 ,省一半 ,还省一半存储(只存一个三角)。
若某步出现 l k k 2 ≤ 0 l_{kk}^2\le0 l k k 2 ≤ 0 ,说明 A A A 不正定,计算立刻停下。这比算全部特征值快得多。 例:A = ( 1 2 2 1 ) A=\begin{pmatrix}1&2\\2&1\end{pmatrix} A = ( 1 2 2 1 ) 对称但特征值是 − 1 , 3 -1,3 − 1 , 3 ,不正定;做 Cholesky 时 l 11 = 1 l_{11}=1 l 11 = 1 、l 21 = 2 l_{21}=2 l 21 = 2 ,到 l 22 2 = 1 − 4 = − 3 l_{22}^2=1-4=-3 l 22 2 = 1 − 4 = − 3 就崩了。
3.5 条件数:两个具体矩阵,一个良态一个病态 #
良态的那一个。 2.5 节的 A A A 有 κ 2 = 3 + 2 2 ≈ 5.83 \kappa_2=3+2\sqrt2\approx5.83 κ 2 = 3 + 2 2 ≈ 5.83 。这个数很实在:右端项相对扰动 10 − 3 10^{-3} 1 0 − 3 ,解的相对误差不超过 5.83 × 10 − 3 5.83\times10^{-3} 5.83 × 1 0 − 3 ——大约掉半位有效数字 。
病态的那一个:Hilbert 矩阵。 H n = ( 1 i + j − 1 ) H_n=\big(\frac{1}{i+j-1}\big) H n = ( i + j − 1 1 ) ,经典病态样本:
n n n
3
6
9
12
κ 2 ( H n ) \kappa_2(H_n) κ 2 ( H n )
5.2 × 10 2 5.2\times10^{2} 5.2 × 1 0 2
1.5 × 10 7 1.5\times10^{7} 1.5 × 1 0 7
4.9 × 10 11 4.9\times10^{11} 4.9 × 1 0 11
1.8 × 10 16 1.8\times10^{16} 1.8 × 1 0 16
n = 12 n=12 n = 12 时 κ ⋅ ε ≈ 1.8 × 10 16 × 1.1 × 10 − 16 ≈ 2 > 1 \kappa\cdot\varepsilon\approx1.8\times10^{16}\times1.1\times10^{-16}\approx2>1 κ ⋅ ε ≈ 1.8 × 1 0 16 × 1.1 × 1 0 − 16 ≈ 2 > 1 。双精度下一位有效数字都不剩 ——这就是 1.3 节那个「残差 10 − 16 10^{-16} 1 0 − 16 、误差 0.70 0.70 0.70 」的来源。
拿 3 × 3 3\times3 3 × 3 做一次能手算的放大实验。H 3 = ( 1 1 2 1 3 1 2 1 3 1 4 1 3 1 4 1 5 ) H_3=\begin{pmatrix}1&\frac12&\frac13\\ \frac12&\frac13&\frac14\\ \frac13&\frac14&\frac15\end{pmatrix} H 3 = 1 2 1 3 1 2 1 3 1 4 1 3 1 4 1 5 1 ,κ 2 ( H 3 ) ≈ 524 \kappa_2(H_3)\approx524 κ 2 ( H 3 ) ≈ 524 ,κ ∞ ( H 3 ) = 748 \kappa_\infty(H_3)=748 κ ∞ ( H 3 ) = 748 。取 x = 1 x=\mathbf 1 x = 1 ,b = H 3 1 = ( 11 6 , 13 12 , 47 60 ) b=H_3\mathbf 1=\big(\frac{11}{6},\frac{13}{12},\frac{47}{60}\big) b = H 3 1 = ( 6 11 , 12 13 , 60 47 ) 。把 b 1 b_1 b 1 改动 1 % 1\% 1% :
∥ δ b ∥ ∞ ∥ b ∥ ∞ = 0.01 ⟹ ∥ δ x ∥ ∞ ∥ x ∥ ∞ = 0.66 \frac{\|\delta b\|_\infty}{\|b\|_\infty}=0.01\qquad\Longrightarrow\qquad \frac{\|\delta x\|_\infty}{\|x\|_\infty}=0.66 ∥ b ∥ ∞ ∥ δ b ∥ ∞ = 0.01 ⟹ ∥ x ∥ ∞ ∥ δ x ∥ ∞ = 0.66
输入动 1 % 1\% 1% ,输出动 66 % 66\% 66% ,放大约 66 66 66 倍。 这个 66 落在 κ \kappa κ 的界内(κ ∞ = 748 \kappa_\infty=748 κ ∞ = 748 是上界,不是等号),方向完全正确。手算可以验:x ^ = ( 1.165 , 0.34 , 1.55 ) \hat x=(1.165,\ 0.34,\ 1.55) x ^ = ( 1.165 , 0.34 , 1.55 ) 。
由 29 讲,κ 2 ( A ) = σ max / σ min \kappa_2(A)=\sigma_{\max}/\sigma_{\min} κ 2 ( A ) = σ m a x / σ m i n ,即单位球被 A A A 映成的椭圆的轴比 。 条件数大 = 这个椭圆很扁 = 有些方向被压得几乎为零 = 反过来求逆时那个方向被放到极大,任何一点扰动都被放大。 所以「病态」与「接近奇异」是同一件事的两种说法。
3.6 迭代法:三种方法的谱半径,一次算清 #
对 2.5 节的 A = D − L − U A=D-L-U A = D − L − U ,D = 2 I D=2I D = 2 I ,
B J = D − 1 ( L + U ) = ( 0 1 2 0 1 2 0 1 2 0 1 2 0 ) B_J=D^{-1}(L+U)=\begin{pmatrix}0&\frac12&0\\ \frac12&0&\frac12\\ 0&\frac12&0\end{pmatrix} B J = D − 1 ( L + U ) = 0 2 1 0 2 1 0 2 1 0 2 1 0
它的特征多项式由三对角行列式直接展开:B J B_J B J 的第一、三行只有第 2 个位置非零,故
det ( λ I − B J ) = λ ⋅ λ ⋅ λ − λ ( 1 2 ⋅ 1 2 + 1 2 ⋅ 1 2 ) = λ 3 − 1 2 λ = λ ( λ 2 − 1 2 ) \det(\lambda I-B_J)=\lambda\cdot\lambda\cdot\lambda-\lambda\Big(\tfrac12\cdot\tfrac12+\tfrac12\cdot\tfrac12\Big)=\lambda^3-\tfrac12\lambda=\lambda\Big(\lambda^2-\tfrac12\Big) det ( λ I − B J ) = λ ⋅ λ ⋅ λ − λ ( 2 1 ⋅ 2 1 + 2 1 ⋅ 2 1 ) = λ 3 − 2 1 λ = λ ( λ 2 − 2 1 )
(消去法是:第一行与第三行的非零元只通过中间行耦合,两项 1 4 + 1 4 \frac14+\frac14 4 1 + 4 1 就是走「上行—中行—下行」这两条路径的贡献。)于是
ρ ( B J ) = 1 2 = 2 2 ≈ 0.7071 \rho(B_J)=\frac{1}{\sqrt2}=\frac{\sqrt2}{2}\approx0.7071 ρ ( B J ) = 2 1 = 2 2 ≈ 0.7071
Gauss–Seidel 的迭代矩阵是
B G S = ( D − L ) − 1 U = ( 1 2 0 0 1 4 1 2 0 1 8 1 4 1 2 ) ( 0 1 0 0 0 1 0 0 0 ) = ( 0 1 2 0 0 1 4 1 2 0 1 8 1 4 ) B_{GS}=(D-L)^{-1}U=\begin{pmatrix}\frac12&0&0\\[2pt]\frac14&\frac12&0\\[2pt]\frac18&\frac14&\frac12\end{pmatrix}\begin{pmatrix}0&1&0\\0&0&1\\0&0&0\end{pmatrix}=\begin{pmatrix}0&\frac12&0\\[2pt]0&\frac14&\frac12\\[2pt]0&\frac18&\frac14\end{pmatrix} B GS = ( D − L ) − 1 U = 2 1 4 1 8 1 0 2 1 4 1 0 0 2 1 0 0 0 1 0 0 0 1 0 = 0 0 0 2 1 4 1 8 1 0 2 1 4 1
其特征多项式是 λ 2 ( λ − 1 2 ) \lambda^2\big(\lambda-\frac12\big) λ 2 ( λ − 2 1 ) (直接展开可得,也可由 B G S B_{GS} B GS 秩为 2 2 2 预判至少有一个零特征值),于是 ρ ( B G S ) = 1 2 \rho(B_{GS})=\frac12 ρ ( B GS ) = 2 1 。这个结果不用硬算也能预判:A A A 是三对角的,具有「性质 A」(存在置换把它化成分块二循环 形式 P A P T = ( D 11 M 12 M 21 D 22 ) PAP^{\mathsf T}=\begin{pmatrix}D_{11}&M_{12}\\M_{21}&D_{22}\end{pmatrix} P A P T = ( D 11 M 21 M 12 D 22 ) ,其中 D 11 , D 22 D_{11},D_{22} D 11 , D 22 是对角块、M 12 , M 21 M_{12},M_{21} M 12 , M 21 一般非零——注意这不是 分块对角),而相容次序保证
ρ ( B G S ) = ρ ( B J ) 2 = ( 1 2 ) 2 = 1 2 \rho(B_{GS})=\rho(B_J)^2=\Big(\frac{1}{\sqrt2}\Big)^2=\frac12 ρ ( B GS ) = ρ ( B J ) 2 = ( 2 1 ) 2 = 2 1
GS 的收敛因子正好是 Jacobi 的平方 ——每步 GS 相当于走了两步 Jacobi,因为新算出的分量立刻被下游用了。
SOR 的最优松弛因子(同样由相容次序理论给出,μ = ρ ( B J ) \mu=\rho(B_J) μ = ρ ( B J ) )
ω opt = 2 1 + 1 − μ 2 = 2 1 + 1 2 ≈ 1.1716 , ρ ( L ω opt ) = ω opt − 1 ≈ 0.1716 \omega_{\text{opt}}=\frac{2}{1+\sqrt{1-\mu^2}}=\frac{2}{1+\frac{1}{\sqrt2}}\approx1.1716,\qquad \rho(L_{\omega_{\text{opt}}})=\omega_{\text{opt}}-1\approx0.1716 ω opt = 1 + 1 − μ 2 2 = 1 + 2 1 2 ≈ 1.1716 , ρ ( L ω opt ) = ω opt − 1 ≈ 0.1716
三个数放在一起看 :0.7071 → 0.5 → 0.1716 0.7071\to0.5\to0.1716 0.7071 → 0.5 → 0.1716 。要把误差压到 10 − 6 10^{-6} 1 0 − 6 ,大致需要 ln ( 10 − 6 ) / ln ρ \ln(10^{-6})/\ln\rho ln ( 1 0 − 6 ) / ln ρ 步:
方法
ρ \rho ρ
约需步数(误差 10 − 6 10^{-6} 1 0 − 6 )
Jacobi
0.7071 0.7071 0.7071
40 40 40
Gauss–Seidel
0.5 0.5 0.5
20 20 20
SOR(ω = 1.1716 \omega=1.1716 ω = 1.1716 )
0.1716 0.1716 0.1716
8 8 8
SOR 用对了 ω \omega ω ,比 Jacobi 快 5 倍。
收敛的充分条件 (不用算谱半径就能用的判据):
严格对角占优 (∣ a i i ∣ > ∑ j ≠ i ∣ a i j ∣ |a_{ii}|>\sum_{j\ne i}|a_{ij}| ∣ a ii ∣ > ∑ j = i ∣ a ij ∣ 对每行成立)⟹ Jacobi 与 GS 都收敛,因为 ∥ B J ∥ ∞ < 1 \|B_J\|_\infty<1 ∥ B J ∥ ∞ < 1 。
不可约 + 弱对角占优 (允许等号,但至少一处严格)⟹ 也收敛。注意 :此时不能 推出 ρ ( B G S ) < ρ ( B J ) \rho(B_{GS})<\rho(B_J) ρ ( B GS ) < ρ ( B J ) ;要得到这条比较,还需要 a i j ≤ 0 ( i ≠ j ) a_{ij}\le0\ (i\ne j) a ij ≤ 0 ( i = j ) (即 A A A 是 M-矩阵,Stein–Rosenberg 定理)。缺这个前提有反例:A = ( 8 3 − 3 2 6 3 − 2 − 3 6 ) A=\begin{pmatrix}8&3&-3\\2&6&3\\-2&-3&6\end{pmatrix} A = 8 2 − 2 3 6 − 3 − 3 3 6 三行都严格对角占优,B J B_J B J 幂零故 ρ ( B J ) = 0 \rho(B_J)=0 ρ ( B J ) = 0 ,而 ρ ( B G S ) ≈ 0.283 > ρ ( B J ) \rho(B_{GS})\approx0.283>\rho(B_J) ρ ( B GS ) ≈ 0.283 > ρ ( B J ) 。所以「GS 比 Jacobi 快」不是普遍结论。
A A A 对称正定 ⟹ GS 一定收敛;SOR 对一切 ω ∈ ( 0 , 2 ) \omega\in(0,2) ω ∈ ( 0 , 2 ) 收敛。
注意 2.5 节的 A A A 只是弱 对角占优(中间行 2 = 1 + 1 2=1+1 2 = 1 + 1 ),严格判据用不上,但它不可约,所以仍然收敛——这解释了为什么它是个好例子而不是反例。
Jacobi 与 Gauss–Seidel 没有一般的优劣 取 A 1 = ( 1 2 − 2 1 1 1 2 2 1 ) A_1=\begin{pmatrix}1&2&-2\\1&1&1\\2&2&1\end{pmatrix} A 1 = 1 1 2 2 1 2 − 2 1 1 。它的 Jacobi 迭代矩阵 B J = D − 1 ( L + U ) B_J=D^{-1}(L+U) B J = D − 1 ( L + U ) 满足 B J 3 = 0 B_J^3=0 B J 3 = 0 (幂零 ),于是 ρ ( B J ) = 0 \rho(B_J)=0 ρ ( B J ) = 0 ,Jacobi 三步就得到精确解 。 而 B G S = ( D − L ) − 1 U = ( 0 − 2 2 0 2 − 3 0 0 2 ) B_{GS}=(D-L)^{-1}U=\begin{pmatrix}0&-2&2\\0&2&-3\\0&0&2\end{pmatrix} B GS = ( D − L ) − 1 U = 0 0 0 − 2 2 0 2 − 3 2 ,特征多项式 λ ( λ − 2 ) 2 \lambda(\lambda-2)^2 λ ( λ − 2 ) 2 (特征值 0 , 2 , 2 0,2,2 0 , 2 , 2 ),故 ρ ( B G S ) = 2 > 1 \rho(B_{GS})=2>1 ρ ( B GS ) = 2 > 1 ,Gauss–Seidel 发散 。 这说明「GS 总是比 Jacobi 好」是错的;两者之间只有「在特定条件下」的比较定理。
3.7 幂法与反幂法:收敛速度是可以算出来的 #
幂法 的迭代格式是:取 ∥ u 0 ∥ ∞ = 1 \|u_0\|_\infty=1 ∥ u 0 ∥ ∞ = 1 ,反复做
y k = A u k − 1 , μ k = y k 中绝对值最大的分量 , u k = y k / μ k y_k=Au_{k-1},\qquad \mu_k=\text{$y_k$ 中绝对值最大的分量},\qquad u_k=y_k/\mu_k y k = A u k − 1 , μ k = y k 中绝对值最大的分量 , u k = y k / μ k
理由很直白:若 A A A 可对角化、∣ λ 1 ∣ > ∣ λ 2 ∣ ≥ ⋯ |\lambda_1|>|\lambda_2|\ge\cdots ∣ λ 1 ∣ > ∣ λ 2 ∣ ≥ ⋯ ,把 u 0 = ∑ α j x j u_0=\sum\alpha_jx_j u 0 = ∑ α j x j 展开,
A k u 0 = λ 1 k ( α 1 x 1 + ∑ j ≥ 2 α j ( λ j λ 1 ) k x j ) A^ku_0=\lambda_1^k\Big(\alpha_1x_1+\sum_{j\ge2}\alpha_j\Big(\frac{\lambda_j}{\lambda_1}\Big)^kx_j\Big) A k u 0 = λ 1 k ( α 1 x 1 + j ≥ 2 ∑ α j ( λ 1 λ j ) k x j )
括号里第二项按 ∣ λ 2 / λ 1 ∣ k |\lambda_2/\lambda_1|^k ∣ λ 2 / λ 1 ∣ k 衰减,所以方向收敛到 x 1 x_1 x 1 ,μ k → λ 1 \mu_k\to\lambda_1 μ k → λ 1 。收敛速度就是 ∣ λ 2 / λ 1 ∣ |\lambda_2/\lambda_1| ∣ λ 2 / λ 1 ∣ 。
对 2.5 节的 A A A ,λ 1 = 2 + 2 \lambda_1=2+\sqrt2 λ 1 = 2 + 2 、λ 2 = 2 \lambda_2=2 λ 2 = 2 ,故理论上
∣ λ 2 λ 1 ∣ = 2 2 + 2 = 2 − 2 ≈ 0.5858 \Big|\frac{\lambda_2}{\lambda_1}\Big|=\frac{2}{2+\sqrt2}=2-\sqrt2\approx0.5858 λ 1 λ 2 = 2 + 2 2 = 2 − 2 ≈ 0.5858
取 u 0 = ( 1 , 1 , 1 ) T u_0=(1,1,1)^{\mathsf T} u 0 = ( 1 , 1 , 1 ) T ,手算前几步(μ k \mu_k μ k 是 y k y_k y k 绝对值最大的分量,会带符号):
k k k
1
2
3
4
5
6
7
μ k \mu_k μ k
1 1 1
2 2 2
− 4 -4 − 4
3.5 3.5 3.5
3.4286 3.4286 3.4286
3.4167 3.4167 3.4167
3.4146 3.4146 3.4146
趋向 3.4142 3.4142 3.4142 。要误差到 10 − 6 10^{-6} 1 0 − 6 ,按理论比值需 ln ( 10 − 6 ) / ln ( 0.5858 ) ≈ 26 \ln(10^{-6})/\ln(0.5858)\approx26 ln ( 1 0 − 6 ) / ln ( 0.5858 ) ≈ 26 步。
上表从第 4 步起,相邻误差之比稳定在 0.1716 0.1716 0.1716 ,比理论的 0.5858 0.5858 0.5858 小得多。原因是这个初值恰好把 λ 2 \lambda_2 λ 2 的成分消掉了 :A A A 的 λ 2 = 2 \lambda_2=2 λ 2 = 2 对应特征向量 ( 1 , 0 , − 1 ) T (1,0,-1)^{\mathsf T} ( 1 , 0 , − 1 ) T ,而 u 0 = 1 u_0=\mathbf 1 u 0 = 1 与它正交(1 T ( 1 , 0 , − 1 ) = 0 \mathbf 1^{\mathsf T}(1,0,-1)=0 1 T ( 1 , 0 , − 1 ) = 0 ),所以展开式里 α 2 = 0 \alpha_2=0 α 2 = 0 ,衰减由下一个比值
λ 3 λ 1 = 2 − 2 2 + 2 = ( 2 − 1 ) 2 ≈ 0.1716 \frac{\lambda_3}{\lambda_1}=\frac{2-\sqrt2}{2+\sqrt2}=(\sqrt2-1)^2\approx0.1716 λ 1 λ 3 = 2 + 2 2 − 2 = ( 2 − 1 ) 2 ≈ 0.1716
接管。(λ 3 = 2 − 2 \lambda_3=2-\sqrt2 λ 3 = 2 − 2 对应的是两端同号的「慢变」模态,λ 1 \lambda_1 λ 1 对应正负交替的「快变」模态。)
这是特例,不是普遍规律 。把同一个谱换一个朝向(例如取 A = Q Λ Q T A=Q\Lambda Q^{\mathsf T} A = Q Λ Q T 、Q Q Q 是一个随机的正交矩阵),α 2 ≠ 0 \alpha_2\ne0 α 2 = 0 ,实测比值立刻回到 0.5858 0.5858 0.5858 。所以:理论界 ∣ λ 2 / λ 1 ∣ |\lambda_2/\lambda_1| ∣ λ 2 / λ 1 ∣ 是「最坏情况」,实际速度取决于初值在各特征方向上的投影。 幂法的收敛速度不能只看矩阵,还要看初值。 若把比值真的做成 0.99 0.99 0.99 (两个特征值几乎一样大),则需要约 ln ( 10 − 6 ) / ln ( 0.99 ) ≈ 1375 \ln(10^{-6})/\ln(0.99)\approx1375 ln ( 1 0 − 6 ) / ln ( 0.99 ) ≈ 1375 步——这才是幂法「慢」的定量含义 。
反幂法 :对 A − 1 A^{-1} A − 1 用幂法,收敛到 ∣ λ ∣ |\lambda| ∣ λ ∣ 最小 的特征值,速度由 ∣ λ n / λ n − 1 ∣ |\lambda_n/\lambda_{n-1}| ∣ λ n / λ n − 1 ∣ 决定。每步要解 A y = z Ay=z A y = z ,但 LU 只分解一次,之后每步两个三角形方程组,O ( n 2 ) O(n^2) O ( n 2 ) 。
带位移的反幂法 :对 A − μ I A-\mu I A − μ I 用反幂法。若 μ \mu μ 接近某个特征值 λ i \lambda_i λ i ,则
∣ λ i − μ ∣ ∣ λ j − μ ∣ 极小 ⟹ 一两步就收敛 \frac{|\lambda_i-\mu|}{|\lambda_j-\mu|}\ \text{极小}\quad\Longrightarrow\quad\text{一两步就收敛} ∣ λ j − μ ∣ ∣ λ i − μ ∣ 极小 ⟹ 一两步就收敛
代价是 A − μ I A-\mu I A − μ I 接近奇异,每步解的是病态方程组——但病态不影响特征向量的收敛 ,这是反幂法最反直觉、也最有用的一条性质。
3.8 Krylov 子空间:为什么大规模稀疏问题必须用迭代法 #
直接法在大矩阵上会撞两堵墙。
第一堵是运算量 。LU 是 O ( n 3 ) O(n^3) O ( n 3 ) 。n = 10 6 n=10^6 n = 1 0 6 时 2 n 3 / 3 ≈ 6.7 × 10 17 2n^3/3\approx6.7\times10^{17} 2 n 3 /3 ≈ 6.7 × 1 0 17 次乘法,按每秒 10 10 10^{10} 1 0 10 次算要两年多。
第二堵更致命:稀疏性会在消元中丢失(fill-in) 。用二维 Laplacian(N × N N\times N N × N 网格,n = N 2 n=N^2 n = N 2 )实测非零元个数:
网格 N N N
n = N 2 n=N^2 n = N 2
A A A 的非零元
LU 因子的非零元
倍数
4
16
64
118
1.8×
8
64
288
974
3.4×
12
144
672
3334
5.0×
非零元随 N N N 稳定增长,倍数一路往上。N = 1000 N=1000 N = 1000 (n = 10 6 n=10^6 n = 1 0 6 )时,即使用带宽优化,分解也要约 2 × 10 12 2\times10^{12} 2 × 1 0 12 次运算、存 10 9 10^9 1 0 9 个双精度数——8 GB 只为了存因子 。
迭代法只做一件事:矩阵乘向量。 每步 O ( nnz ( A ) ) O(\text{nnz}(A)) O ( nnz ( A )) ,稀疏时是 O ( n ) O(n) O ( n ) 。它从不修改 A A A ,所以稀疏性永远不会丢。
共轭梯度(CG) 用在对称正定情形。它不是「沿负梯度走」(那是最速下降,很慢),而是让每一步的搜索方向关于 A A A 共轭 (p i T A p j = 0 p_i^{\mathsf T}Ap_j=0 p i T A p j = 0 ,i ≠ j i\ne j i = j ),从而每一步都在一个新的维度 上取到最优。迭代格式:
α k = r k T r k p k T A p k , x k + 1 = x k + α k p k , r k + 1 = r k − α k A p k , β k = r k + 1 T r k + 1 r k T r k , p k + 1 = r k + 1 + β k p k \alpha_k=\frac{r_k^{\mathsf T}r_k}{p_k^{\mathsf T}Ap_k},\quad x_{k+1}=x_k+\alpha_kp_k,\quad r_{k+1}=r_k-\alpha_kAp_k,\quad \beta_k=\frac{r_{k+1}^{\mathsf T}r_{k+1}}{r_k^{\mathsf T}r_k},\quad p_{k+1}=r_{k+1}+\beta_kp_k α k = p k T A p k r k T r k , x k + 1 = x k + α k p k , r k + 1 = r k − α k A p k , β k = r k T r k r k + 1 T r k + 1 , p k + 1 = r k + 1 + β k p k
三个性质必须记住:
理论上 n n n 步必到精确解 (Krylov 子空间维数不超过 n n n )。所以 CG 严格说是直接法。
实际上把它当迭代法用 ,残差小于阈值就停,通常远早于 n n n 步。
误差界 是
∥ x k − x ∗ ∥ A ≤ 2 ( κ − 1 κ + 1 ) k ∥ x 0 − x ∗ ∥ A \|x_k-x^*\|_A\le 2\left(\frac{\sqrt{\kappa}-1}{\sqrt{\kappa}+1}\right)^k\|x_0-x^*\|_A ∥ x k − x ∗ ∥ A ≤ 2 ( κ + 1 κ − 1 ) k ∥ x 0 − x ∗ ∥ A
其中 ∥ v ∥ A = v T A v \|v\|_A=\sqrt{v^{\mathsf T}Av} ∥ v ∥ A = v T A v 。收敛速度只由 κ \sqrt\kappa κ 决定 ——这是 CG 相对别的迭代法最大的优势:条件数被开了一次方。
对 2.5 节的 A A A ,κ = 3 + 2 2 \kappa=3+2\sqrt2 κ = 3 + 2 2 ,κ = 1 + 2 \sqrt\kappa=1+\sqrt2 κ = 1 + 2 ,于是
κ − 1 κ + 1 = 2 2 + 2 = 2 − 1 ≈ 0.4142 \frac{\sqrt\kappa-1}{\sqrt\kappa+1}=\frac{\sqrt2}{2+\sqrt2}=\sqrt2-1\approx0.4142 κ + 1 κ − 1 = 2 + 2 2 = 2 − 1 ≈ 0.4142
界说每步误差缩到 0.4142 0.4142 0.4142 倍。实测更快:取 b = A 1 = ( 1 , 0 , 1 ) T b=A\mathbf 1=(1,0,1)^{\mathsf T} b = A 1 = ( 1 , 0 , 1 ) T ,CG 两步就到精确解 (残差历史 1.41 → 1.00 → 0 1.41\to1.00\to0 1.41 → 1.00 → 0 )。界是悲观的,这很正常——它只用了 κ \kappa κ 一个数,丢掉了谱分布的全部信息。
离散 Laplacian 的条件数按 κ ≈ 4 π 2 ( n + 1 ) 2 \kappa\approx\frac{4}{\pi^2}(n+1)^2 κ ≈ π 2 4 ( n + 1 ) 2 增长(一维三对角,n = 300 n=300 n = 300 时实测 3.67 × 10 4 3.67\times10^4 3.67 × 1 0 4 ,公式给 3.67 × 10 4 3.67\times10^4 3.67 × 1 0 4 )。 于是 CG 步数 ∼ κ ∼ n \sim\sqrt\kappa\sim n ∼ κ ∼ n 。网格加密一倍,步数翻倍 ——这就是为什么解 PDE 要用预处理:把 κ \kappa κ 压回 O ( 1 ) O(1) O ( 1 ) ,步数就与网格无关了。
GMRES 处理非对称情形。它不做「误差在 A A A 范数下最小」,而做残差最小 :
x k = arg min x ∈ x 0 + K k ( A , r 0 ) ∥ b − A x ∥ 2 , K k = span { r 0 , A r 0 , … , A k − 1 r 0 } x_k=\arg\min_{x\in x_0+\mathcal K_k(A,r_0)}\|b-Ax\|_2,\qquad \mathcal K_k=\operatorname{span}\{r_0,Ar_0,\dots,A^{k-1}r_0\} x k = arg x ∈ x 0 + K k ( A , r 0 ) min ∥ b − A x ∥ 2 , K k = span { r 0 , A r 0 , … , A k − 1 r 0 }
同样 n n n 步必到精确解(用 Cayley–Hamilton:特征多项式给出一个零化多项式)。实践中靠 Arnoldi 过程逐步构造正交基,每步存一个向量,存储随步数线性增长 ,所以要「重启」(每 m m m 步清空重来)。
代价对比一句话:CG 每步一个矩阵乘向量 + 常数存储;GMRES 每步一个矩阵乘向量 + 一步正交化 + 线性增长的存储。 能用 CG 就别用 GMRES。
四、几何直观 / 记忆钩子 #
四种分解,四个动作 #
分解
几何动作
一句话记忆
A = L U A=LU A = LU
把「消元的账本」留下来
L 记账,U 是结果
P A = L U PA=LU P A = LU
消元前先「挑个大的站台」
先换行,再开算
A = Q R A=QR A = QR
把列向量一支一支掰成互相垂直
正交化 = 换一组直角坐标
A = L L T A=LL^{\mathsf T} A = L L T
对称正定时,掰一次就够(另一半自动对称)
开方版的 LU,省一半
三个镜像式的对照 #
Householder = 照镜子 :一次反射把整列后面全打成零。Givens = 拧螺丝 :一次只转掉一个元素。前者大刀阔斧,后者精雕细刻。
条件数 = 椭圆的轴比 (29 讲):球被压成扁椭圆,κ = σ max / σ min \kappa=\sigma_{\max}/\sigma_{\min} κ = σ m a x / σ m i n 就是长轴比短轴。椭圆越扁,反解时短轴方向被放大得越狠。
谱半径 = 每步误差的缩小比例 :ρ = 0.9 \rho=0.9 ρ = 0.9 意味着每步只掉一成,要掉到 10 − 6 10^{-6} 1 0 − 6 得 130 130 130 步;ρ = 0.17 \rho=0.17 ρ = 0.17 只要 8 8 8 步。迭代法的全部性能都在这个数里。
一句口诀 #
分解看结构 (对称正定用 Cholesky,一般方阵用 LU,最小二乘用 QR),求解看规模 (小稠密直接法,大稀疏迭代法),信不信看条件数 (κ ε \kappa\varepsilon κ ε 就是你能信几位)。
幂法为什么「自然会」收敛 #
把 A A A 想成一台「按方向拉伸」的机器,拉伸倍数就是特征值。反复作用,倍数最大的那个方向每次都赢一点点,比值 ∣ λ 2 / λ 1 ∣ |\lambda_2/\lambda_1| ∣ λ 2 / λ 1 ∣ 就是「赢的速率」。所以幂法的速度不是技巧问题,是谱的分布问题 :想让幂法快,就得让 λ 1 \lambda_1 λ 1 与 λ 2 \lambda_2 λ 2 拉开距离——这正是「位移」技巧的出发点(把谱整体平移,人为造出差距)。
五、常见误区 #
错,而且错得很危险。残差 ∥ b − A x ^ ∥ \|b-A\hat x\| ∥ b − A x ^ ∥ 小只说明 x ^ \hat x x ^ 是某个邻近问题 的精确解,不是原问题的。 定量关系是 ∥ x ^ − x ∥ ∥ x ∥ ≤ κ ( A ) ∥ b − A x ^ ∥ ∥ b ∥ \dfrac{\|\hat x-x\|}{\|x\|}\le\kappa(A)\dfrac{\|b-A\hat x\|}{\|b\|} ∥ x ∥ ∥ x ^ − x ∥ ≤ κ ( A ) ∥ b ∥ ∥ b − A x ^ ∥ 。κ = 10 16 \kappa=10^{16} κ = 1 0 16 时,残差 10 − 16 10^{-16} 1 0 − 16 对应误差 O ( 1 ) O(1) O ( 1 ) 。 12 阶 Hilbert 的实测就是:残差 1.4 × 10 − 16 1.4\times10^{-16} 1.4 × 1 0 − 16 ,相对误差 0.70 0.70 0.70 。正确做法 :用残差判断「迭代能不能停」(此时它很好用),绝不用它判断「解准不准」。
不一定,先分清是问题 病态还是算法 不稳定(1.4 节)。 反例就在 3.2 节:A = ( 10 − 5 1 1 3 ) A=\begin{pmatrix}10^{-5}&1\\1&3\end{pmatrix} A = ( 1 0 − 5 1 1 3 ) 的 κ ∞ ≈ 16 \kappa_\infty\approx16 κ ∞ ≈ 16 ,条件数好得很,可不选主元 的 LU 在四位算术下把 x 1 = 1.00003 x_1=1.00003 x 1 = 1.00003 算成 0 0 0 ,相对误差 100%。换行之后四位全对。判据 :换一个算法再算一遍。两个算法结果差很多 → 算法问题;两个都差 → 问题本身病态。
Cholesky 要求对称正定 ,不是「对称」。A = ( 1 2 2 1 ) A=\begin{pmatrix}1&2\\2&1\end{pmatrix} A = ( 1 2 2 1 ) 对称,特征值 − 1 , 3 -1,3 − 1 , 3 ,做到 l 22 2 = 1 − 4 = − 3 l_{22}^2=1-4=-3 l 22 2 = 1 − 4 = − 3 就崩。 实操判据有三条,任选:所有顺序主子式为正(手算友好);所有特征值为正;x T A x > 0 x^{\mathsf T}Ax>0 x T A x > 0 对一切 x ≠ 0 x\ne0 x = 0 (定义本身)。 另一个常见混淆:对称正定 (x T A x > 0 x^{\mathsf T}Ax>0 x T A x > 0 )与对角占优 是两件独立的事。对角占优 + 对角元为正 + 对称 ⟹ 正定,但反过来不成立。
误区 4:正交化用 Gram–Schmidt 就行 「数学上等价」不等于「数值上等价」。3.3 节的实测:κ ≈ 1.7 × 10 8 \kappa\approx1.7\times10^8 κ ≈ 1.7 × 1 0 8 时,古典 GS 算出的 Q Q Q 满足 ∥ Q T Q − I ∥ = 0.5 \|Q^{\mathsf T}Q-I\|=0.5 ∥ Q T Q − I ∥ = 0.5 ,根本不是正交矩阵 。 原因是古典 GS 用的是「已经带误差的 q ^ i \hat q_i q ^ i 」,误差项正比于 κ 2 \kappa^2 κ 2 。 三条出路:改用修正 GS(逐个减,误差 ∼ κ \sim\kappa ∼ κ ,实测 7 × 10 − 9 7\times10^{-9} 7 × 1 0 − 9 );用 Householder(∼ \sim ∼ 机器精度);或者干脆别自己写,调库。
不一定,取决于三件事:规模、稀疏性、条件数。
小矩阵(n < 100 n<100 n < 100 )稠密:直接法几乎总赢,迭代法的启动开销盖不过它。
大规模稀疏:迭代法赢,因为直接法有 fill-in(3.8 节的 5 × 5\times 5 × 增长)与 O ( n 3 ) O(n^3) O ( n 3 ) 。
病态:迭代法可能不收敛 或慢到不可用,这时要预处理,或者回到直接法。 另外别忘了经典迭代法的固有毛病:可能发散 (3.6 节的反例里 ρ ( B G S ) = 2 > 1 \rho(B_{GS})=2>1 ρ ( B GS ) = 2 > 1 ,GS 发散),而且需要停止准则 ——这个准则本身就是个技术活。
误区 6:SOR 的 ω \omega ω 随便取个 1.2 就行 ω \omega ω 是有最优值的,而且最优值依赖谱。对相容次序矩阵,ω opt = 2 / ( 1 + 1 − μ 2 ) \omega_{\text{opt}}=2/(1+\sqrt{1-\mu^2}) ω opt = 2/ ( 1 + 1 − μ 2 ) ,μ = ρ ( B J ) \mu=\rho(B_J) μ = ρ ( B J ) 。 本例 μ = 0.7071 \mu=0.7071 μ = 0.7071 时 ω opt = 1.1716 \omega_{\text{opt}}=1.1716 ω opt = 1.1716 ;若 μ = 0.9 \mu=0.9 μ = 0.9 ,则 ω opt = 1.3929 \omega_{\text{opt}}=1.3929 ω opt = 1.3929 ,ρ \rho ρ 从 0.81 0.81 0.81 降到 0.3929 0.3929 0.3929 ——步数从 66 降到 15 。 而 ω \omega ω 取到 1.9 1.9 1.9 时 ρ = 0.9 \rho=0.9 ρ = 0.9 ,比 GS(ρ = 0.5 \rho=0.5 ρ = 0.5 )还慢。ω \omega ω 超过最优值后 ρ = ω − 1 \rho=\omega-1 ρ = ω − 1 线性上升,取到 2 2 2 就发散。
六、拓展(可选,可跳过) #
6.1 预处理:把条件数压下去 #
迭代法的步数由 κ \kappa κ 决定,那就想办法把 κ \kappa κ 变小。做法是解等价的
M − 1 A x = M − 1 b M^{-1}Ax=M^{-1}b M − 1 A x = M − 1 b
其中 M M M 是 A A A 的一个「好求逆的近似」。理想情形 κ ( M − 1 A ) ≪ κ ( A ) \kappa(M^{-1}A)\ll\kappa(A) κ ( M − 1 A ) ≪ κ ( A ) 。常见选择:对角预处理(M = diag A M=\operatorname{diag}A M = diag A ,几乎免费)、不完全 Cholesky(A ≈ L ~ L ~ T A\approx\tilde L\tilde L^{\mathsf T} A ≈ L ~ L ~ T ,故意把 fill-in 丢掉)、以及针对具体结构的块预处理。3.8 节末尾那句「网格加密一倍步数翻倍」,正是靠预处理才被消掉的。
6.2 稀疏直接法不是不存在 #
「大规模必须用迭代」是粗略说法。带带宽 优化的直接法(只在对角带内消元)对带状矩阵非常有效:n = 10 6 n=10^6 n = 1 0 6 、带宽 b = 10 3 b=10^3 b = 1 0 3 时约 2 n b 2 = 2 × 10 12 2nb^2=2\times10^{12} 2 n b 2 = 2 × 1 0 12 次运算,虽然大但可做,而且结果精确、不依赖收敛 。真正的分界线是「fill-in 会不会把存储吃光」,不是「n n n 大不大」。
6.3 化学与材料里的三个落点 #
分子轨道 :Roothaan–Hall 方程 H C = ε S C HC=\varepsilon SC H C = εS C 是广义 特征值问题,S S S 是重叠矩阵(对称正定)。标准做法是先做 S = L L T S=LL^{\mathsf T} S = L L T 的 Cholesky,化成 L − 1 H L − T y = ε y L^{-1}HL^{-\mathsf T}y=\varepsilon y L − 1 H L − T y = ε y 的标准对称特征值问题——正是 3.4 节的分解。
力场与几何优化 :Hessian 必须正定才说明处在极小点,判据就是 Cholesky 能不能做完(3.4 节的注)。做不了就加位移或换优化器。
反应–扩散与传热 :离散后就是 2.5 节那个矩阵的高维版本,κ ∼ O ( n 2 / d ) \kappa\sim O(n^{2/d}) κ ∼ O ( n 2/ d ) ,这就是为什么三维问题比一维难那么多。
6.4 与奇异值分解的关系 #
κ 2 ( A ) = σ max / σ min \kappa_2(A)=\sigma_{\max}/\sigma_{\min} κ 2 ( A ) = σ m a x / σ m i n (29 讲)。伪逆 A † = V Σ † U T A^\dagger=V\Sigma^\dagger U^{\mathsf T} A † = V Σ † U T 把所有「小奇异值」的倒数写得明明白白:σ min \sigma_{\min} σ m i n 小,1 / σ min 1/\sigma_{\min} 1/ σ m i n 大,误差就在这个方向炸开。截断 SVD(把小于阈值的 σ \sigma σ 直接置零)本质上是用「改问题」换「稳定」,与 Tikhonov 正则化是同一件事的两种说法。
七、自测(先做,再看答案) #
1. 对 A = ( 4 2 2 3 ) A=\begin{pmatrix}4&2\\2&3\end{pmatrix} A = ( 4 2 2 3 ) 分别做 LU 与 Cholesky,验证「Cholesky 对角元的平方 = LU 的主元」这条关系。
2. 对三对角矩阵 A = ( 2 − 1 0 − 1 2 − 1 0 − 1 2 ) A=\begin{pmatrix}2&-1&0\\-1&2&-1\\0&-1&2\end{pmatrix} A = 2 − 1 0 − 1 2 − 1 0 − 1 2 ,算 ρ ( B J ) \rho(B_J) ρ ( B J ) 与 ρ ( B G S ) \rho(B_{GS}) ρ ( B GS ) ,并说明为什么这里「ρ ( B G S ) = ρ ( B J ) 2 \rho(B_{GS})=\rho(B_J)^2 ρ ( B GS ) = ρ ( B J ) 2 」成立。
3. 用四位十进制算术,对 A = ( 10 − 5 1 1 3 ) A=\begin{pmatrix}10^{-5}&1\\1&3\end{pmatrix} A = ( 1 0 − 5 1 1 3 ) 、b = ( 2 , 7 ) T b=(2,7)^{\mathsf T} b = ( 2 , 7 ) T ,分别用「不换行」与「换行」的 LU 求 x x x ,并解释误差来源。
4. H 3 H_3 H 3 的 κ ∞ = 748 \kappa_\infty=748 κ ∞ = 748 。若右端项有 0.1 % 0.1\% 0.1% 的相对扰动,解的相对误差最坏 可能是多少?实测大约是多少?
5. 设 A A A 的特征值是 10 , 9.9 , − 9.9 10,\ 9.9,\ -9.9 10 , 9.9 , − 9.9 ,用幂法求主特征值。误差要降到 10 − 6 10^{-6} 1 0 − 6 需要多少步?如果改用带位移 μ = 9.9 \mu=9.9 μ = 9.9 的反幂法呢?
答案(点开) 1. LU:u 11 = 4 u_{11}=4 u 11 = 4 ,l 21 = 1 2 l_{21}=\frac12 l 21 = 2 1 ,u 22 = 3 − 1 2 ⋅ 2 = 2 u_{22}=3-\frac12\cdot2=2 u 22 = 3 − 2 1 ⋅ 2 = 2 。故主元是 4 , 2 4,\ 2 4 , 2 。 Cholesky:l 11 = 4 = 2 l_{11}=\sqrt4=2 l 11 = 4 = 2 ,l 21 = 2 / 2 = 1 l_{21}=2/2=1 l 21 = 2/2 = 1 ,l 22 = 3 − 1 = 2 l_{22}=\sqrt{3-1}=\sqrt2 l 22 = 3 − 1 = 2 。对角元平方是 4 , 2 4,\ 2 4 , 2 。完全一致 ✓ 原因:Cholesky 就是 L D L T LDL^{\mathsf T} L D L T 里把 D \sqrt{D} D 塞进 L L L ,而 D D D 正是 LU 的主元。
2. D = 2 I D=2I D = 2 I ,B J = 1 2 ( 0 1 0 1 0 1 0 1 0 ) B_J=\frac12\begin{pmatrix}0&1&0\\1&0&1\\0&1&0\end{pmatrix} B J = 2 1 0 1 0 1 0 1 0 1 0 ,特征多项式 λ 3 − 1 2 λ = 0 \lambda^3-\frac12\lambda=0 λ 3 − 2 1 λ = 0 ,故 ρ ( B J ) = 1 / 2 ≈ 0.7071 \rho(B_J)=1/\sqrt2\approx0.7071 ρ ( B J ) = 1/ 2 ≈ 0.7071 。 三对角矩阵具有性质 A(相容次序),由定理 ρ ( B G S ) = ρ ( B J ) 2 = 1 2 \rho(B_{GS})=\rho(B_J)^2=\frac12 ρ ( B GS ) = ρ ( B J ) 2 = 2 1 ;数值验算 B G S B_{GS} B GS 的特征值是 0 , 0 , 1 2 0,0,\frac12 0 , 0 , 2 1 ,一致 ✓ 物理意义:GS 每步用的信息比 Jacobi 多一倍(新值立刻用),等价于「两步 Jacobi 的效果」。
3. 不换行:m = 10 5 m=10^5 m = 1 0 5 ,u 22 = 3 − 10 5 → − 1.000 × 10 5 u_{22}=3-10^5\to-1.000\times10^5 u 22 = 3 − 1 0 5 → − 1.000 × 1 0 5 ,y 2 = 7 − 2 × 10 5 → − 2.000 × 10 5 y_2=7-2\times10^5\to-2.000\times10^5 y 2 = 7 − 2 × 1 0 5 → − 2.000 × 1 0 5 ,x 2 = 2.000 x_2=2.000 x 2 = 2.000 ,x 1 = ( 2 − 2.000 ) / 10 − 5 = 0 x_1=(2-2.000)/10^{-5}=0 x 1 = ( 2 − 2.000 ) /1 0 − 5 = 0 。得 ( 0 , 2.000 ) (0,\ 2.000) ( 0 , 2.000 ) ,真解 ( 1.00003 , 1.99999 ) (1.00003,\ 1.99999) ( 1.00003 , 1.99999 ) ,第一位就错 。 换行后 m = 10 − 5 m=10^{-5} m = 1 0 − 5 ,u 22 = 0.99997 → 1.000 u_{22}=0.99997\to1.000 u 22 = 0.99997 → 1.000 ,y 2 = 1.99993 → 2.000 y_2=1.99993\to2.000 y 2 = 1.99993 → 2.000 ,x = ( 1.000 , 2.000 ) x=(1.000,\ 2.000) x = ( 1.000 , 2.000 ) ,四位全对 。 误差来源不是矩阵病态(κ ∞ ≈ 16 \kappa_\infty\approx16 κ ∞ ≈ 16 ),而是 u 22 = 3 − 10 5 u_{22}=3-10^5 u 22 = 3 − 1 0 5 这一步的相消 :小数减大数,3 3 3 的有效位被吞掉。
4. 最坏 κ ∞ × 0.1 % = 748 × 10 − 3 ≈ 0.75 \kappa_\infty\times0.1\%=748\times10^{-3}\approx0.75 κ ∞ × 0.1% = 748 × 1 0 − 3 ≈ 0.75 ,即误差可能达到 75% ——界允许解完全失真。 实测:把 b 1 b_1 b 1 改动 0.1 % 0.1\% 0.1% ,解变化 6.6 % 6.6\% 6.6% (放大约 66 66 66 倍,与改动 1 % 1\% 1% 时的放大倍数相同——线性放大,倍数与扰动大小无关 )。 所以界给 75 % 75\% 75% 、实测 6.6 % 6.6\% 6.6% :界远大于实测,但方向与量级都对 。工程上宁可按界估,因为界不依赖具体扰动长什么样(扰动落在「坏方向」上就会接近界)。
5. ∣ λ 2 / λ 1 ∣ = 9.9 / 10 = 0.99 |\lambda_2/\lambda_1|=9.9/10=0.99 ∣ λ 2 / λ 1 ∣ = 9.9/10 = 0.99 。步数 ≈ ln ( 10 − 6 ) / ln ( 0.99 ) ≈ 1375 \approx\ln(10^{-6})/\ln(0.99)\approx1375 ≈ ln ( 1 0 − 6 ) / ln ( 0.99 ) ≈ 1375 步。慢得没法用。 带位移 μ = 9.9 \mu=9.9 μ = 9.9 的反幂法:A − μ I A-\mu I A − μ I 的特征值是 0.1 , 0 , − 19.8 0.1,\ 0,\ -19.8 0.1 , 0 , − 19.8 ,最小的两个是 0 0 0 与 0.1 0.1 0.1 ,比值趋于 0 0 0 ,一两步就收敛 到 λ = 9.9 \lambda=9.9 λ = 9.9 对应的特征向量。 注意:实际算时 μ \mu μ 只有近似值,比值变成 ∣ λ i − μ ∣ / ∣ λ j − μ ∣ |\lambda_i-\mu|/|\lambda_j-\mu| ∣ λ i − μ ∣/∣ λ j − μ ∣ ,仍然远小于 0.99 0.99 0.99 ,仍然是几步的事。
八、复习卡 #
项
内容
机器精度
双精度 ε = 2 − 53 ≈ 1.11 × 10 − 16 \varepsilon=2^{-53}\approx1.11\times10^{-16} ε = 2 − 53 ≈ 1.11 × 1 0 − 16 ;每次运算带 ( 1 + δ ) (1+\delta) ( 1 + δ ) ,∣ δ ∣ ≤ ε |\delta|\le\varepsilon ∣ δ ∣ ≤ ε
有效位数
约 16 − log 10 κ 16-\log_{10}\kappa 16 − log 10 κ 位;κ ε ≳ 1 \kappa\varepsilon\gtrsim1 κ ε ≳ 1 时一位不剩
Cramer 代价
( n − 1 ) ( n + 1 ) ! (n-1)(n+1)! ( n − 1 ) ( n + 1 )! 次乘法,n = 25 n=25 n = 25 要 3 × 10 10 3\times10^{10} 3 × 1 0 10 年
高斯消去代价
≈ n 3 / 3 \approx n^3/3 ≈ n 3 /3 ;LU 分解 ≈ 2 n 3 / 3 \approx2n^3/3 ≈ 2 n 3 /3 ;Cholesky ≈ n 3 / 3 \approx n^3/3 ≈ n 3 /3
为什么不用求逆
运算量差 n n n 倍;毁稀疏;κ ( A − 1 ) = κ ( A ) \kappa(A^{-1})=\kappa(A) κ ( A − 1 ) = κ ( A ) 救不了病态
LU
A = L U A=LU A = LU ,L L L 单位下三角;L y = b Ly=b L y = b 前代、U x = y Ux=y U x = y 回代,各 O ( n 2 ) O(n^2) O ( n 2 )
置换矩阵
P − 1 = P T P^{-1}=P^{\mathsf T} P − 1 = P T ,det P = ± 1 \det P=\pm1 det P = ± 1 ;P X PX P X 换行、X P XP X P 换列
部分主元
每步在当前列取 max \max max ,保证 ∣ l i j ∣ ≤ 1 |l_{ij}|\le1 ∣ l ij ∣ ≤ 1 ;得 P A = L U PA=LU P A = LU ;比较代价 O ( n 2 ) O(n^2) O ( n 2 )
全主元
在整个右下子块取 max \max max ,更稳但比较本身 O ( n 3 ) O(n^3) O ( n 3 )
小主元反例
( 10 − 5 1 1 3 ) \begin{pmatrix}10^{-5}&1\\1&3\end{pmatrix} ( 1 0 − 5 1 1 3 ) ,κ ∞ ≈ 16 \kappa_\infty\approx16 κ ∞ ≈ 16 ,四位算术下 x 1 x_1 x 1 全错;换行后全对
Householder
H = I − 2 w w T H=I-2ww^{\mathsf T} H = I − 2 w w T ,对称正交,H 2 = I H^2=I H 2 = I ,镜面反射;v = x + sign ( x 1 ) ∥ x ∥ 2 e 1 v=x+\operatorname{sign}(x_1)\|x\|_2e_1 v = x + sign ( x 1 ) ∥ x ∥ 2 e 1
Givens
只转 ( i , k ) (i,k) ( i , k ) 两行,c = x i / r c=x_i/r c = x i / r 、s = x k / r s=x_k/r s = x k / r ;带状/局部清零时用
QR
A = Q R A=QR A = QR ,Q Q Q 正交、R R R 上三角;正交变换保 2 范数,最小二乘化归 R x = c 1 Rx=c_1 R x = c 1
κ \kappa κ 被平方
κ 2 ( A T A ) = κ 2 ( A ) 2 \kappa_2(A^{\mathsf T}A)=\kappa_2(A)^2 κ 2 ( A T A ) = κ 2 ( A ) 2 ;正规方程的致命伤
CGS vs MGS vs HH
κ ≈ 1.7 × 10 8 \kappa\approx1.7\times10^8 κ ≈ 1.7 × 1 0 8 时正交性误差:0.5 0.5 0.5 / 7 × 10 − 9 7\times10^{-9} 7 × 1 0 − 9 / 10 − 15 10^{-15} 1 0 − 15
Cholesky
A = L L T A=LL^{\mathsf T} A = L L T ,要求对称正定;不用选主元 ;l j j 2 l_{jj}^2 l j j 2 = LU 第 j j j 个主元
条件数
κ ( A ) = ∥ A ∥ ∥ A − 1 ∥ ≥ 1 \kappa(A)=\|A\|\|A^{-1}\|\ge1 κ ( A ) = ∥ A ∥∥ A − 1 ∥ ≥ 1 ;κ 2 = σ max / σ min \kappa_2=\sigma_{\max}/\sigma_{\min} κ 2 = σ m a x / σ m i n
误差放大
∥ δ x ∥ ∥ x ∥ ≤ κ ∥ δ b ∥ ∥ b ∥ \dfrac{\|\delta x\|}{\|x\|}\le\kappa\dfrac{\|\delta b\|}{\|b\|} ∥ x ∥ ∥ δ x ∥ ≤ κ ∥ b ∥ ∥ δ b ∥ ;κ \kappa κ 是上界不是等号
Hilbert
κ 2 \kappa_2 κ 2 :n = 3 n=3 n = 3 为 524 524 524 ,n = 6 n=6 n = 6 为 1.5 × 10 7 1.5\times10^{7} 1.5 × 1 0 7 ,n = 12 n=12 n = 12 为 1.8 × 10 16 1.8\times10^{16} 1.8 × 1 0 16
残差 ≠ 误差
残差小只说明是邻近问题的解;两者差一个 κ \kappa κ
迭代收敛判据
x k + 1 = B x k + g x_{k+1}=Bx_k+g x k + 1 = B x k + g 对任意初值收敛 ⟺ ρ ( B ) < 1 \iff\rho(B)<1 ⟺ ρ ( B ) < 1
三种迭代矩阵
B J = D − 1 ( L + U ) B_J=D^{-1}(L+U) B J = D − 1 ( L + U ) ;B G S = ( D − L ) − 1 U B_{GS}=(D-L)^{-1}U B GS = ( D − L ) − 1 U ;L ω = ( D − ω L ) − 1 ( ( 1 − ω ) D + ω U ) L_\omega=(D-\omega L)^{-1}((1-\omega)D+\omega U) L ω = ( D − ω L ) − 1 (( 1 − ω ) D + ω U )
充分条件
严格对角占优 ⟹ 两者都收敛;对称正定 ⟹ GS 收敛、SOR 对 ω ∈ ( 0 , 2 ) \omega\in(0,2) ω ∈ ( 0 , 2 ) 收敛
相容次序
ρ ( B G S ) = ρ ( B J ) 2 \rho(B_{GS})=\rho(B_J)^2 ρ ( B GS ) = ρ ( B J ) 2 ;ω opt = 2 1 + 1 − μ 2 \omega_{\text{opt}}=\frac{2}{1+\sqrt{1-\mu^2}} ω opt = 1 + 1 − μ 2 2 ,ρ = ω opt − 1 \rho=\omega_{\text{opt}}-1 ρ = ω opt − 1
SOR 的 ω \omega ω
ω ∉ ( 0 , 2 ) \omega\notin(0,2) ω ∈ / ( 0 , 2 ) 必发散(det L ω = ( 1 − ω ) n \det L_\omega=(1-\omega)^n det L ω = ( 1 − ω ) n );超过 ω opt \omega_{\text{opt}} ω opt 后 ρ = ω − 1 \rho=\omega-1 ρ = ω − 1 上升
幂法
u k = A u k − 1 / μ k u_k=Au_{k-1}/\mu_k u k = A u k − 1 / μ k ;μ k → λ 1 \mu_k\to\lambda_1 μ k → λ 1 ;速度 = ∣ λ 2 / λ 1 ∣ =|\lambda_2/\lambda_1| = ∣ λ 2 / λ 1 ∣ ;ρ → 1 \rho\to1 ρ → 1 时极慢(0.99 0.99 0.99 需 ∼ 1375 \sim1375 ∼ 1375 步)
反幂法
对 A − 1 A^{-1} A − 1 用幂法得 ∣ λ ∣ |\lambda| ∣ λ ∣ 最小者;带位移 μ \mu μ 可求任意特征值,一两步收敛
CG
对称正定;p i T A p j = 0 p_i^{\mathsf T}Ap_j=0 p i T A p j = 0 ;理论 n n n 步精确;界 2 ( κ − 1 κ + 1 ) k 2\big(\frac{\sqrt\kappa-1}{\sqrt\kappa+1}\big)^k 2 ( κ + 1 κ − 1 ) k
GMRES
一般方阵;在 x 0 + K k x_0+\mathcal K_k x 0 + K k 上最小化 ∥ b − A x ∥ 2 \|b-Ax\|_2 ∥ b − A x ∥ 2 ;存储线性增长,需重启
为什么用迭代
直接法 O ( n 3 ) O(n^3) O ( n 3 ) + fill-in(二维 Laplacian 实测 5 × 5\times 5 × )+ 存储爆;迭代只做矩阵乘向量
Laplacian 条件数
一维 κ ≈ 4 π 2 ( n + 1 ) 2 \kappa\approx\frac{4}{\pi^2}(n+1)^2 κ ≈ π 2 4 ( n + 1 ) 2 ;故 CG 步数 ∼ n \sim n ∼ n ,需预处理
九、出处与延伸(可选,不影响阅读) #
主源 :《数值线性代数及其应用》(金小庆、魏益民、赵志 著,科学出版社,2015,第 2 版中译本)。各节对应关系如下,页码为该书的印刷页码 :
第 1 章「绪论」p1–5:数值线性代数的三大问题(方程组、最小二乘、特征值)、Cramer 法则的运算量对比、病态(问题属性)与不稳定(算法属性)的区分 、直接法与迭代法、线性/超线性收敛。
第 2 章「高斯消去法」p7–16:三角方程组的前代与回代、高斯变换矩阵、LU 分解的存在唯一性(顺序主子式全非奇异)、置换矩阵的四条性质、部分主元与全主元、Cholesky 分解与算法。
第 3 章「扰动与误差分析」p19–28:向量 p p p 范数与矩阵范数、诱导范数、∥ A ∥ 1 \|A\|_1 ∥ A ∥ 1 与 ∥ A ∥ ∞ \|A\|_\infty ∥ A ∥ ∞ 的显式公式、∥ A ∥ 2 = λ max ( A T A ) \|A\|_2=\sqrt{\lambda_{\max}(A^{\mathsf T}A)} ∥ A ∥ 2 = λ m a x ( A T A ) 、Frobenius 范数、谱半径、条件数的定义与两个扰动定理、2.0001 2.0001 2.0001 型病态例子(20000 20000 20000 倍放大)。
第 4 章「最小二乘问题」p37–46:最小二乘的定义与正规方程、A T A A^{\mathsf T}A A T A 丢失信息的例子、Householder 变换与 house 算法、Givens 旋转、QR 分解的存在唯一性、用 QR 解最小二乘。
第 5 章「经典迭代法」p49–61:A = D − L − U A=D-L-U A = D − L − U 的拆法、Jacobi 与 Gauss–Seidel、收敛定理(ρ ( B ) < 1 \rho(B)<1 ρ ( B ) < 1 )、严格/弱对角占优、对称正定情形的收敛性、收敛速度的定义 R k ( M ) = − ln ∥ M k ∥ 1 / k R_k(M)=-\ln\|M^k\|^{1/k} R k ( M ) = − ln ∥ M k ∥ 1/ k 、SOR 的迭代形式与 0 < ω < 2 0<\omega<2 0 < ω < 2 的必要性、性质 A 与相容次序、最优 ω \omega ω 。
第 6 章「Krylov 子空间方法」p63–73:最速下降法、CG 的推导与四条正交性质、实用 CG 算法、CG 的收敛界(含 Chebyshev 多项式)、特征值聚簇时的加速、GMRES 的定义与终止性。
第 7 章「非对称特征值问题」p85–93:Schur 分解、幂法及其收敛定理(速度由 ∣ λ 2 / λ 1 ∣ |\lambda_2/\lambda_1| ∣ λ 2 / λ 1 ∣ 决定)、反幂法与带位移反幂法、QR 方法、上 Hessenberg 化。
范数与内积的抽象背景 :《高等线性代数》(GTM 135 中译本)讲范数等价性与算子范数的部分,可对照 22 讲。
数值表与公式核对 :Bronstein《数学手册》俄文第 10 版与英文第 6 版均收录常用矩阵范数、条件数与 Hilbert 矩阵逆的显式公式(H n − 1 H_n^{-1} H n − 1 的元素是整数,H 3 − 1 = ( 9 − 36 30 − 36 192 − 180 30 − 180 180 ) H_3^{-1}=\begin{pmatrix}9&-36&30\\-36&192&-180\\30&-180&180\end{pmatrix} H 3 − 1 = 9 − 36 30 − 36 192 − 180 30 − 180 180 ,可直接用来验算 3.5 节)。
术语别名 :部分主元选取 = partial pivoting = 列主元消去;全主元 = complete pivoting;置换矩阵 = permutation matrix;条件数 = condition number,记法 κ \kappa κ 、cond \operatorname{cond} cond ;谱半径 = spectral radius,ρ \rho ρ ;Gauss–Seidel 也译「塞德尔迭代」;SOR = 逐次超松弛 = successive overrelaxation;CG = 共轭梯度 = conjugate gradient;GMRES = 广义极小残量 = generalized minimum residual。
一个提醒 :不同教材对 ∥ A ∥ 2 \|A\|_2 ∥ A ∥ 2 的定义统一(最大奇异值),但对「条件数」默认用哪个范数并不统一——数值分析书多用 κ 2 \kappa_2 κ 2 ,偏微分方程书常报 κ ∞ \kappa_\infty κ ∞ (因为行和好算)。看到「条件数」三个字,先确认是哪个范数 ,本例中 κ 2 = 5.83 \kappa_2=5.83 κ 2 = 5.83 而 κ ∞ = 8 \kappa_\infty=8 κ ∞ = 8 ,差 37%,不影响结论但会影响你估的有效位数。