前置知识: 线性代数

LU分解

9 minAdvanced2026/6/14

LU分解的定义与条件,Doolittle分解与Crout分解,LU分解的计算步骤与应用。

1. LU分解的定义

1.1 定义

设 AA 为 nn 阶方阵,若 AA 可以分解为:

A=LUA = LU

其中 LL 为下三角矩阵,UU 为上三角矩阵,则称为 AA 的 LU 分解。

1.2 存在条件

定理:若 AA 的所有顺序主子式都不为零(Δk≠0\Delta_k \neq 0,k=1,2,…,n−1k = 1, 2, \ldots, n-1),则 AA 的 LU 分解存在且唯一(在指定 LL 或 UU 的对角线元素时)。

1.3 PLU 分解

对于一般的矩阵,可能需要行交换才能进行 LU 分解:

PA=LUPA = LU

其中 PP 为置换矩阵。这称为 PLU 分解,对任何可逆矩阵都存在。

2. Doolittle 分解

2.1 定义

在 Doolittle 分解中,LL 为单位下三角矩阵(主对角线为1),UU 为上三角矩阵:

A=LU=(10⋯0l211⋯0⋮⋮⋱⋮ln1ln2⋯1)(u11u12⋯u1n0u22⋯u2n⋮⋮⋱⋮00⋯unn)A = LU = \begin{pmatrix} 1 & 0 & \cdots & 0 \\ l_{21} & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ l_{n1} & l_{n2} & \cdots & 1 \end{pmatrix}\begin{pmatrix} u_{11} & u_{12} & \cdots & u_{1n} \\ 0 & u_{22} & \cdots & u_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & u_{nn} \end{pmatrix}

2.2 计算公式

第一行:u1j=a1ju_{1j} = a_{1j}(j=1,2,…,nj = 1, 2, \ldots, n)

第一列:li1=ai1/u11l_{i1} = a_{i1}/u_{11}(i=2,3,…,ni = 2, 3, \ldots, n)

一般地(k=2,3,…,nk = 2, 3, \ldots, n):

ukj=akj−∑s=1k−1lksusj(j=k,k+1,…,n)u_{kj} = a_{kj} - \sum_{s=1}^{k-1} l_{ks}u_{sj} \quad (j = k, k+1, \ldots, n)

lik=1ukk(aik−∑s=1k−1lisusk)(i=k+1,k+2,…,n)l_{ik} = \frac{1}{u_{kk}}\left(a_{ik} - \sum_{s=1}^{k-1} l_{is}u_{sk}\right) \quad (i = k+1, k+2, \ldots, n)

2.3 完整示例

对 A=(211433879)A = \begin{pmatrix} 2 & 1 & 1 \\ 4 & 3 & 3 \\ 8 & 7 & 9 \end{pmatrix} 进行 Doolittle 分解。

步骤1:u11=2u_{11} = 2,u12=1u_{12} = 1,u13=1u_{13} = 1

l21=4/2=2l_{21} = 4/2 = 2,l31=8/2=4l_{31} = 8/2 = 4

步骤2:u22=3−2×1=1u_{22} = 3 - 2 \times 1 = 1,u23=3−2×1=1u_{23} = 3 - 2 \times 1 = 1

l32=(7−4×1)/1=3l_{32} = (7 - 4 \times 1)/1 = 3

步骤3:u33=9−4×1−3×1=2u_{33} = 9 - 4 \times 1 - 3 \times 1 = 2

L=(100210431),U=(211011002)L = \begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 4 & 3 & 1 \end{pmatrix}, \quad U = \begin{pmatrix} 2 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 2 \end{pmatrix}

验证:LU=(211433879)=ALU = \begin{pmatrix} 2 & 1 & 1 \\ 4 & 3 & 3 \\ 8 & 7 & 9 \end{pmatrix} = A

3. Crout 分解

3.1 定义

在 Crout 分解中,LL 为下三角矩阵,UU 为单位上三角矩阵(主对角线为1):

