2.1_LU分解与Gauss消去法

2.1 LU分解与Gauss消去法

2.1.1 LU分解

Gauss 消去法本质上就是对系数矩阵 AA 进行 LU 分解, 即将 AA 分解成两个矩阵的乘积

A=LU,(2.2)A = L U, \tag {2.2}

其中 LL 是单位下三角矩阵, UU 为非奇异上三角矩阵, 然后再对两个三角方程进行求解: 假定矩阵 AA 存在 LU 分解 (2.2), 则方程组 (2.1) 就转化为求解下面两个三角方程组

{Ly=b,Ux=y.\left\{ \begin{array}{l} L y = b, \\ U x = y. \end{array} \right.

显然,上式中的两个三角方程组都非常容易求解

A 将一个复杂问题分解成若干相对简单的问题, 是矩阵分解的一个主要目的.

基于 LU 分解的 Gauss 消去法描述如下:

算法2.1.Gauss消去法

1: 对 AA 进行 LU 分解: A=LUA = LU , 其中 LL 为单位下三角矩阵, UU 为非奇异上三角矩阵;
2: 利用向前回代, 求解 Ly=bLy = b , 即得 y=L1by = L^{-1}b ;
3. 利用向后回代, 求解 Ux=yUx = y , 即得 x=U1y=(LU)1b=A1bx = U^{-1}y = (LU)^{-1}b = A^{-1}b

我们知道, 当系数矩阵 AA 非奇异时, 方程组 (2.1) 总是存在唯一解. 但是, 并不是每个非奇异矩阵都存在 LU 分解.

定理2.1 (LU分解的存在性和唯一性) 矩阵 ARn×nA \in \mathbb{R}^{n \times n} 存在LU分解(即存在单位下三角矩阵 LL 和非奇异上三角矩阵 UU 使得 A=LUA = LU )的充要条件是 AA 的所有顺序主子矩阵都非奇异。进一步,若 AA 存在LU分解,则分解是唯一的。

(板书)

证明. 必要性: 设 A11A_{11}AAkk 阶顺序主子矩阵, 其中 1kn1 \leq k \leq n . 将 A=LUA = LU 写成分块形式, 即

[A11A12A21A22]=[L110L21L22][U11U120U22]=[L11U11L11U12L21U11L21U12+L22U22].\left[ \begin{array}{c c} A _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right] = \left[ \begin{array}{c c} L _ {1 1} & 0 \\ L _ {2 1} & L _ {2 2} \end{array} \right] \left[ \begin{array}{c c} U _ {1 1} & U _ {1 2} \\ 0 & U _ {2 2} \end{array} \right] = \left[ \begin{array}{c c} L _ {1 1} U _ {1 1} & L _ {1 1} U _ {1 2} \\ L _ {2 1} U _ {1 1} & L _ {2 1} U _ {1 2} + L _ {2 2} U _ {2 2} \end{array} \right].

可得 A11=L11U11A_{11} = L_{11}U_{11} 由于 L11L_{11}U11U_{11} 均非奇异, 所以 A11A_{11} 也非奇异.

充分性: 用归纳法.

n=1n = 1 时, 结论显然成立.

假设结论对所有 n1n - 1 阶矩阵都成立, 即对任意 n1n - 1 阶矩阵, 如果其所有的顺序主子矩阵都非奇异, 则存在 LU 分解.

考虑 nn 阶的矩阵 AA , 写成分块形式

A=[A11A12A21A22],A = \left[ \begin{array}{c c} A _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right],

其中 A11R(n1)×(n1)A_{11} \in \mathbb{R}^{(n-1) \times (n-1)}AAn1n-1 阶顺序主子矩阵. 由归纳假设可知, A11A_{11} 存在 LU 分解, 即存在单位下三角矩阵 L11L_{11} 和非奇异上三角矩阵 U11U_{11} 使得

A11=L11U11.A _ {1 1} = L _ {1 1} U _ {1 1}.

L21=A21U111,U12=L111A12,U22=A22L21U12,L _ {2 1} = A _ {2 1} U _ {1 1} ^ {- 1}, \quad U _ {1 2} = L _ {1 1} ^ {- 1} A _ {1 2}, \quad U _ {2 2} = A _ {2 2} - L _ {2 1} U _ {1 2},

[L110L211][U11U120U22]=[L11U11L11U12L21U11U22+L21U12]=[A11A12A21A22]=A.\left[ \begin{array}{c c} L _ {1 1} & 0 \\ L _ {2 1} & 1 \end{array} \right] \left[ \begin{array}{c c} U _ {1 1} & U _ {1 2} \\ 0 & U _ {2 2} \end{array} \right] = \left[ \begin{array}{c c} L _ {1 1} U _ {1 1} & L _ {1 1} U _ {1 2} \\ L _ {2 1} U _ {1 1} & U _ {2 2} + L _ {2 1} U _ {1 2} \end{array} \right] = \left[ \begin{array}{c c} A _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right] = A.

因此可得 AA 的LU分解 A=LUA = LU ,其中 L[L110L211]L \triangleq \begin{bmatrix} L_{11} & 0 \\ L_{21} & 1 \end{bmatrix} 为单位下三角矩阵, U[U11U120U22]U \triangleq \begin{bmatrix} U_{11} & U_{12} \\ 0 & U_{22} \end{bmatrix} 为非奇异的上三角矩阵( UU 的非奇异性可由 AA 的非奇异性可得).

由归纳法可知, 结论成立.

下面证明唯一性. 设 AA 存在两个不同的 LU 分解:

A=LU=L~U~,A = L U = \tilde {L} \tilde {U},

其中 LLL~\tilde{L} 为单位下三角矩阵, UUU~\tilde{U} 为非奇异上三角矩阵. 则有

L1L~=UU~1,L ^ {- 1} \tilde {L} = U \tilde {U} ^ {- 1},

该等式左边为下三角矩阵, 右边为上三角矩阵, 所以只能是对角矩阵. 又单位下三角矩阵的逆仍然是单位下三角矩阵, 所以 L1L~L^{-1}\tilde{L} 的对角线元素全是 1 , 故

L1L~=I,L ^ {- 1} \tilde {L} = I,

L~=L,U~=U\tilde{L} = L, \tilde{U} = U . 唯一性得证

DDUU 的对角线部分, 则 A=LD~U~A = L\tilde{D}\tilde{U} , 其中 U~=D1U\tilde{U} = D^{-1}U 是单位上三角矩阵. 因此我们就有下面的LDU分解.

推论2.2(LDU分解)设 ARn×nA\in \mathbb{R}^{n\times n} 的所有顺序主子矩阵都非奇异,则 AA 存在LDU分解,即存在单位下三角矩阵 LL 和单位上三角矩阵 UU ,以及非奇异对角矩阵 DD ,使得 A=LDUA = LDU ,其中 L,U,DL,U,D 都是唯一的.反之,若 AA 存在LDU分解,则 AA 的所有顺序主子矩阵都非奇异

对角占优情形

一般的非奇异矩阵不一定存在 LU 分解, 但如果 AA 是对角占优的, 则存在 LU 分解. 我们可以证明, 严格对角占优矩阵在 LU 分解中保持严格对角占优性 (见课后练习), 因此通过数学归纳法可以证明严格对角占优矩阵一定存在 LU 分解. 事实上, 只要矩阵列对角占优且非奇异, 则一定存在 LU 分解 [57].

定理2.3 [57] 设 ARn×nA \in \mathbb{R}^{n \times n} 非奇异且列对角占优, 则 AA 存在 LU 分解且 LL 中的元素的绝对值都不超过1. (留作练习, 数学归纳法)

需要注意的是, 在实际计算中, 由于舍入误差的影响, 即使是严格对角占优矩阵, 如果对角占优性不是很强的话, 很有可能会失去对角占优性, 从而导致 LU 分解失败.

2.1.2 LU分解的实现

矩阵的 LU 分解可以通过初等行变换来实现. 给定矩阵

A=[a11a12a1na21a22a2nan1an2ann]Rn×n.A = \left[ \begin{array}{c c c c} a _ {1 1} & a _ {1 2} & \dots & a _ {1 n} \\ a _ {2 1} & a _ {2 2} & \dots & a _ {2 n} \\ \vdots & & \ddots & \\ a _ {n 1} & a _ {n 2} & \dots & a _ {n n} \end{array} \right] \in \mathbb {R} ^ {n \times n}.
  • 第一步: 假定 a110a_{11} \neq 0 , 构造矩阵

L1=[1000l21100l31010ln1001],其 中li1=ai1a11,i=2,3,,n.L _ {1} = \left[ \begin{array}{c c c c c} {{1}} & {{0}} & {{0}} & {{\dots}} & {{0}} \\ {{l _ {2 1}}} & {{1}} & {{0}} & {{\dots}} & {{0}} \\ {{l _ {3 1}}} & {{0}} & {{1}} & {{\dots}} & {{0}} \\ {{\vdots}} & {} & {} & {{\ddots}} & {} \\ {{l _ {n 1}}} & {{0}} & {{0}} & {{\dots}} & {{1}} \end{array} \right], \quad \text {其 中} \quad l _ {i 1} = \frac {a _ {i 1}}{a _ {1 1}}, i = 2, 3, \ldots , n.

易知 L1L_{1} 的逆为

L11=[1000l21100l31010ln1001].L _ {1} ^ {- 1} = \left[ \begin{array}{c c c c c} 1 & 0 & 0 & \dots & 0 \\ - l _ {2 1} & 1 & 0 & \dots & 0 \\ - l _ {3 1} & 0 & 1 & \dots & 0 \\ \vdots & & & \ddots & \\ - l _ {n 1} & 0 & 0 & \dots & 1 \end{array} \right].

L11L_{1}^{-1} 左乘 AA , 并将所得到的矩阵记为 A(1)A^{(1)} , 则

A(1)=L11A[a11a12a1n0a22(1)a2n(1)0an2(1)ann(1)].A ^ {(1)} = L _ {1} ^ {- 1} A \left[ \begin{array}{c c c c} a _ {1 1} & a _ {1 2} & \dots & a _ {1 n} \\ 0 & a _ {2 2} ^ {(1)} & \dots & a _ {2 n} ^ {(1)} \\ \vdots & \vdots & \ddots & \\ 0 & a _ {n 2} ^ {(1)} & \dots & a _ {n n} ^ {(1)} \end{array} \right].

即左乘 L11L_{1}^{-1} 后, AA 的第一列中除第一个元素外其它都变为 0.

  • 第二步: 类似地, 我们可以将上面的操作作用在 A(1)A^{(1)} 的子矩阵 A(1)(2:n,2:n)A^{(1)}(2:n,2:n) 上, 将其第一列除第一个元素外都变为 0. 也就是说, 假定 a22(1)0a_{22}^{(1)} \neq 0 , 构造矩阵

L2=[100001000l32100ln201],其 中li2=ai2(1)a22(1),i=3,4,,n.L _ {2} = \left[ \begin{array}{c c c c c} {{1}} & {{0}} & {{0}} & {{\dots}} & {{0}} \\ {{0}} & {{1}} & {{0}} & {{\dots}} & {{0}} \\ {{0}} & {{l _ {3 2}}} & {{1}} & {{\dots}} & {{0}} \\ {{\vdots}} & {{\vdots}} & {} & {{\ddots}} & {} \\ {{0}} & {{l _ {n 2}}} & {{0}} & {{\dots}} & {{1}} \end{array} \right], \quad \text {其 中} \quad l _ {i 2} = \frac {a _ {i 2} ^ {(1)}}{a _ {2 2} ^ {(1)}}, i = 3, 4, \ldots , n.

L21L_{2}^{-1} 左乘 A(1)A^{(1)} , 并将所得到的矩阵记为 A(2)A^{(2)} , 则

A(2)=L21A(1)=L21L11A=[a11a12a13a1n0a22(1)a23(1)a2n(1)00a33(2)a3n(2)00an3(2)ann(2)].A ^ {(2)} = L _ {2} ^ {- 1} A ^ {(1)} = L _ {2} ^ {- 1} L _ {1} ^ {- 1} A = \left[ \begin{array}{c c c c c} a _ {1 1} & a _ {1 2} & a _ {1 3} & \dots & a _ {1 n} \\ 0 & a _ {2 2} ^ {(1)} & a _ {2 3} ^ {(1)} & \dots & a _ {2 n} ^ {(1)} \\ 0 & 0 & a _ {3 3} ^ {(2)} & \dots & a _ {3 n} ^ {(2)} \\ \vdots & \vdots & \vdots & \ddots \\ 0 & 0 & a _ {n 3} ^ {(2)} & \dots & a _ {n n} ^ {(2)} \end{array} \right].
  • 依此类推, 假定 akk(k1)0(k=3,4,,n1)a_{kk}^{(k - 1)} \neq 0 (k = 3,4,\ldots ,n - 1) , 则我们可以构造一系列的矩阵 L3,L4,,Ln1L_{3}, L_{4}, \ldots, L_{n - 1} , 使得

Ln11L21L11A=[a11a12a13a1n0a22(1)a23(1)a2n(1)00a33(2)a3n(2)000ann(n1)]L _ {n - 1} ^ {- 1} \dots L _ {2} ^ {- 1} L _ {1} ^ {- 1} A = \left[ \begin{array}{c c c c c} a _ {1 1} & a _ {1 2} & a _ {1 3} & \dots & a _ {1 n} \\ 0 & a _ {2 2} ^ {(1)} & a _ {2 3} ^ {(1)} & \dots & a _ {2 n} ^ {(1)} \\ 0 & 0 & a _ {3 3} ^ {(2)} & \dots & a _ {3 n} ^ {(2)} \\ \vdots & \vdots & \vdots & \ddots \\ 0 & 0 & 0 & \dots & a _ {n n} ^ {(n - 1)} \end{array} \right]

为一个上三角矩阵. 我们将这个上三角矩阵记为 UU , 并记

LL1L2Ln1=[1000l21100l31l3210ln1ln2ln31],(2.3)L \triangleq L _ {1} L _ {2} \dots L _ {n - 1} = \left[ \begin{array}{c c c c c} 1 & 0 & 0 & \dots & 0 \\ l _ {2 1} & 1 & 0 & \dots & 0 \\ l _ {3 1} & l _ {3 2} & 1 & \dots & 0 \\ \vdots & \vdots & & \ddots & \\ l _ {n 1} & l _ {n 2} & l _ {n 3} & \dots & 1 \end{array} \right], \tag {2.3}

则可得

A=LU,A = L U,

这就是 AA 的LU分解

将上述过程写成算法,描述如下:

算法2.2.LU分解

1: Set L=I,U=0L = I, U = 0 % 将 LL 设为单位矩阵, UU 设为零矩阵
2: for k=1k = 1 to n1n - 1 do
3: for j=kj = k to nn do
4: ukj=akj%u_{kj} = a_{kj} \quad \% 更新 UU 的第 kk
5: end for
6: for i=k+1i = k + 1 to nn do
7: lik=aik/akkl_{ik} = a_{ik} / a_{kk} %\% 计算 likl_{ik}
8: for j=k+1j = k + 1 to nn do
9: aij=aijlikukja_{ij} = a_{ij} - l_{ik}u_{kj} %\% 更新 A(i,k+1:n)A(i,k + 1:n)
10: end for

11: end for
12: end for

评价算法的一个主要指标是执行时间, 但这依赖于计算机硬件和编程技巧等, 因此直接给出算法执行时间是不太现实的. 所以我们通常是统计算法中算术运算 (加减乘除) 的次数. 在矩阵计算中, 大多仅仅涉及加减乘除和开方运算. 一般情况下, 加减运算次数与乘法运次数具有相同的量级, 而除法运算和开方运算次数具有更低的量级.
为了尽可能地减少运算量, 在实际计算中, 数, 向量和矩阵做乘法运算时的先后执行次序为: 先计算数与向量的乘法, 然后计算矩阵与向量的乘法, 最后才计算矩阵与矩阵的乘法. 比如计算 αABx\alpha A B x , 其中 α\alpha 是数, A,BA, B 是矩阵, xx 是向量, 如果按照从左往右计算的话, 则运算量为 O(n3)\mathcal{O}(n^{3}) , 但是如果先计算 αx\alpha x , 然后计算 B(αx)B(\alpha x) , 最后再计算 A(B(αx))A(B(\alpha x)) 的话, 运算量则为 O(n2)\mathcal{O}(n^{2}) , 相差一个量级.

矩阵 LLUU 的存储

AA 的第 ii 列 (严格下三角部分) 被用于计算 LL 的第 ii 列后, 在后面的计算中不再被使用. 而 AA 的第 ii 行 (上三角部分) 更新后就是 UU 的第 ii 行. 因此, 为了节省存储空间, 我们可以在计算过程中将 LL 的第 ii 列存放在 AA 的第 ii 列 (严格下三角部分, LL 的对角线全部为 1, 不需要存储), 将 UU 的第 ii 行存放在 AA 的第 ii 行 (上三角部分), 这样就不需要另外分配空间存储 LLUU . 计算结束后, AA 的上三角部分为 UU , 其严格下三角部分为 LL 的绝对下三角部分. 此时算法可以描述为:

算法2.3.LU分解(用 AA 存储 LLUU

1: for k=1k = 1 to n1n - 1 do
2: for i=k+1i = k + 1 to nn do
3: aik=aik/akka_{ik} = a_{ik} / a_{kk}
4: for j=k+1j = k + 1 to nn do
5: aij=aijaikakja_{ij} = a_{ij} - a_{ik}a_{kj}
6: end for
7: end for
8: end for

LU分解的运算量

由算法2.2可知,LU分解的运算量为

  • 乘法次数: Tp=k=1n1i=k+1nj=k+1n1=k=1n1(nk)2=16(2n33n2+n)=13n3+O(n2)T_{p} = \sum_{k=1}^{n-1} \sum_{i=k+1}^{n} \sum_{j=k+1}^{n} 1 = \sum_{k=1}^{n-1} (n-k)^{2} = \frac{1}{6} (2n^{3}-3n^{2}+n) = \frac{1}{3} n^{3}+\mathcal{O}(n^{2}) .

  • 加法次数: Ta=k=1n1i=k+1nj=k+1n1=13n312n2+16n=13n3+O(n2)T_{a} = \sum_{k=1}^{n-1} \sum_{i=k+1}^{n} \sum_{j=k+1}^{n} 1 = \frac{1}{3} n^{3} - \frac{1}{2} n^{2} + \frac{1}{6} n = \frac{1}{3} n^{3} + \mathcal{O}(n^{2}) .

  • 除法次数: Td=k=1n1i=k+1n1=12n(n1)=12n212n=12n2+O(n)T_{d} = \sum_{k=1}^{n-1} \sum_{i=k+1}^{n} 1 = \frac{1}{2} n(n-1) = \frac{1}{2} n^{2} - \frac{1}{2} n = \frac{1}{2} n^{2} + \mathcal{O}(n) .

因此总运算量 (含乘法、除法与加法) 为 23n312n216n=23n3+O(n2)\frac{2}{3} n^{3} - \frac{1}{2} n^{2} - \frac{1}{6} n = \frac{2}{3} n^{3} + \mathcal{O}(n^{2}) .

数据更新顺序与计算效率

根据指标的循环次序, 算法 2.3 也称为 KIJ 型 LU 分解. 在实际计算中, 我们一般不建议使用这个算法. 因为对于指标 kk 的每次循环, 都需要更新 AA 的第 k+1k + 1 至第 nn 行. 这种反复读取数据的做法会使得计算效率大大降低.

如果数据是按行存储的, 如 C/C++C / C++ , 为了提高计算效率, 我们可以采用下面的IKJ型LU分解算法.

算法2.4.LU分解(IKJ型)

1: for i=2i = 2 to nn do
2: for k=1k = 1 to i1i - 1 do
3: aik=aik/akka_{ik} = a_{ik} / a_{kk}
4: for j=k+1j = k + 1 to nn do
5: aij=aijaikakja_{ij} = a_{ij} - a_{ik}a_{kj}
6: end for
7: end for
8: end for

IKJ型LU分解算法可以用下图来描述. ([113,p.291])

思考:如果数据是按列存储的,如FORTRAN或MATLAB,则怎样设计算法比较好?

2.1.3 Gauss消去法

假定矩阵 AA 存在LU分解 A=LUA = LU ,则方程组 Ax=bAx = b 就转化为求解下面两个三角方程组

Ly=b,Ux=y.L y = b, \quad U x = y.

这两个方程组都非常容易求解, 于是 Gauss 消去法描述如下:

算法2.5.Gauss消去法

1: 将 AA 进行 LU 分解: A=LUA = LU , 其中 LL 为单位下三角矩阵, UU 为非奇异上三角矩阵;
2: 利用向前回代, 求解 Ly=bLy = b , 即得 y=L1by = L^{-1}b ;
3. 利用向后回代, 求解 Ux=yUx = y , 即得 x=U1y=(LU)1b=A1bx = U^{-1}y = (LU)^{-1}b = A^{-1}b

得到 AA 的LU分解后, 我们最后需要用回代法求解两个三角方程组, 计算过程描述如下.

算法2.6.回代求解 Ly=bLy = bUx=yUx = y

1: y1=b1/l11y_{1} = b_{1} / l_{11} % 向前回代求解 Ly=bLy = b
2: for i=2:ni = 2:n do
3: for j=1:i1j = 1 : i - 1 do
4: bi=bilijyjb_{i} = b_{i} - l_{ij}y_{j}
5: end for
6: yi=bi/liiy_{i} = b_{i} / l_{ii}
7: end for
8: xn=yn/unnx_{n} = y_{n} / u_{nn} %\% 向后回代求解 Ux=yU x = y
9: for i=n1:1:1i = n - 1 : -1 : 1 do
10: for j=n:1:i+1j = n: -1: i + 1 do
11: yi=yiuijxjy_{i} = y_{i} - u_{ij}x_{j}
12: end for
13: xi=yi/uiix_{i} = y_{i} / u_{ii}
14: end for

如果数据是按列存储的, 则采用列存储方式效率会高一些. 下面是以 Ux=yUx = y 为例, 描述按列存储时的回代求解过程.

算法2.7. 向后回代求解 Ux=yUx = y (列存储方式)

1: for k=n:1:1k = n : -1 : 1 do
2: xk=yk/ukkx_{k} = y_{k} / u_{kk}
3: for i=k1:1:1i = k - 1: -1:1 do
4: yi=yixkuiky_{i} = y_{i} - x_{k}u_{ik}
5: end for
6: end for

计算复杂度

这两个算法的运算量: 乘法和加法均 n(n1)n(n - 1) 次, 除法 2n2n 次. 加上 LU 分解的运算量, Gauss 消去法的总运算量为 23n3+O(n2)\frac{2}{3} n^3 + \mathcal{O}(n^2) .

可以证明, 以上两个算法都是向后稳定的 (componentwise backward stable) [70].

2.1.4 选主元LU分解

在 LU 分解过程中, 我们称 akk(k1)a_{kk}^{(k-1)} 为主元. 如果 akk(k1)=0a_{kk}^{(k-1)} = 0 , 则算法就无法进行下去. 即使 akk(k1)a_{kk}^{(k-1)} 不为零, 但如果 akk(k1)|a_{kk}^{(k-1)}| 的值很小, 由于舍入误差的原因, 也可能会给计算结果带来很大的误差. 此时我们就需要通过选主元来解决这个问题.

例2.1 用LU分解求解线性方程组 Ax=bAx = b ,其中 A=[0.0261.33.438.5],b=[61.525.8]A = \begin{bmatrix} 0.02 & 61.3 \\ 3.43 & -8.5 \end{bmatrix}, b = \begin{bmatrix} 61.5 \\ 25.8 \end{bmatrix} ,要求在运算过程中保留3位有效数字. (板书)

解.根据LU分解待定系数法,设

A=LU=[10l211][u11u120u22].A = L U = \left[ \begin{array}{c c} 1 & 0 \\ l _ {2 1} & 1 \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & u _ {1 2} \\ 0 & u _ {2 2} \end{array} \right].

直接比较等式两边可得

u11=a11=0.02,u12=a12=61.3,l21=a21/u11=3.43/0.02172,u22=a22l21u128.51.05×1041.05×104,\begin{array}{l} u _ {1 1} = a _ {1 1} = 0. 0 2, u _ {1 2} = a _ {1 2} = 6 1. 3, \\ l _ {2 1} = a _ {2 1} / u _ {1 1} = 3. 4 3 / 0. 0 2 \approx 1 7 2, \\ u _ {2 2} = a _ {2 2} - l _ {2 1} u _ {1 2} \approx - 8. 5 - 1. 0 5 \times 1 0 ^ {4} \approx - 1. 0 5 \times 1 0 ^ {4}, \\ \end{array}

解方程组 Ly=bLy = b 可得

y1=61.5,y2=b2l21y11.06×104.y _ {1} = 6 1. 5, \quad y _ {2} = b _ {2} - l _ {2 1} y _ {1} \approx - 1. 0 6 \times 1 0 ^ {4}.

解方程组 Ux=yUx = y 可得

x2=y2/u221.01,x1=(y1u12x2)/u110.413/u1120.7x _ {2} = y _ {2} / u _ {2 2} \approx 1. 0 1, \quad x _ {1} = \left(y _ {1} - u _ {1 2} x _ {2}\right) / u _ {1 1} \approx - 0. 4 1 3 / u _ {1 1} \approx - 2 0. 7

事实上, 精确解为 x1=10.0x_{1} = 10.0x2=1.00x_{2} = 1.00 . 我们发现 x1x_{1} 的数值解误差非常大. 出现这个问题的原因就是 a11\left|a_{11}\right| 太小, 用它做主元时会放大舍入误差.

选主元是通过利用置换矩阵(也称排列矩阵)对行进行交换来实现的. 首先介绍置换矩阵的一些基本性质.

引理2.4设 PRn×nP\in \mathbb{R}^{n\times n} 为置换矩阵, ARn×nA\in \mathbb{R}^{n\times n} 为任意矩阵,则

(1) PAPA 相当于将 AA 的行进行置换; APAP 相当于将 AA 的列进行置换;
(2) P1=PTP^{-1} = P^{\mathsf{T}} ,即 PP 是正交矩阵;
(3) det(P)=±1\operatorname{det}(P) = \pm 1 ;
(4) 置换矩阵的乘积仍然是置换矩阵.

定理2.5 (选主元LU分解的存在性) 设 ARn×nA \in \mathbb{R}^{n \times n} 非奇异, 则存在置换矩阵 PL,PRP_L, P_R , 以及单位下三角矩阵 LL 和非奇异上三角矩阵 UU , 使得

PLAPR=LU.P _ {L} A P _ {R} = L U.

(板书)

证明. 用归纳法

n=1n = 1 时, 取 PL=PR=L=1,U=AP_L = P_R = L = 1, U = A 即可.

假设结论对所有 n1n - 1 阶矩阵都成立

考虑 nn 阶非奇异矩阵 ARn×nA \in \mathbb{R}^{n \times n} , 易知 AA 至少存在一个非零元, 取置换矩阵 P1P_{1}P2P_{2} 使得

P1AP2=[a11A12A21A22],P _ {1} A P _ {2} = \left[ \begin{array}{c c} a _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right],

其中 a110,A22R(n1)×(n1)a_{11} \neq 0, A_{22} \in \mathbb{R}^{(n-1) \times (n-1)} . 令

u11=a11,U12=A12,L21=A21/a11,U22=A22L21U12.u _ {1 1} = a _ {1 1}, \quad U _ {1 2} = A _ {1 2}, \quad L _ {2 1} = A _ {2 1} / a _ {1 1}, \quad U _ {2 2} = A _ {2 2} - L _ {2 1} U _ {1 2}.

u110u_{11} \neq 0 ,且有

[10L21I][u11U120U22]=[a11A12A21A22]=P1AP2.\left[ \begin{array}{c c} 1 & 0 \\ L _ {2 1} & I \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \\ 0 & U _ {2 2} \end{array} \right] = \left[ \begin{array}{c c} a _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right] = P _ {1} A P _ {2}.

两边取行列式可得

0det(P1AP2)=det([10L21I])det([u11U120U22])=a11det(U22).0 \neq \det (P _ {1} A P _ {2}) = \det \left(\left[ \begin{array}{c c} 1 & 0 \\ L _ {2 1} & I \end{array} \right]\right) \cdot \det \left(\left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \\ 0 & U _ {2 2} \end{array} \right]\right) = a _ {1 1} \cdot \det (U _ {2 2}).

所以 det(U22)0\operatorname{det}(U_{22}) \neq 0 ,即 U22R(n1)×(n1)U_{22} \in \mathbb{R}^{(n-1) \times (n-1)} 非奇异. 由归纳假设可知, 存在置换矩阵 P~LR(n1)×(n1)\tilde{P}_L \in \mathbb{R}^{(n-1) \times (n-1)}P~RR(n1)×(n1)\tilde{P}_R \in \mathbb{R}^{(n-1) \times (n-1)} , 使得

P~LU22P~R=L~22U~22,\tilde {P} _ {L} U _ {2 2} \tilde {P} _ {R} = \tilde {L} _ {2 2} \tilde {U} _ {2 2},

其中 L~22\tilde{L}_{22} 为单位下三角矩阵, U~22\tilde{U}_{22} 为非奇异上三角矩阵. 令

PL=[100P~L]P1,PR=P2[100P~R],P _ {L} = \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {L} \end{array} \right] P _ {1}, \quad P _ {R} = P _ {2} \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {R} \end{array} \right],

