LU分解模拟器 返回
数值线性代数模拟器

LU分解模拟器 — Ax=b的直接解法

把3×3矩阵分解为L·U,通过前向代入Ly=b与回代Ux=y求解Ax=b。改变对角元与右端项,实时观察行列式、解、残差与条件性的变化。

参数设置
A[1,1](对角元)
A[2,2](对角元)
A[3,3](对角元)
b[1](右端项)

非对角元固定:A[1,2]=3, A[1,3]=2, A[2,1]=1, A[2,3]=1, A[3,1]=2, A[3,2]=1。b[2]=8, b[3]=13 固定。

计算结果
行列式 det(A)
解 x_1
解 x_2
残差 ‖Ax-b‖_2
矩阵 A 与右端向量 b

左=系数矩阵A/右=右端向量b(蓝格=非对角,绿格=对角且可变)

L·U 分解与前向、回代结果

绿色=下三角L(对角=1)/蓝色=上三角U/黄色=中间向量y=L⁻¹·b/橙色=解x=U⁻¹·y

理论与主要公式

LU分解把方阵A分解为单位下三角L与上三角U的乘积。包含部分主元选取时,写作 P·A = L·U。

分解公式(Doolittle法,L 对角为1):

$$P \cdot A = L \cdot U, \quad L_{ii} = 1$$

Ax=b 通过两步三角系求解。前向代入求 y,回代求 x:

$$L\,y = P\,b \quad\Longrightarrow\quad U\,x = y$$

行列式与残差。det(A) 为 U 对角元的乘积(按行交换次数加符号),残差衡量数值精度:

$$\det(A) = (-1)^{s}\prod_i U_{ii}, \qquad r = \|A\,x - b\|_2$$

分解代价为 O(n³),但对同一 A 的每个新右端项仅需 O(n²),正是 FEM 多荷载工况中的关键优势。

什么是LU分解模拟器

🙋
解线性方程组就是中学学过的消元法吧?计算机做的事情和我们一样吗?
🎓
本质上是同样的「高斯消去」。但在工程实务中,会把消去过程的中间结果保留为两个矩阵 L 和 U——这就是 LU 分解。看上面的第二张画布:绿色的 L 记录了「消去时每行所乘的倍率」,蓝色的 U 是「整理为上三角后的形态」。两者相乘就能还原 A。
🙋
特意做分解有什么好处?解一次不就够了吗?
🎓
这正是关键所在。例如 FEM 的线性静力分析中,常常要对同一个刚度矩阵 K 解 10 个、100 个荷载工况。只要先做一次 LU 分解,每个工况只需「前向代入和回代」即可完成。分解本身是 O(n³),比较重;但其后每次求解仅为 O(n²)。1000 元的方程,做一次分解的代价就能解约 1000 个右端项。
🙋
「部分主元选取」是什么?模拟器下面提到了一下。
🎓
消去时要除以「对角元(主元)」,若它为 0 就崩溃,若接近 0 误差就爆炸。因此每一步都从当前列中选绝对值最大的元素,先做行交换再消去——这就是部分主元选取。在模拟器里把 A[1,1] 设为 1、b[1] 设为 -20 试试看,会触发行交换,但解仍然能正确算出。
🙋
残差卡片几乎为 0,是不是说明计算是对的?
🎓
对。把求得的 x 代回原矩阵 A 乘一次,再和 b 相减取范数就是残差。理论上为 0,在双精度浮点下通常也只到 10⁻¹⁰ 量级。如果出现 1 或 10,要么矩阵几乎奇异(条件数极大),要么实现里有 bug。检查残差,是数值解的「自我体检」,实务中必养成习惯。

常见问题