A=LU=(l110⋯0l21l22⋯0⋮⋮⋱⋮ln1ln2⋯lnn)(1u12⋯u1n01⋯u2n⋮⋮⋱⋮00⋯1)A = LU = \begin{pmatrix} l_{11} & 0 & \cdots & 0 \\ l_{21} & l_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ l_{n1} & l_{n2} & \cdots & l_{nn} \end{pmatrix}\begin{pmatrix} 1 & u_{12} & \cdots & u_{1n} \\ 0 & 1 & \cdots & u_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{pmatrix}

3.2 计算公式

第一列:li1=ai1l_{i1} = a_{i1}(i=1,2,…,ni = 1, 2, \ldots, n)

第一行:u1j=a1j/l11u_{1j} = a_{1j}/l_{11}(j=2,3,…,nj = 2, 3, \ldots, n)

一般地:

lik=aik−∑s=1k−1lisusk(i=k,k+1,…,n)l_{ik} = a_{ik} - \sum_{s=1}^{k-1} l_{is}u_{sk} \quad (i = k, k+1, \ldots, n)

ukj=1lkk(akj−∑s=1k−1lksusj)(j=k+1,k+2,…,n)u_{kj} = \frac{1}{l_{kk}}\left(a_{kj} - \sum_{s=1}^{k-1} l_{ks}u_{sj}\right) \quad (j = k+1, k+2, \ldots, n)

4. LDU 分解

4.1 定义

将 AA 分解为 A=LDUA = LDU,其中 LL 为单位下三角矩阵,DD 为对角矩阵,UU 为单位上三角矩阵。

4.2 与 LU 分解的关系

若 A=LUA = LU(Doolittle 分解),则 A=LDU′A = LDU',其中 D=diag(u11,u22,…,unn)D = \text{diag}(u_{11}, u_{22}, \ldots, u_{nn}),U′=D−1UU' = D^{-1}U。

5. LU 分解的应用

5.1 解线性方程组

Ax=bAx = b,A=LUA = LU:

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

分解本身需要 O(n3)O(n^3),但一旦分解完成,对不同的 bb 只需 O(n2)O(n^2)。

5.2 求行列式

∣A∣=∣L∣⋅∣U∣=u11u22⋯unn|A| = |L| \cdot |U| = u_{11}u_{22}\cdots u_{nn}(Doolittle 分解中 ∣L∣=1|L| = 1)

5.3 求逆矩阵

A−1=U−1L−1A^{-1} = U^{-1}L^{-1},分别解 nn 个三角形方程组。

6. Cholesky 分解

6.1 定义

若 AA 为正定矩阵,则 AA 可分解为:

A=LLTA = LL^T

其中 LL 为下三角矩阵(对角线元素为正)。这称为 Cholesky 分解。

6.2 计算公式

lkk=akk−∑s=1k−1lks2l_{kk} = \sqrt{a_{kk} - \sum_{s=1}^{k-1} l_{ks}^2}

lik=1lkk(aik−∑s=1k−1lislks)(i=k+1,…,n)l_{ik} = \frac{1}{l_{kk}}\left(a_{ik} - \sum_{s=1}^{k-1} l_{is}l_{ks}\right) \quad (i = k+1, \ldots, n)

6.3 示例

对 A=(4225)A = \begin{pmatrix} 4 & 2 \\ 2 & 5 \end{pmatrix} 进行 Cholesky 分解。

l11=2l_{11} = 2,l21=2/2=1l_{21} = 2/2 = 1,l22=5−1=2l_{22} = \sqrt{5 - 1} = 2

L=(2012),LT=(2102)L = \begin{pmatrix} 2 & 0 \\ 1 & 2 \end{pmatrix}, \quad L^T = \begin{pmatrix} 2 & 1 \\ 0 & 2 \end{pmatrix}

验证:LLT=(4225)LL^T = \begin{pmatrix} 4 & 2 \\ 2 & 5 \end{pmatrix}

6.4 Cholesky 分解的优势

  • 计算量约为 LU 分解的一半
  • 数值稳定性好
  • 只需存储 LL,节省存储空间
  • 正定性的数值验证