则有

PLAPR=[100P~L]P1AP2[100P~R]=[100P~L][10L21I][u11U120U22][100P~R]=[10P~LL21P~L][u11U120P~LTL~22U~22P~RT][100P~R]=[10P~LL21P~L][100P~1TL~22][u11U120U~22P~RT][100P~R]=[10P~LL21L~22][u11U12P~R0U~22]LU,\begin{array}{l} P _ {L} A P _ {R} = \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {L} \end{array} \right] P _ {1} A P _ {2} \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {R} \end{array} \right] \\ = \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {L} \end{array} \right] \left[ \begin{array}{c c} 1 & 0 \\ L _ {2 1} & I \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \\ 0 & U _ {2 2} \end{array} \right] \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {R} \end{array} \right] \\ = \left[ \begin{array}{c c} 1 & 0 \\ \tilde {P} _ {L} L _ {2 1} & \tilde {P} _ {L} \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \\ 0 & \tilde {P} _ {L} ^ {\mathsf {T}} \tilde {L} _ {2 2} \tilde {U} _ {2 2} \tilde {P} _ {R} ^ {\mathsf {T}} \end{array} \right] \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {R} \end{array} \right] \\ = \left[ \begin{array}{c c} 1 & 0 \\ \tilde {P} _ {L} L _ {2 1} & \tilde {P} _ {L} \end{array} \right] \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {1} ^ {\mathsf {T}} \tilde {L} _ {2 2} \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \\ 0 & \tilde {U} _ {2 2} \tilde {P} _ {R} ^ {\mathsf {T}} \end{array} \right] \left[ \begin{array}{c c} 1 & 0 \\ 0 & \tilde {P} _ {R} \end{array} \right] \\ = \left[ \begin{array}{c c} 1 & 0 \\ \tilde {P} _ {L} L _ {2 1} & \tilde {L} _ {2 2} \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & U _ {1 2} \tilde {P} _ {R} \\ 0 & \tilde {U} _ {2 2} \end{array} \right] \triangleq L U, \\ \end{array}