两者都是 LU 分解的实现方式:Doolittle 把 L 的对角设为 1(主元保留在 U 中),Crout 把 U 的对角设为 1。本工具采用 Doolittle 法,这也是教科书中最常见的约定。数值结果本质等价,差异主要体现在内存布局与计算顺序上。
条件数定义为 cond(A)=‖A‖·‖A⁻¹‖,衡量输入误差被放大到解的程度。粗略估计,条件数为 10ᵏ 时,双精度浮点(约 16 位精度)下大约会损失 k 位有效数字。当条件数超过 10¹⁶,有效精度全部消失,解不可信。实务中通过迭代精化、缩放或更换问题表述来控制条件数。
大型 FEM 与 CFD 矩阵超过 99% 的元素为 0,是「稀疏矩阵」。直接做 LU 分解会在原本为零的位置产生「填充(fill-in)」,导致内存爆炸。实务中先用 AMD、METIS 等排序算法重排行列以最小化填充,再用 SuperLU、PARDISO、MUMPS 等稀疏 LU 库完成分解。规模超大时则改用共轭梯度法(CG)、GMRES 或代数多重网格等迭代解法。
线性弹性分析的刚度矩阵 K 多为对称正定,此时首选 Cholesky 分解(K=L·Lᵀ),其内存与运算量约为一般 LU 的一半。接触分析、塑性分析或非对称表述(如流固耦合)中使用一般 LU。无论何种情况,直接法的真正优势都体现在「分解一次、便宜地求解多个右端项」,特别适合多荷载工况。

实际应用

FEM 线性静力分析:结构分析求解器(NASTRAN、Abaqus、ANSYS、Marc 等)的核心是对刚度矩阵的直接解法。对称正定时用 Cholesky,一般情况下用 LU。当同一 K 需要对多个荷载工况(自重、风载、地震、热载等)求解时,分解的可重用性带来巨大收益。稀疏实现(SuperLU、PARDISO、MUMPS)是行业标准,可处理数千万自由度的模型。

电路分析(SPICE):电子电路的节点方程 G·v=i 中,节点导纳矩阵 G 是稀疏对称矩阵,常用 LU 求解。SPICE 类仿真器在每个时间积分步求解线性化方程,对于矩阵结构不变的区段,重用 LU 因子可极大加速。

优化与机器学习的正规方程:线性最小二乘的正规方程 (XᵀX)·β=Xᵀy、高斯过程回归的 (K+σ²I)·α=y 等都是对称正定矩阵的求解,使用 Cholesky 分解(特殊的 LU)。这些是批量训练与贝叶斯推断的核心例程,高效的分解实现直接决定性能。

控制工程的 Lyapunov 方程:状态空间模型稳定性分析中出现的连续时间 Lyapunov 方程 AᵀP+PA=-Q,通过 Bartels-Stewart 算法把 A 做 Schur 分解后,在三角矩阵上做代入求解——本质上与 LU 分解的三角代入思想一致,是 MATLAB Control Toolbox 等控制系统设计软件的标准实现。

常见误解与注意事项

最常见的误解是把 LU 分解当成「计算逆矩阵的手段」。实际上几乎用不到显式的 A⁻¹,只要解 Ax=b,LU 分解就足够了。显式求逆会让内存与计算量增加约 3 倍,数值误差也更大。MATLAB 推荐 `A\b`(反斜杠运算符,内部用 LU)而不是 `inv(A)*b`,正是这个道理。本工具也完全不构造逆矩阵,仅靠 Ly=Pb 与 Ux=y 两次三角系求解就得到答案。

其次常见的错误是认为只要做了部分主元选取,数值就总是稳定的。部分主元选取能避免对角元过小,但若矩阵本身条件数很大(接近奇异),解的精度仍会下降。在模拟器中把 A[1,1]=A[2,2]=A[3,3]=1 这类对角较小的组合试一下:行列式变小,残差也容易增大。实务中需事先估计条件数(rcond),并通过迭代精化来确保精度。

最后,忽视 O(n³) 的代价,将直接法应用到超大问题是常见失误。3×3 几乎瞬间完成,但若用稠密 LU 直接分解百万自由度的 FEM 矩阵,内存与时间都将膨胀到天文数字。即便使用 SuperLU、PARDISO 等稀疏库,自由度超过数百万后,迭代解法(CG、GMRES、代数多重网格)往往更具优势。选择求解器前务必确认「是否对称」「是否正定」「是否稀疏」「自由度规模如何」。本工具仅处理入门级的 3×3 系统,但其背后是数值线性代数半个多世纪的积累。