3.5 高斯消元、初等矩阵与 LU 分解
本节位置:模块 3 · 矩阵与线性映射 | 前置:3.4 | 预计:40 分钟
一句话:高斯消元用三种行变换把矩阵化成三角,LU 分解则把这三步「录下来」存成一个下三角矩阵,供以后反复使用。
0. 场景引入
结构设计院,一栋 60 米高的钢框架要做抗震验算。简化成层模型后自由度是 480 个(80 个节点 × 6 个自由度),刚度矩阵 ,对称正定。
规范要求做包络设计:恒载与活载并成一个组合,加上 8 个方向的风、3 条地震波,一共 12 个荷载工况。每个工况对应一个右端项 ,都要解一次
只跟结构本身有关,12 个工况共用它。
决定:是对每个 从头消元 12 次,还是把 分解一次()、后面只做 12 次三角求解?
代价: 时,一次消元约 FLOPs,12 次就是 ;分解一次加 12 次回代是 ,省 11 倍。这个模型再加密到 (精细壳单元),一次分解本身就是 FLOPs 量级——重复 12 次直接不可行。
比慢更可怕的是漏算:12 个工况少算一个,某根柱的配筋就不足,地震时是倒塌。
问题:消元的过程为什么能「存下来」?主元为 0、或者只是很小时,为什么必须换行?
读完本节,你应该能回答三件事:
- 三种行变换为什么都不改变解集,却可能改变行列式;
- 里 存的到底是什么,为什么它恰好是各步的乘数;
- 为什么实际实现都是 ,不选主元会坏在哪。
1. 直觉
1.1 消元与存档
高斯消元(Gaussian elimination)就是「用一行去减另一行的倍数」,制造零,让矩阵变成阶梯形:主元逐行右移,主元下方全为零。每一步都是一次初等行变换(elementary row operation),而每一种行变换都能写成一个**初等矩阵(elementary matrix)**左乘。消元的过程就是一串初等矩阵连乘。
「高斯消元」这个名字来自 Gauss 1809:他在《Theoria motus》里系统地用逐次消去法解观测方程。
LU 分解把结论记下来:, 记录「每一步减了谁的第几倍」, 是消元后的上三角。解方程时先解 (前代),再解 (回代),都只要 。
💡 一句话直觉:消元是「做」,LU 是「把做法存档」;存档一次,换右端项时不用重做。
类比边界:这个存档只对同一个 、不同的 有用。若 本身在变(如训练中每步都更新权重),LU 的复用价值就消失了。
1.2 现实对应:拆机器时录下的顺序
消元像拆一台机器:你先拧下 4 号螺栓(消掉第 1 列的下面几项),再拧 7 号,再拧 12 号。每一步都让结构「松一点」,最后机器散成一堆零件(上三角)。
LU 是把拆解顺序录成视频: 记录「每一步拧的是哪颗螺栓、拧了几圈」, 是拆完后的零件堆。下次拆同型号的机器,照视频做就行,不用重新摸索。
在结构分析里,这台「机器」就是 :它编码了「哪个节点和哪个节点通过一根梁相连、这根梁有多硬」。 记录的是「用哪个节点去消哪个节点的约束」, 是消完之后彼此独立的自由度。
这个类比在哪里失效:视频只对同型号机器有效。结构一改(换一根梁的截面、加一层楼), 就变了,视频作废,必须重新分解。这也是为什么优化设计里「改一个参数就重算一次」代价很高——每次都要重新录一遍视频。
1.3 量级直觉
消元的代价是 ,三角求解只有 。两者之比是 : 时约 160 倍, 时约 33 万倍。
这个比值就是「分解一次、复用多少次才划算」的临界点:右端项只有 1 个时,直接消元和 LU 一样贵;有 个时,复用大约省 倍——直到 赶上 ,即 。
2. 定义
2.1 增广矩阵与三种行变换
把 写成增广矩阵(augmented matrix) 。允许三种行变换:
- 交换两行:;
- 数乘一行:,;
- 倍加:,。
三种变换都不改变方程组的解集。
2.2 初等矩阵
对单位阵做一次行变换得到的矩阵叫初等矩阵。左乘初等矩阵 等于对 做对应的行变换。例如:
左乘 ,就是把 的第 2 行减去第 1 行的 2 倍。 初等矩阵都可逆,逆矩阵就是把倍数变号:
的第 项是
2.3 行阶梯形与简化行阶梯形
- 行阶梯形(row echelon form, REF):非零行在上;每行首个非零元(主元 pivot)所在列严格右于上一行;主元下方全为 0。
- 简化行阶梯形(reduced row echelon form, RREF):在 REF 基础上,主元全为 1,且主元所在列的其它元素全为 0。
RREF 唯一,消元路径不唯一。
2.4 LU 分解
若方阵 可写成
其中 是单位下三角(对角线为 1,下三角为消元乘数), 是上三角,则称其为 LU 分解(LU decomposition)。若消元过程需要交换行,则写成
是置换矩阵(permutation matrix),每行每列恰有一个 1。
3. 为什么这样定义
为什么不直接求 ?因为求逆是 ,而且显式逆的数值误差通常比直接消元更大。LU 把一次 的消元与每次 的三角求解分开: 个右端项的总代价是 ,而逐个求逆再乘是 。
为什么需要 ?如果主元位置是 0(或非常小),消元会除以 0 或放大误差。部分主元法(partial pivoting) 每次选当前列绝对值最大的行交换上来,这就是 的来历。把消元写成三角分解、并分析它如何放大舍入误差,最早的系统工作是 Turing 1948。
为什么 存的是乘数而不是矩阵乘积?因为消元的每一步都是「单位阵 + 一个乘数」,它们的逆只是把乘数变号;把逆按顺序乘起来,恰好得到一个单位下三角,对角线下方就是各步乘数。这就是「存档」的全部内容。
3.1 反事实:如果定义成「不许换行的 」
写起来干净,于是有人规定:LU 分解不允许出现 。取一个不算极端的例子:
精确解:,所以
不换行,用 4 位有效数字算:
- 乘数 ;
- 。这个 在 4 位有效数字里被「吃掉」,得 ;
- 前代:;
- 回代:,。
得 ,真值 。相对误差 100%——不是「精度差一点」,是整个答案没了。
换行之后(部分主元法,交换两行):,,回代得 ,相对误差 ,正好是 4 位有效数字的极限。
结论: 这个定义在两个地方不够用——主元为 0 时直接除零,主元很小但非 0 时精度悄悄崩掉。所以工程上的定义是 : 不是装饰,它是「先把最大的主元换上来」这个动作的代数记录。部分主元法保证所有乘数满足 ,一旦算出来超过 1,就说明该换行了。
4. 性质与推导
4.1 行变换不改变解集
设 是初等矩阵,则 (两边左乘 )。反过来,因为 可逆,。所以解集完全不变。
4.2 从消元到 LU
对 做消元,相当于左乘一串初等矩阵:
移项得 。记 。每个 是单位下三角,单位下三角对乘法封闭,所以 也是单位下三角,且其第 项就是消去 时用的乘数。于是 。
4.3 复杂度
- 消元:第 步要更新约 个元素,总计约 次乘加(每次乘加 2 FLOPs),即约 FLOPs。
- 前代 + 回代:每个右端项约 次乘加,即 FLOPs。
- 显式求逆:约 FLOPs。
所以 时,一次 LU 约 FLOPs,而每个右端项只要约 FLOPs。这套 的计数与 的标准表述见 Golub & Van Loan 第 3 章。
4.4 行列式与逆
由 ,。(交换次数的奇偶), 是对角线乘积。所以 。求逆则可以逐列解 ,复用同一个 LU。
5. 例子
5.1 手算: 消元与 LU
取
消元: 得 ; 得 ;再 得 。于是
验证 的第三行:,正是 的第三行。
前代 :;;。
回代 :;;。
所以 。验证:。
行列式:,与直接展开一致。
5.2 手算:需要换行的
取 ,首个主元为 0。交换第 1、2 行,,。消元: 得 ; 得 。因此
验证第三行:,等于 的第三行。,而 ,所以 。
5.3 场景闭环:12 个工况、480 个自由度
输入: 对称正定,fp64 每元素 8 字节,整块占 MB;12 个右端项各 KB。按节点编号优化后带宽约 60,非零元约 个——是稀疏的。
计算:因为 对称正定,实际用 Cholesky()而不是 LU,代价约 FLOPs,正好是 LU 的一半。12 次三角求解是 FLOPs。合计约 。
输出:12 组位移 ,进而算杆件内力、画应力云图,再按规范做包络——每个构件取 12 个工况里最不利的组合,得到配筋量。
成本: FLOPs 在单核 5 GFLOP/s 下约 8 ms。但稀疏 Cholesky 的瓶颈不是 FLOPs,而是填充(fill-in):分解过程中原本为零的位置会变成非零,非零元从 涨到 量级,内存和访存都涨 3 倍以上。这就是工程上要花力气做节点编号重排(AMD、RCM)的原因——把非零元尽量挤到对角线附近,减少填充。
失败条件与兜底:
- 该换行时没换: 对称正定时 Cholesky 天然稳定,可以不选主元;但一旦模型里有接触、索、支座沉降, 变成不定的,Cholesky 会开根号出负数,直接崩。兜底:检测到非正主元就退回带主元的 LU。
- 病态:薄壳、或者钢与橡胶垫并存导致刚度差 倍时, 能到 ,位移解的有效位数掉到 6 位以下。兜底:用双精度、并对自由度做尺度化(每个自由度除以其典型量级)再分解。
- 模型误差远大于数值误差:比起 ,更大的误差来源是「梁的边界条件假设错了」。数值上解得很准,物理上是错的。兜底:做收敛性检查(网格加密一倍,看应力是否稳定),并与实测或规范简化公式对照。
6. 常见误区
-
误区:行变换会改变方程组的解。 纠正:三种行变换都是可逆的,解集不变;但数乘一行会把行列式乘 ,交换两行会变号——行列式变了,解没变。
-
误区:LU 分解总是不用换行。 纠正:主元为 0 时必须换行;主元很小(即使非 0)也应换行以控制误差,所以实际实现都是 。
-
误区: 的对角线也存乘数。 纠正: 是单位下三角,对角线全是 1;乘数在对角线下方。
7. 概念网络
- 前置:3.4 逆矩阵与可逆性 —— 可逆 ⇔ 主元都不为 0。
- 前置:3.3 矩阵乘法 —— 初等矩阵左乘就是行变换。
- 后续:3.7 四个基本子空间 —— 主元列给出列空间的基。
- 后续:4.2 解的存在性与通解 —— RREF 读出特解与零空间。
- 后续:4.6 条件数与病态 —— 主元选择与误差。
- 关联:10.3 BLAS 与 GEMM —— 为什么直接法在大矩阵上让位于迭代法。
8. 通往大模型:求解器藏在哪一层
出现位置:Transformer 的前向没有显式消元,但训练与分析的许多环节会解线性系统:二阶优化(Newton/K-FAC)、高斯过程回归、线性探针、概率校准、以及某些归一化流。
形状与运算:二阶方法要解 , 是 Hessian 近似。 时一次 LU 约 FLOPs,显存要存 M 个浮点数;这就是全量二阶方法在 LLM 上不可行的原因。实际做法是用对角/低秩近似(如 K-FAC 的分块),把 拆成小块分别做 Cholesky/LU。
为什么需要:LU/Cholesky 把「解方程」与「分解」分离。若同一个 要解多个右端项(多个 batch 的梯度),分解一次即可;若 每步都变,就只能用共轭梯度等迭代法(第 10.4 节)。可检验结论:用 NumPy 对随机 矩阵计时 lu_factor 与 solve,LU 时间约与 成正比,每个额外右端项只与 成正比; 从 1024 增到 2048,前者约 8 倍,后者约 4 倍。
如果这一步算错,用户会看到什么现象:主元没选好,应力云图会出现棋盘格状跳变或负应力——工程师第一反应是「结构有问题」,实际是舍入噪声被放大。LU 复用搞错( 改了却还用旧的 ),位移会系统性偏大或偏小,配筋量跟着偏,这类错误最危险:它不报错,只安静地给出一个「看起来合理」的答案。训练侧的同构现象是二阶优化里用了一个过期的曲率近似,loss 不炸,但收敛停滞,调参的人会误以为是学习率问题。
9. 练习
- 概念:为什么行变换不改变解集,却可能改变行列式?各举一种变换说明。
- 计算:对 做 LU 分解(不需换行),并解 。
- 计算:接上题,用 的对角线求 ,并与直接展开对比。
- 计算:,写出 、、,验证 。
- 开放:如果 每 10 步才更新一次,而每步有 1000 个右端项,LU 复用能省多少?请用 与 的量级估算。
参考答案
- 交换两行:解集不变,行列式变号;数乘一行 :解集不变,行列式乘 。倍加一行:解集与行列式都不变。
- 得 ;再用第 2 行消第 3 行,乘数为 ,得 。所以 ,。前代得 ;回代得 ,,。验证 。
- 。直接展开:,一致。
- ,,,。
- 一次 LU 约 ,每个右端项约 :重复消元需 ,复用只需 。 较大时约省 倍; 每 10 步更新也仍然划算。
10. 一页速记
- 三种行变换:交换、数乘、倍加;都不改变解集,但可能改变行列式。
- 物理意义 / 现实对应:消元是「逐个消掉约束」,LU 是把消约束的顺序存档;结构分析里 是刚度, 是约束的消除顺序, 是解耦后的自由度。
- 初等矩阵左乘 = 行变换;它们都可逆。
- REF/RREF:主元阶梯;RREF 唯一。
- (或 ): 单位下三角存乘数, 上三角。
- 消元 ,三角求解每个右端项 ;。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- 高斯(Carl Friedrich Gauss, 1809):Theoria Motus Corporum Coelestium in Sectionibus Conicis Solem Ambientium(1809 原著,Cambridge 2011 影印)。系统使用逐次消去法解观测方程,本页 §2.1 的三种行变换是它的现代形式。Cambridge University Press
- 图灵(Alan M. Turing, 1948):Rounding-off Errors in Matrix Processes。把消元写成三角分解(,必要时换行)并分析舍入误差,本页「LU + 主元选择」的起点。Quart. J. Mech. Appl. Math.
- Golub & Van Loan(2013):Matrix Computations(第 4 版)。第 3 章给出 、部分主元法与 FLOPs 的标准表述,本页 §4.3 的计数以它为准。Johns Hopkins University Press
下一篇 → 3.6 转置、对称与分块矩阵
随堂测 · 5 题
源文件:03-矩阵与线性映射/05-高斯消元与LU.md