其中 LL 为单位下三角矩阵, UU 为非奇异上三角矩阵, 即 AA 存在 LU 分解.

因此, 由数学归纳法可知, 结论成立.

定理2.5也可以利用定理2.1的结论来证明,见习题2.3
事实上, 定理2.5中的 PLP_LPRP_R 只有一个是必需的

置换矩阵的选取

问题: 第 kk 步时, 如何选取置换矩阵 PL(k)P_L^{(k)}PR(k)P_R^{(k)} ?

选法一.选取 PL(k)P_L^{(k)}PR(k)P_R^{(k)} 使得主元为剩下的矩阵中绝对值最大,这种选取方法称为“全主元Gauss消去法”,简称GECP(Gaussianeliminationwithcomplete pivoting);

选法二.选取 PL(k)P_L^{(k)}PR(k)P_R^{(k)} 使得主元为第 kk 列中第 kk 到第 nn 个元素中,绝对值最大,这种选取方法称为“部分选主元Gauss消去法”,简称GEPP(Gaussianeliminationwithpartial pivoting),此时 PR(k)=IP_R^{(k)} = I ,因此也称为列主元Gauss消去法.

(1) GECP 比 GEPP 更稳定, 但工作量太大, 在实际应用中通常使用 GEPP 算法.
(2) GEPP 算法能保证 LL 所有的元素的绝对值都不超过 1.

