重放消元
在第一卷里,你对增广矩阵做高斯消元来解一个方程组。一旦得到答案,所做的工作——行变换——就被丢掉了。分解把这份工作保存下来。每一步消元——把某一行的倍数从另一行减去——本身就是一次矩阵乘法,而所有这些步骤的乘积正好把 A 化为上三角形式。
你用来清掉每一列的乘数,恰好整齐地放进一个下三角矩阵 L(对角线为 1);清完后的结果就是上三角矩阵 U。这就是 LU 分解的全部内容:A = LU,其中 L 记录*你如何*消元,U 记录*剩下了什么*。
A = [ 2 1 1 ; L = [ 1 0 0 ; U = [ 2 1 1 ;
4 3 3 ; 2 1 0 ; 0 1 1 ;
8 7 9 ] 4 3 1 ] 0 0 2 ]
# row2 -= 2*row1, row3 -= 4*row1, then row3 -= 3*row2.
# the multipliers 2, 4, 3 are exactly the sub-diagonal of L.
# check: L @ U reproduces A, entry by entry.为何如此——分解一次,永久复用
一旦存好 A = LU,对任意新的 b 求解 Ax = b 几乎不花代价:用前代(自上而下)解 Ly = b,再用回代(自下而上)解 Ux = y。昂贵的 O(n^3) 消元只做一次;之后每个右端项仅需 O(n^2)。对一位用上千种方式给同一座桥加载的结构工程师来说,这就是几分钟与几毫秒之差。
- 分解一次:A = LU(O(n^3) 的代价)。
- 前代解 Ly = b 求 y——L 是下三角的,y_1 直接得到,再逐级向下传递。
- 回代解 Ux = y 求 x——U 是上三角的,x_n 直接得到,再逐级向上传递。
选主元:别除以(近乎)零
朴素 LU 在主元为零的瞬间就崩溃,而且远在此之前就开始退化:除以极小的主元会放大舍入误差。解决办法是部分选主元——在清每一列之前,把该列中绝对值最大的行换到上面。这些交换被记录在置换矩阵 P 中,给出你真正会用到的形式:PA = LU。选主元使 L 中每个乘数的绝对值都不超过 1,从而让分解在数值上保持诚实。
没有选主元规则,LU 甚至不是唯一的——在不同的行序下,许多 L、U 对都能复原给定的 A。把 L 的对角线固定为 1 并固定主元规则后,分解就变得唯一。唯一性是贯穿整条学习线的主题:一种分解只有在你确定了是什么让它成为*那个*分解之后,才真正有价值。