MatrixCalc

LU 分解计算器

用部分选主元把方阵分解为 A = L·U,并逐步查看两个三角因子是怎样构造出来的。含用于对称正定矩阵的 Cholesky 分解。

矩阵 A
: 3
: 3
矩阵 B
: 3
: 3
运算

展开下方步骤即可看到完整答案。

结果
选择一个运算以在此处查看结果。错误信息也会显示在这里。

提示:可调整矩阵大小(最多 50×50)。A×B 要求 A 的列数等于 B 的行数。行列式/逆/迹/幂 需要方阵。

React, Tailwind & shadcn/ui. No external math deps. — 中文

输入一个方阵,打开分解标签页,点击 LU(A)。因为答案是一对矩阵而不是 一个,它完全存在于分步面板里;面板会自动展开,并在最后把 L 和 U 并排显示出来。Cholesky(A) 在同一个标签页里,用于下面要讲的对称情形。

两个因子是什么

LU 分解把矩阵写成 A = L·U,其中 L 是下三角、U 是上三角。两者都不神秘:U 恰好就是高斯消元得到的行阶梯形,而 L 记录了你一路上用过 的乘数。做一次消元,两个因子就都有了。

例题

43
63
=
10
3/21
×
43
0−3/2

L 中的 3/2 就是把主元下方那个 6 消掉的乘数。注意行列式现在是白送的:把 U 的对角线相乘得 4 · (−3/2) = −6,每做一次行交换再乘以 −1。

为什么值得这么做

因为这个分解可以反复使用。从头解 Ax = b 大约要 n³/3 次运算。有了 L 和 U 之后,每换一个右端项只要 :先用前代解 Ly = b,再用回代解 Ux = y。如果同一个方程组要配上很多个不同的 b 向量——工程与仿真中的常态——省下的运算量 非常可观。对一个 100×100 的矩阵和五十个右端项,这就是一次分解加五十次廉价求解,而不是五十次完整 消元。

前代与回代的完整演算

拿上方载入的这个 3×3 矩阵来看。一次消元就给出两个因子:

211
4−60
−272
=
100
210
−1−11
×
211
0−8−2
001

L 中的元素正是消元时用过的乘数:2 消掉了 4,−1 消掉了 −2,−1 消掉了第二列里剩下的部分。现在取 b = (4, −2, 7) 来解 Ax = b。先解 Ly = b,自上而下,每一行都 能立刻定出一个新值,因为它右边全是零:

y₁ = 4;接着 2·4 + y₂ = −2,得 y₂ = −10;再接着 −4 + 10 + y₃ = 7,得 y₃ = 1

然后解 Ux = y,自下而上:x₃ = 1;接着 −8x₂ − 2 = −10,得 x₂ = 1;再接着 2x₁ + 1 + 1 = 4,得 x₁ = 1。解是 (1, 1, 1),全程除了对角线元素之外没做过任何除法。行列式也从这同一对因子里白得: 2 · (−8) · 1 = −16。

选主元

并非每个矩阵都容许朴素的 A = L·U:主元位置上出现零就会把它破坏掉。补救办法是引入一个 置换矩阵,写成 P·A = L·U。实际上无论如何都要选主元,因为取当前可用的最大主元能把舍入 误差压住。一旦约定确定下来,分解就是唯一的;本计算器采用 Doolittle 约定,把 1 放在 L 的对角线上。

Cholesky:对称的情形

如果 A 对称且正定,它可以分解为 A = L·Lᵀ——相当于矩阵的平方根,只需要 一个三角因子。对称是指 A = Aᵀ;正定是指每个特征值都大于零。这听上去限制很多,但符合这个描述的矩阵 其实到处都是:协方差矩阵、格拉姆矩阵、最小二乘的正规方程、有限元法中的刚度矩阵,按其构造方式都是 对称正定的。

42
25
=
20
12
·
21
02

L 对角线上的每个元素都是一个平方根——这里是 √4 = 2 和 √(5 − 1²) = 2——所以这个方法要求每个根号下的 量都保持为正。这个要求恰恰就是正定性,于是算法本身变成了一项检验:分解能走完,矩阵就是正定的; 途中在根号下碰到非正数,就不是。Cholesky 大约比 LU 快一倍,内存用量减半,而且不选主元也稳定——因此 求解器会先检查对称性,只要可能就改用它。

LU 分解在什么地方真正用得上

最常见的场景是同一个系统要反复求解。有限元分析中,刚度矩阵由结构本身决定,而载荷向量一个工况换一个; 电路仿真里,导纳矩阵在网络不变时保持不变,激励却每一步都在变。这些情形都属于「矩阵固定、右端项变化」, 正是 LU 分解为之设计的形态。

它还是若干量的现成来源。行列式是 U 对角线的乘积,前面已经说过;矩阵的逆,也可以通过对 n 个单位向量 逐个做前代与回代来得到,虽然如前所述,多数时候你并不真的需要它。反过来说,如果只解一次方程组,那么 直接做高斯消元与先做 LU 分解的运算量几乎一样—— 分解的价值全部来自第二次以及之后的求解。

常见错误

  • 以为任何矩阵都能分解。主元位置上的零会破坏朴素的 LU。补救办法是置换矩阵:P·A = L·U
  • 把 Cholesky 用在非对称矩阵上。A = L·Lᵀ 按构造就是对称的,非对称的输入不存在这样的分解。请改用 LU。
  • 以为对称就够了。带有负特征值的对称矩阵是不定的,算法会在中途失败。
  • 指望因子是整数。Cholesky 的对角线含平方根,所以即便 A 是整数矩阵,L 通常也是无理的。
  • 算行列式时忘了行交换。每交换一次都会让它变号。

常见问题

LU 分解有什么用途?
用来求解矩阵相同、右端项不断变化的方程组。分解只做一次,之后每个方程组只需两次三角求解。
置换矩阵 P 表示什么?
它记录了哪些行被交换过。采用部分选主元时,结果写作 P·A = L·U。
什么时候该改用 Cholesky 分解?
当矩阵对称且正定时。它大约快一倍,而且由于 A = L·Lᵀ,只需要一个三角因子。
如果我的矩阵不是正定的会怎样?
算法会在某个根号下遇到非正数并停下。这个失败本身就是有用的信息:它正是判定正定性的标准数值检验。
能从 LU 分解得到行列式吗?
能——它等于 U 主对角线元素的乘积,每做一次行交换再乘以 −1。

其他计算器