算法2.8.部分选主元LU分解

1: p=1:np = 1:n %\% 用于记录置换矩阵
2: for k=1k = 1 to n1n - 1 do

3: [amax,l]=maxk<i<naik%[a_{\max}, l] = \max_{k < i < n} |a_{ik}| \quad \% 选列主元, 其中 ll 表示主元所在的行
4: if lkl \neq k then

5: for j=1j = 1 to nn do
6: atmp=akj,akj=alj,alj=atmp%a_{tmp} = a_{kj}, a_{kj} = a_{lj}, a_{lj} = a_{tmp} \quad \% 交换 AA 的第 kk 行与第 ll

7: end for

8: ptmp=p(k),p(k)=p(l),p(l)=ptmp%p_{tmp} = p(k), p(k) = p(l), p(l) = p_{tmp} \quad \% 更新置换矩阵
9: end if

10: for i=k+1i = k + 1 to nn do
11: aik=aik/akka_{ik} = a_{ik} / a_{kk}
12: for j=k+1j = k + 1 to nn do
13: aij=aijaikakja_{ij} = a_{ij} - a_{ik}a_{kj}
14: end for
15: end for
16: end for

相应的MATLAB程序见LE_PLU.m.

例2.2 用部分选主元LU分解求解线性方程组 Ax=bAx = b ,其中 A=[0.0261.33.438.5]A = \begin{bmatrix} 0.02 & 61.3 \\ 3.43 & -8.5 \end{bmatrix}b=[61.525.8]b = \begin{bmatrix} 61.5 \\ 25.8 \end{bmatrix} ,要

