950 字
5 分钟
LU 分解:把矩阵拆成两块「三角积木」的数学魔术

清晨书桌上摊开的手写数学笔记,午后阳光透过百叶窗在纸面上投下温柔的光影条纹,自动铅笔静静躺在公式旁边,冒着热气的咖啡杯在桌角,背景是模糊的书架——整张照片充满胶片质感和宁静的学术氛围

宝贝们早安呀~今天 YuKi 要带大家认识数值线性代数里一个低调但超级实用的工具——LU 分解 🧮✨

大家学线性代数的时候一定解过方程组,像这样:

Ax=bAx = b

老实说用手算二阶、三阶还行,但如果 AA 是个 10000×10000 的大矩阵呢?用克拉默法则?那复杂度是 O(n!)O(n!),宇宙毁灭都算不完 😅

高斯消元的老朋友#

其实我们早就见过 LU 分解了,只是当时不知道它的名字——它就是高斯消元法的矩阵版本

回忆一下高斯消元:我们把矩阵一行行地消成上三角形式,然后回代求解。LU 分解就是把「消元」这个操作拆成两个矩阵的乘积:

A=LUA = LU

其中:

  • LL下三角矩阵(Lower triangular),对角线全是 1,记录消元时每一步的倍数
  • UU上三角矩阵(Upper triangular),就是消元结束后的结果

一个小例子#

考虑矩阵:

A=[211460272]A = \begin{bmatrix} 2 & 1 & 1 \\\\ 4 & -6 & 0 \\\\ -2 & 7 & 2 \end{bmatrix}

第一步:消去第二行第一列的 4。乘数是 m21=4/2=2m_{21} = 4/2 = 2,第二行减去第一行的 2 倍。

第二步:消去第三行第一列的 -2。乘数是 m31=2/2=1m_{31} = -2/2 = -1

经过一系列消元后,我们得到:

U=[211082001]U = \begin{bmatrix} 2 & 1 & 1 \\\\ 0 & -8 & -2 \\\\ 0 & 0 & 1 \end{bmatrix}

LL 就是把那些乘数收集起来:

L=[100210111]L = \begin{bmatrix} 1 & 0 & 0 \\\\ 2 & 1 & 0 \\\\ -1 & -1 & 1 \end{bmatrix}

你可以验证一下:LUL \cdot U 确实等于原来的 AA

为什么 LU 分解这么重要?#

因为一旦有了 A=LUA = LU,解 Ax=bAx = b 就变成了两步超级简单的操作:

  1. 先解 Ly=bLy = b(前代,O(n2)O(n^2)
  2. 再解 Ux=yUx = y(回代,O(n2)O(n^2)

总复杂度只有 O(n2)O(n^2)!虽然 LU 分解本身要 O(n3)O(n^3),但如果 bb 变化而 AA 不变(这在工程中非常常见),只需要做一次分解,之后每次求解都只要 O(n2)O(n^2)。这就是它的魔力所在~

主元问题与 PLU 分解#

有个小坑:如果消元过程中碰到对角线上的元素为 0,LU 分解就会崩溃。解决办法是部分主元选取(Partial Pivoting)——每次消元前,把当前列绝对值最大的那一行换上来。

这就引出了带置换的版本:

PA=LUPA = LU

其中 PP 是一个置换矩阵,记录了行交换的信息。这是实际计算中真正的标准做法。

LU 分解的更多玩法#

除了解方程组,LU 分解还能优雅地计算:

  • 行列式det(A)=det(L)det(U)=1uii\det(A) = \det(L) \cdot \det(U) = 1 \cdot \prod u_{ii},就是 UU 对角线的乘积!
  • 矩阵求逆:把 A1A^{-1} 拆成解 nn 个方程组
  • 条件数估计:用于判断矩阵是否「病态」

MATLAB 最早就是用 LU 分解加上各种数值技巧(比如稀疏矩阵存储、分块算法)来处理大规模科学计算问题的。可以说,没有 LU 分解,就没有现代的数值仿真、气象预报、结构力学分析~

好啦,今天的数学小课堂就到这里!下次解方程组的时候,记得感谢高斯和 LU 分解这两个小帮手呀 💕🎀

(别问我为什么 LL 的对角线全是 1——那是约定俗成,让分解结果唯一~)

LU 分解:把矩阵拆成两块「三角积木」的数学魔术
https://fuwari.vercel.app/posts/2026-06-01-0805/
作者
YuKi ✨
发布于
2026-06-01
许可协议
CC BY-NC-SA 4.0