求在运算过程中保留3位有效数字

(板书)

解.由于 a21>a11|a_{21}| > |a_{11}| ,根据部分选主元LU分解算法,我们需要将第一行与第二行交换,即取 P=[0110],P = \left[ \begin{array}{ll}0 & 1\\ 1 & 0 \end{array} \right], 然后计算 A~=PA=[3.438.50.0261.3]\tilde{A} = PA = \left[ \begin{array}{ll}3.43 & -8.5\\ 0.02 & 61.3 \end{array} \right] 的LU分解,即设

A~=LU=[10l211][u11u120u22].\tilde {A} = L U = \left[ \begin{array}{c c} 1 & 0 \\ l _ {2 1} & 1 \end{array} \right] \left[ \begin{array}{c c} u _ {1 1} & u _ {1 2} \\ 0 & u _ {2 2} \end{array} \right].

直接比较等式两边可得

u11=a~11=3.43,u12=a~12=8.5,l21=a~21/u115.83×103,u22=a~22l21u1261.3+0.049661.3,\begin{array}{l} u _ {1 1} = \tilde {a} _ {1 1} = 3. 4 3, u _ {1 2} = \tilde {a} _ {1 2} = - 8. 5, \\ l _ {2 1} = \tilde {a} _ {2 1} / u _ {1 1} \approx 5. 8 3 \times 1 0 ^ {- 3}, \\ u _ {2 2} = \tilde {a} _ {2 2} - l _ {2 1} u _ {1 2} \approx 6 1. 3 + 0. 0 4 9 6 \approx 6 1. 3, \\ \end{array}

PA[1.0005.83×1031.00][3.438.50061.3].P A \approx \left[ \begin{array}{c c} 1. 0 0 & 0 \\ 5. 8 3 \times 1 0 ^ {- 3} & 1. 0 0 \end{array} \right] \left[ \begin{array}{c c} 3. 4 3 & - 8. 5 0 \\ 0 & 6 1. 3 \end{array} \right].

解方程组 Ly=PbLy = Pb 可得

y1=25.8,y261.2.y _ {1} = 2 5. 8, \quad y _ {2} \approx 6 1. 2.

解方程组 Ux=yUx = y 可得

x2=y2/u220.998,x1=(y1u12x2)/u1110.0.x _ {2} = y _ {2} / u _ {2 2} \approx 0. 9 9 8, \quad x _ {1} = (y _ {1} - u _ {1 2} x _ {2}) / u _ {1 1} \approx 1 0. 0.

与精确解 x1=10,x2=1x_{1} = 10, x_{2} = 1 相比,数值解具有3位有效数字

2.1.5 矩阵求逆

我们可以通过部分选主元 LU 分解来计算矩阵的逆. 设 PA=LUPA = LU , 则

A1=U1L1P,A ^ {- 1} = U ^ {- 1} L ^ {- 1} P,

等价于求解下面 2n2n 个三角线性方程组

Lyi=Pei,Uxi=yi,i=1,2,,n.L y _ {i} = P e _ {i}, \quad U x _ {i} = y _ {i}, \quad i = 1, 2, \dots , n.

思考:也可以分别计算 L1L^{-1}U1U^{-1} ,然后相乘.哪种方法划算?

2.1.6 分块LU分解

为了提高计算效率, 实际计算中通常采用分块 LU 分解, 即

A=[A11A12A1pA21A22A2pAp1Ap2App]=[I1L21I2Lp1Lp,p1Ip][U11U12U1pU22U2pUpp]=LU,\boldsymbol {A} = \left[ \begin{array}{c c c c} A _ {1 1} & A _ {1 2} & \dots & A _ {1 p} \\ A _ {2 1} & A _ {2 2} & \dots & A _ {2 p} \\ \vdots & & \ddots & \vdots \\ A _ {p 1} & A _ {p 2} & \dots & A _ {p p} \end{array} \right] = \left[ \begin{array}{c c c c} I _ {1} & & & \\ L _ {2 1} & I _ {2} & & \\ \vdots & \ddots & \ddots & \\ L _ {p 1} & \dots & L _ {p, p - 1} & I _ {p} \end{array} \right] \left[ \begin{array}{c c c c} U _ {1 1} & U _ {1 2} & \dots & U _ {1 p} \\ & U _ {2 2} & \dots & U _ {2 p} \\ & & \ddots & \vdots \\ & & & U _ {p p} \end{array} \right] = \boldsymbol {L U},

其中 AiiA_{ii} 是非奇异的方阵

与定理2.1相类似, 对于分块LU分解, 我们有下面的结论

定理2.6(分块LU分解的存在性和唯一性)矩阵 A\mathbf{A} 存在唯一分块LU分解的充要条件是 A\mathbf{A} 的所有顺序分块主子矩阵都非奇异. (留作练习)

几点注记

分块LU分解不是LU分解,若 AA 存在LU分解,则一定存在分块LU分解,反之不成立.
分块 LU 分解与普通 LU 分解的总运算量是一样的, 但分块 LU 分解可以借助 3 级 BLAS 运算, 因此效率更高.
在计算分块 LU 分解过程中需要求解一系列小规模的线性方程组 (以 AiiA_{ii} 为系数矩阵), 可以采用普通 (选主元) LU 分解方法求解.