2.1 LU分解与Gauss消去法 2.1.1 LU分解 Gauss 消去法本质上就是对系数矩阵 A A A 进行 LU 分解, 即将 A A A 分解成两个矩阵的乘积
A = L U , (2.2) A = L U, \tag {2.2} A = LU , ( 2.2 ) 其中 L L L 是单位下三角矩阵, U U U 为非奇异上三角矩阵, 然后再对两个三角方程进行求解: 假定矩阵 A A A 存在 LU 分解 (2.2), 则方程组 (2.1) 就转化为求解下面两个三角方程组
{ L y = b , U x = y . \left\{ \begin{array}{l} L y = b, \\ U x = y. \end{array} \right. { L y = b , Ux = y . 显然,上式中的两个三角方程组都非常容易求解
A 将一个复杂问题分解成若干相对简单的问题, 是矩阵分解的一个主要目的.
基于 LU 分解的 Gauss 消去法描述如下:
算法2.1.Gauss消去法 1: 对 A A A 进行 LU 分解: A = L U A = LU A = LU , 其中 L L L 为单位下三角矩阵, U U U 为非奇异上三角矩阵; 2: 利用向前回代, 求解 L y = b Ly = b L y = b , 即得 y = L − 1 b y = L^{-1}b y = L − 1 b ; 3. 利用向后回代, 求解 U x = y Ux = y Ux = y , 即得 x = U − 1 y = ( L U ) − 1 b = A − 1 b x = U^{-1}y = (LU)^{-1}b = A^{-1}b x = U − 1 y = ( LU ) − 1 b = A − 1 b
我们知道, 当系数矩阵 A A A 非奇异时, 方程组 (2.1) 总是存在唯一解. 但是, 并不是每个非奇异矩阵都存在 LU 分解.
定理2.1 (LU分解的存在性和唯一性) 矩阵 A ∈ R n × n A \in \mathbb{R}^{n \times n} A ∈ R n × n 存在LU分解(即存在单位下三角矩阵 L L L 和非奇异上三角矩阵 U U U 使得 A = L U A = LU A = LU )的充要条件是 A A A 的所有顺序主子矩阵都非奇异。进一步,若 A A A 存在LU分解,则分解是唯一的。
(板书)
证明. 必要性: 设 A 11 A_{11} A 11 是 A A A 的 k k k 阶顺序主子矩阵, 其中 1 ≤ k ≤ n 1 \leq k \leq n 1 ≤ k ≤ n . 将 A = L U A = LU A = LU 写成分块形式, 即
[ A 11 A 12 A 21 A 22 ] = [ L 11 0 L 21 L 22 ] [ U 11 U 12 0 U 22 ] = [ L 11 U 11 L 11 U 12 L 21 U 11 L 21 U 12 + L 22 U 22 ] . \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]. [ A 11 A 21 A 12 A 22 ] = [ L 11 L 21 0 L 22 ] [ U 11 0 U 12 U 22 ] = [ L 11 U 11 L 21 U 11 L 11 U 12 L 21 U 12 + L 22 U 22 ] . 可得 A 11 = L 11 U 11 A_{11} = L_{11}U_{11} A 11 = L 11 U 11 由于 L 11 L_{11} L 11 和 U 11 U_{11} U 11 均非奇异, 所以 A 11 A_{11} A 11 也非奇异.
充分性: 用归纳法.
当 n = 1 n = 1 n = 1 时, 结论显然成立.
假设结论对所有 n − 1 n - 1 n − 1 阶矩阵都成立, 即对任意 n − 1 n - 1 n − 1 阶矩阵, 如果其所有的顺序主子矩阵都非奇异, 则存在 LU 分解.
考虑 n n n 阶的矩阵 A A A , 写成分块形式
A = [ A 11 A 12 A 21 A 22 ] , A = \left[ \begin{array}{c c} A _ {1 1} & A _ {1 2} \\ A _ {2 1} & A _ {2 2} \end{array} \right], A = [ A 11 A 21 A 12 A 22 ] , 其中 A 11 ∈ R ( n − 1 ) × ( n − 1 ) A_{11} \in \mathbb{R}^{(n-1) \times (n-1)} A 11 ∈ R ( n − 1 ) × ( n − 1 ) 是 A A A 的 n − 1 n-1 n − 1 阶顺序主子矩阵. 由归纳假设可知, A 11 A_{11} A 11 存在 LU 分解, 即存在单位下三角矩阵 L 11 L_{11} L 11 和非奇异上三角矩阵 U 11 U_{11} U 11 使得
A 11 = L 11 U 11 . A _ {1 1} = L _ {1 1} U _ {1 1}. A 11 = L 11 U 11 . 令
L 21 = A 21 U 11 − 1 , U 12 = L 11 − 1 A 12 , U 22 = A 22 − L 21 U 12 , 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}, L 21 = A 21 U 11 − 1 , U 12 = L 11 − 1 A 12 , U 22 = A 22 − L 21 U 12 , 则
[ L 11 0 L 21 1 ] [ U 11 U 12 0 U 22 ] = [ L 11 U 11 L 11 U 12 L 21 U 11 U 22 + L 21 U 12 ] = [ A 11 A 12 A 21 A 22 ] = 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. [ L 11 L 21 0 1 ] [ U 11 0 U 12 U 22 ] = [ L 11 U 11 L 21 U 11 L 11 U 12 U 22 + L 21 U 12 ] = [ A 11 A 21 A 12 A 22 ] = A . 因此可得 A A A 的LU分解 A = L U A = LU A = LU ,其中 L ≜ [ L 11 0 L 21 1 ] L \triangleq \begin{bmatrix} L_{11} & 0 \\ L_{21} & 1 \end{bmatrix} L ≜ [ L 11 L 21 0 1 ] 为单位下三角矩阵, U ≜ [ U 11 U 12 0 U 22 ] U \triangleq \begin{bmatrix} U_{11} & U_{12} \\ 0 & U_{22} \end{bmatrix} U ≜ [ U 11 0 U 12 U 22 ] 为非奇异的上三角矩阵( U U U 的非奇异性可由 A A A 的非奇异性可得).
由归纳法可知, 结论成立.
下面证明唯一性. 设 A A A 存在两个不同的 LU 分解:
A = L U = L ~ U ~ , A = L U = \tilde {L} \tilde {U}, A = LU = L ~ U ~ , 其中 L L L 和 L ~ \tilde{L} L ~ 为单位下三角矩阵, U U U 和 U ~ \tilde{U} U ~ 为非奇异上三角矩阵. 则有
L − 1 L ~ = U U ~ − 1 , L ^ {- 1} \tilde {L} = U \tilde {U} ^ {- 1}, L − 1 L ~ = U U ~ − 1 , 该等式左边为下三角矩阵, 右边为上三角矩阵, 所以只能是对角矩阵. 又单位下三角矩阵的逆仍然是单位下三角矩阵, 所以 L − 1 L ~ L^{-1}\tilde{L} L − 1 L ~ 的对角线元素全是 1 , 故
L − 1 L ~ = I , L ^ {- 1} \tilde {L} = I, L − 1 L ~ = I , 即 L ~ = L , U ~ = U \tilde{L} = L, \tilde{U} = U L ~ = L , U ~ = U . 唯一性得证
记 D D D 为 U U U 的对角线部分, 则 A = L D ~ U ~ A = L\tilde{D}\tilde{U} A = L D ~ U ~ , 其中 U ~ = D − 1 U \tilde{U} = D^{-1}U U ~ = D − 1 U 是单位上三角矩阵. 因此我们就有下面的LDU分解.
推论2.2(LDU分解)设 A ∈ R n × n A\in \mathbb{R}^{n\times n} A ∈ R n × n 的所有顺序主子矩阵都非奇异,则 A A A 存在LDU分解,即存在单位下三角矩阵 L L L 和单位上三角矩阵 U U U ,以及非奇异对角矩阵 D D D ,使得 A = L D U A = LDU A = L D U ,其中 L , U , D L,U,D L , U , D 都是唯一的.反之,若 A A A 存在LDU分解,则 A A A 的所有顺序主子矩阵都非奇异
对角占优情形 一般的非奇异矩阵不一定存在 LU 分解, 但如果 A A A 是对角占优的, 则存在 LU 分解. 我们可以证明, 严格对角占优矩阵在 LU 分解中保持严格对角占优性 (见课后练习), 因此通过数学归纳法可以证明严格对角占优矩阵一定存在 LU 分解. 事实上, 只要矩阵列对角占优且非奇异, 则一定存在 LU 分解 [57].
定理2.3 [57] 设 A ∈ R n × n A \in \mathbb{R}^{n \times n} A ∈ R n × n 非奇异且列对角占优, 则 A A A 存在 LU 分解且 L L L 中的元素的绝对值都不超过1. (留作练习, 数学归纳法)
需要注意的是, 在实际计算中, 由于舍入误差的影响, 即使是严格对角占优矩阵, 如果对角占优性不是很强的话, 很有可能会失去对角占优性, 从而导致 LU 分解失败.
2.1.2 LU分解的实现 矩阵的 LU 分解可以通过初等行变换来实现. 给定矩阵
A = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n ⋮ ⋱ a n 1 a n 2 … a n n ] ∈ R n × 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}. A = a 11 a 21 ⋮ a n 1 a 12 a 22 a n 2 … … ⋱ … a 1 n a 2 n a nn ∈ R n × n . 第一步: 假定 a 11 ≠ 0 a_{11} \neq 0 a 11 = 0 , 构造矩阵
L 1 = [ 1 0 0 … 0 l 21 1 0 … 0 l 31 0 1 … 0 ⋮ ⋱ l n 1 0 0 … 1 ] , 其 中 l i 1 = a i 1 a 11 , 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. L 1 = 1 l 21 l 31 ⋮ l n 1 0 1 0 0 0 0 1 0 … … … ⋱ … 0 0 0 1 , 其 中 l i 1 = a 11 a i 1 , i = 2 , 3 , … , n . 易知 L 1 L_{1} L 1 的逆为
L 1 − 1 = [ 1 0 0 … 0 − l 21 1 0 … 0 − l 31 0 1 … 0 ⋮ ⋱ − l n 1 0 0 … 1 ] . 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]. L 1 − 1 = 1 − l 21 − l 31 ⋮ − l n 1 0 1 0 0 0 0 1 0 … … … ⋱ … 0 0 0 1 . 用 L 1 − 1 L_{1}^{-1} L 1 − 1 左乘 A A A , 并将所得到的矩阵记为 A ( 1 ) A^{(1)} A ( 1 ) , 则
A ( 1 ) = L 1 − 1 A [ a 11 a 12 … a 1 n 0 a 22 ( 1 ) … a 2 n ( 1 ) ⋮ ⋮ ⋱ 0 a n 2 ( 1 ) … a n n ( 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]. A ( 1 ) = L 1 − 1 A a 11 0 ⋮ 0 a 12 a 22 ( 1 ) ⋮ a n 2 ( 1 ) … … ⋱ … a 1 n a 2 n ( 1 ) a nn ( 1 ) . 即左乘 L 1 − 1 L_{1}^{-1} L 1 − 1 后, A A A 的第一列中除第一个元素外其它都变为 0.
第二步: 类似地, 我们可以将上面的操作作用在 A ( 1 ) A^{(1)} A ( 1 ) 的子矩阵 A ( 1 ) ( 2 : n , 2 : n ) A^{(1)}(2:n,2:n) A ( 1 ) ( 2 : n , 2 : n ) 上, 将其第一列除第一个元素外都变为 0. 也就是说, 假定 a 22 ( 1 ) ≠ 0 a_{22}^{(1)} \neq 0 a 22 ( 1 ) = 0 , 构造矩阵
L 2 = [ 1 0 0 … 0 0 1 0 … 0 0 l 32 1 … 0 ⋮ ⋮ ⋱ 0 l n 2 0 … 1 ] , 其 中 l i 2 = a i 2 ( 1 ) a 22 ( 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. L 2 = 1 0 0 ⋮ 0 0 1 l 32 ⋮ l n 2 0 0 1 0 … … … ⋱ … 0 0 0 1 , 其 中 l i 2 = a 22 ( 1 ) a i 2 ( 1 ) , i = 3 , 4 , … , n . 用 L 2 − 1 L_{2}^{-1} L 2 − 1 左乘 A ( 1 ) A^{(1)} A ( 1 ) , 并将所得到的矩阵记为 A ( 2 ) A^{(2)} A ( 2 ) , 则
A ( 2 ) = L 2 − 1 A ( 1 ) = L 2 − 1 L 1 − 1 A = [ a 11 a 12 a 13 … a 1 n 0 a 22 ( 1 ) a 23 ( 1 ) … a 2 n ( 1 ) 0 0 a 33 ( 2 ) … a 3 n ( 2 ) ⋮ ⋮ ⋮ ⋱ 0 0 a n 3 ( 2 ) … a n n ( 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]. A ( 2 ) = L 2 − 1 A ( 1 ) = L 2 − 1 L 1 − 1 A = a 11 0 0 ⋮ 0 a 12 a 22 ( 1 ) 0 ⋮ 0 a 13 a 23 ( 1 ) a 33 ( 2 ) ⋮ a n 3 ( 2 ) … … … ⋱ … a 1 n a 2 n ( 1 ) a 3 n ( 2 ) a nn ( 2 ) . 依此类推, 假定 a k k ( k − 1 ) ≠ 0 ( k = 3 , 4 , … , n − 1 ) a_{kk}^{(k - 1)} \neq 0 (k = 3,4,\ldots ,n - 1) a kk ( k − 1 ) = 0 ( k = 3 , 4 , … , n − 1 ) , 则我们可以构造一系列的矩阵 L 3 , L 4 , … , L n − 1 L_{3}, L_{4}, \ldots, L_{n - 1} L 3 , L 4 , … , L n − 1 , 使得
L n − 1 − 1 … L 2 − 1 L 1 − 1 A = [ a 11 a 12 a 13 … a 1 n 0 a 22 ( 1 ) a 23 ( 1 ) … a 2 n ( 1 ) 0 0 a 33 ( 2 ) … a 3 n ( 2 ) ⋮ ⋮ ⋮ ⋱ 0 0 0 … a n n ( n − 1 ) ] 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] L n − 1 − 1 … L 2 − 1 L 1 − 1 A = a 11 0 0 ⋮ 0 a 12 a 22 ( 1 ) 0 ⋮ 0 a 13 a 23 ( 1 ) a 33 ( 2 ) ⋮ 0 … … … ⋱ … a 1 n a 2 n ( 1 ) a 3 n ( 2 ) a nn ( n − 1 ) 为一个上三角矩阵. 我们将这个上三角矩阵记为 U U U , 并记
L ≜ L 1 L 2 … L n − 1 = [ 1 0 0 … 0 l 21 1 0 … 0 l 31 l 32 1 … 0 ⋮ ⋮ ⋱ l n 1 l n 2 l n 3 … 1 ] , (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} L ≜ L 1 L 2 … L n − 1 = 1 l 21 l 31 ⋮ l n 1 0 1 l 32 ⋮ l n 2 0 0 1 l n 3 … … … ⋱ … 0 0 0 1 , ( 2.3 ) 则可得
这就是 A A A 的LU分解
将上述过程写成算法,描述如下:
算法2.2.LU分解 1: Set L = I , U = 0 L = I, U = 0 L = I , U = 0 % 将 L L L 设为单位矩阵, U U U 设为零矩阵 2: for k = 1 k = 1 k = 1 to n − 1 n - 1 n − 1 do 3: for j = k j = k j = k to n n n do 4: u k j = a k j % u_{kj} = a_{kj} \quad \% u kj = a kj % 更新 U U U 的第 k k k 行 5: end for 6: for i = k + 1 i = k + 1 i = k + 1 to n n n do 7: l i k = a i k / a k k l_{ik} = a_{ik} / a_{kk} l ik = a ik / a kk % \% % 计算 l i k l_{ik} l ik 8: for j = k + 1 j = k + 1 j = k + 1 to n n n do 9: a i j = a i j − l i k u k j a_{ij} = a_{ij} - l_{ik}u_{kj} a ij = a ij − l ik u kj % \% % 更新 A ( i , k + 1 : n ) A(i,k + 1:n) A ( i , k + 1 : n ) 10: end for
11: end for 12: end for
评价算法的一个主要指标是执行时间, 但这依赖于计算机硬件和编程技巧等, 因此直接给出算法执行时间是不太现实的. 所以我们通常是统计算法中算术运算 (加减乘除) 的次数. 在矩阵计算中, 大多仅仅涉及加减乘除和开方运算. 一般情况下, 加减运算次数与乘法运次数具有相同的量级, 而除法运算和开方运算次数具有更低的量级. 为了尽可能地减少运算量, 在实际计算中, 数, 向量和矩阵做乘法运算时的先后执行次序为: 先计算数与向量的乘法, 然后计算矩阵与向量的乘法, 最后才计算矩阵与矩阵的乘法. 比如计算 α A B x \alpha A B x α A B x , 其中 α \alpha α 是数, A , B A, B A , B 是矩阵, x x x 是向量, 如果按照从左往右计算的话, 则运算量为 O ( n 3 ) \mathcal{O}(n^{3}) O ( n 3 ) , 但是如果先计算 α x \alpha x αx , 然后计算 B ( α x ) B(\alpha x) B ( αx ) , 最后再计算 A ( B ( α x ) ) A(B(\alpha x)) A ( B ( αx )) 的话, 运算量则为 O ( n 2 ) \mathcal{O}(n^{2}) O ( n 2 ) , 相差一个量级.
矩阵 L L L 和 U U U 的存储 当 A A A 的第 i i i 列 (严格下三角部分) 被用于计算 L L L 的第 i i i 列后, 在后面的计算中不再被使用. 而 A A A 的第 i i i 行 (上三角部分) 更新后就是 U U U 的第 i i i 行. 因此, 为了节省存储空间, 我们可以在计算过程中将 L L L 的第 i i i 列存放在 A A A 的第 i i i 列 (严格下三角部分, L L L 的对角线全部为 1, 不需要存储), 将 U U U 的第 i i i 行存放在 A A A 的第 i i i 行 (上三角部分), 这样就不需要另外分配空间存储 L L L 和 U U U . 计算结束后, A A A 的上三角部分为 U U U , 其严格下三角部分为 L L L 的绝对下三角部分. 此时算法可以描述为:
算法2.3.LU分解(用 A A A 存储 L L L 和 U U U ) 1: for k = 1 k = 1 k = 1 to n − 1 n - 1 n − 1 do 2: for i = k + 1 i = k + 1 i = k + 1 to n n n do 3: a i k = a i k / a k k a_{ik} = a_{ik} / a_{kk} a ik = a ik / a kk 4: for j = k + 1 j = k + 1 j = k + 1 to n n n do 5: a i j = a i j − a i k a k j a_{ij} = a_{ij} - a_{ik}a_{kj} a ij = a ij − a ik a kj 6: end for 7: end for 8: end for
LU分解的运算量 由算法2.2可知,LU分解的运算量为
乘法次数: T p = ∑ k = 1 n − 1 ∑ i = k + 1 n ∑ j = k + 1 n 1 = ∑ k = 1 n − 1 ( n − k ) 2 = 1 6 ( 2 n 3 − 3 n 2 + n ) = 1 3 n 3 + O ( n 2 ) 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}) T p = ∑ k = 1 n − 1 ∑ i = k + 1 n ∑ j = k + 1 n 1 = ∑ k = 1 n − 1 ( n − k ) 2 = 6 1 ( 2 n 3 − 3 n 2 + n ) = 3 1 n 3 + O ( n 2 ) .
加法次数: T a = ∑ k = 1 n − 1 ∑ i = k + 1 n ∑ j = k + 1 n 1 = 1 3 n 3 − 1 2 n 2 + 1 6 n = 1 3 n 3 + O ( n 2 ) 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}) T a = ∑ k = 1 n − 1 ∑ i = k + 1 n ∑ j = k + 1 n 1 = 3 1 n 3 − 2 1 n 2 + 6 1 n = 3 1 n 3 + O ( n 2 ) .
除法次数: T d = ∑ k = 1 n − 1 ∑ i = k + 1 n 1 = 1 2 n ( n − 1 ) = 1 2 n 2 − 1 2 n = 1 2 n 2 + 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) T d = ∑ k = 1 n − 1 ∑ i = k + 1 n 1 = 2 1 n ( n − 1 ) = 2 1 n 2 − 2 1 n = 2 1 n 2 + O ( n ) .
因此总运算量 (含乘法、除法与加法) 为 2 3 n 3 − 1 2 n 2 − 1 6 n = 2 3 n 3 + O ( n 2 ) \frac{2}{3} n^{3} - \frac{1}{2} n^{2} - \frac{1}{6} n = \frac{2}{3} n^{3} + \mathcal{O}(n^{2}) 3 2 n 3 − 2 1 n 2 − 6 1 n = 3 2 n 3 + O ( n 2 ) .
数据更新顺序与计算效率 根据指标的循环次序, 算法 2.3 也称为 KIJ 型 LU 分解. 在实际计算中, 我们一般不建议使用这个算法. 因为对于指标 k k k 的每次循环, 都需要更新 A A A 的第 k + 1 k + 1 k + 1 至第 n n n 行. 这种反复读取数据的做法会使得计算效率大大降低.
如果数据是按行存储的, 如 C / C + + C / C++ C / C + + , 为了提高计算效率, 我们可以采用下面的IKJ型LU分解算法.
算法2.4.LU分解(IKJ型) 1: for i = 2 i = 2 i = 2 to n n n do 2: for k = 1 k = 1 k = 1 to i − 1 i - 1 i − 1 do 3: a i k = a i k / a k k a_{ik} = a_{ik} / a_{kk} a ik = a ik / a kk 4: for j = k + 1 j = k + 1 j = k + 1 to n n n do 5: a i j = a i j − a i k a k j a_{ij} = a_{ij} - a_{ik}a_{kj} a 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消去法 假定矩阵 A A A 存在LU分解 A = L U A = LU A = LU ,则方程组 A x = b Ax = b A x = b 就转化为求解下面两个三角方程组
L y = b , U x = y . L y = b, \quad U x = y. L y = b , Ux = y . 这两个方程组都非常容易求解, 于是 Gauss 消去法描述如下:
算法2.5.Gauss消去法 1: 将 A A A 进行 LU 分解: A = L U A = LU A = LU , 其中 L L L 为单位下三角矩阵, U U U 为非奇异上三角矩阵; 2: 利用向前回代, 求解 L y = b Ly = b L y = b , 即得 y = L − 1 b y = L^{-1}b y = L − 1 b ; 3. 利用向后回代, 求解 U x = y Ux = y Ux = y , 即得 x = U − 1 y = ( L U ) − 1 b = A − 1 b x = U^{-1}y = (LU)^{-1}b = A^{-1}b x = U − 1 y = ( LU ) − 1 b = A − 1 b
得到 A A A 的LU分解后, 我们最后需要用回代法求解两个三角方程组, 计算过程描述如下.
算法2.6.回代求解 L y = b Ly = b L y = b 和 U x = y Ux = y Ux = y
1: y 1 = b 1 / l 11 y_{1} = b_{1} / l_{11} y 1 = b 1 / l 11 % 向前回代求解 L y = b Ly = b L y = b 2: for i = 2 : n i = 2:n i = 2 : n do 3: for j = 1 : i − 1 j = 1 : i - 1 j = 1 : i − 1 do 4: b i = b i − l i j y j b_{i} = b_{i} - l_{ij}y_{j} b i = b i − l ij y j 5: end for 6: y i = b i / l i i y_{i} = b_{i} / l_{ii} y i = b i / l ii 7: end for 8: x n = y n / u n n x_{n} = y_{n} / u_{nn} x n = y n / u nn % \% % 向后回代求解 U x = y U x = y Ux = y 9: for i = n − 1 : − 1 : 1 i = n - 1 : -1 : 1 i = n − 1 : − 1 : 1 do 10: for j = n : − 1 : i + 1 j = n: -1: i + 1 j = n : − 1 : i + 1 do 11: y i = y i − u i j x j y_{i} = y_{i} - u_{ij}x_{j} y i = y i − u ij x j 12: end for 13: x i = y i / u i i x_{i} = y_{i} / u_{ii} x i = y i / u ii 14: end for
如果数据是按列存储的, 则采用列存储方式效率会高一些. 下面是以 U x = y Ux = y Ux = y 为例, 描述按列存储时的回代求解过程.
算法2.7. 向后回代求解 U x = y Ux = y Ux = y (列存储方式)
1: for k = n : − 1 : 1 k = n : -1 : 1 k = n : − 1 : 1 do 2: x k = y k / u k k x_{k} = y_{k} / u_{kk} x k = y k / u kk 3: for i = k − 1 : − 1 : 1 i = k - 1: -1:1 i = k − 1 : − 1 : 1 do 4: y i = y i − x k u i k y_{i} = y_{i} - x_{k}u_{ik} y i = y i − x k u ik 5: end for 6: end for
计算复杂度 这两个算法的运算量: 乘法和加法均 n ( n − 1 ) n(n - 1) n ( n − 1 ) 次, 除法 2 n 2n 2 n 次. 加上 LU 分解的运算量, Gauss 消去法的总运算量为 2 3 n 3 + O ( n 2 ) \frac{2}{3} n^3 + \mathcal{O}(n^2) 3 2 n 3 + O ( n 2 ) .
可以证明, 以上两个算法都是向后稳定的 (componentwise backward stable) [70].
2.1.4 选主元LU分解 在 LU 分解过程中, 我们称 a k k ( k − 1 ) a_{kk}^{(k-1)} a kk ( k − 1 ) 为主元. 如果 a k k ( k − 1 ) = 0 a_{kk}^{(k-1)} = 0 a kk ( k − 1 ) = 0 , 则算法就无法进行下去. 即使 a k k ( k − 1 ) a_{kk}^{(k-1)} a kk ( k − 1 ) 不为零, 但如果 ∣ a k k ( k − 1 ) ∣ |a_{kk}^{(k-1)}| ∣ a kk ( k − 1 ) ∣ 的值很小, 由于舍入误差的原因, 也可能会给计算结果带来很大的误差. 此时我们就需要通过选主元来解决这个问题.
例2.1 用LU分解求解线性方程组 A x = b Ax = b A x = b ,其中 A = [ 0.02 61.3 3.43 − 8.5 ] , b = [ 61.5 25.8 ] A = \begin{bmatrix} 0.02 & 61.3 \\ 3.43 & -8.5 \end{bmatrix}, b = \begin{bmatrix} 61.5 \\ 25.8 \end{bmatrix} A = [ 0.02 3.43 61.3 − 8.5 ] , b = [ 61.5 25.8 ] ,要求在运算过程中保留3位有效数字. (板书)
解.根据LU分解待定系数法,设
A = L U = [ 1 0 l 21 1 ] [ u 11 u 12 0 u 22 ] . 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]. A = LU = [ 1 l 21 0 1 ] [ u 11 0 u 12 u 22 ] . 直接比较等式两边可得
u 11 = a 11 = 0.02 , u 12 = a 12 = 61.3 , l 21 = a 21 / u 11 = 3.43 / 0.02 ≈ 172 , u 22 = a 22 − l 21 u 12 ≈ − 8.5 − 1.05 × 10 4 ≈ − 1.05 × 10 4 , \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} u 11 = a 11 = 0.02 , u 12 = a 12 = 61.3 , l 21 = a 21 / u 11 = 3.43/0.02 ≈ 172 , u 22 = a 22 − l 21 u 12 ≈ − 8.5 − 1.05 × 1 0 4 ≈ − 1.05 × 1 0 4 , 解方程组 L y = b Ly = b L y = b 可得
y 1 = 61.5 , y 2 = b 2 − l 21 y 1 ≈ − 1.06 × 10 4 . y _ {1} = 6 1. 5, \quad y _ {2} = b _ {2} - l _ {2 1} y _ {1} \approx - 1. 0 6 \times 1 0 ^ {4}. y 1 = 61.5 , y 2 = b 2 − l 21 y 1 ≈ − 1.06 × 1 0 4 . 解方程组 U x = y Ux = y Ux = y 可得
x 2 = y 2 / u 22 ≈ 1.01 , x 1 = ( y 1 − u 12 x 2 ) / u 11 ≈ − 0.413 / u 11 ≈ − 20.7 x _ {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 x 2 = y 2 / u 22 ≈ 1.01 , x 1 = ( y 1 − u 12 x 2 ) / u 11 ≈ − 0.413/ u 11 ≈ − 20.7 □
事实上, 精确解为 x 1 = 10.0 x_{1} = 10.0 x 1 = 10.0 和 x 2 = 1.00 x_{2} = 1.00 x 2 = 1.00 . 我们发现 x 1 x_{1} x 1 的数值解误差非常大. 出现这个问题的原因就是 ∣ a 11 ∣ \left|a_{11}\right| ∣ a 11 ∣ 太小, 用它做主元时会放大舍入误差.
选主元是通过利用置换矩阵(也称排列矩阵)对行进行交换来实现的. 首先介绍置换矩阵的一些基本性质.
引理2.4设 P ∈ R n × n P\in \mathbb{R}^{n\times n} P ∈ R n × n 为置换矩阵, A ∈ R n × n A\in \mathbb{R}^{n\times n} A ∈ R n × n 为任意矩阵,则
(1) P A PA P A 相当于将 A A A 的行进行置换; A P AP A P 相当于将 A A A 的列进行置换; (2) P − 1 = P T P^{-1} = P^{\mathsf{T}} P − 1 = P T ,即 P P P 是正交矩阵; (3) det ( P ) = ± 1 \operatorname{det}(P) = \pm 1 det ( P ) = ± 1 ; (4) 置换矩阵的乘积仍然是置换矩阵.
定理2.5 (选主元LU分解的存在性) 设 A ∈ R n × n A \in \mathbb{R}^{n \times n} A ∈ R n × n 非奇异, 则存在置换矩阵 P L , P R P_L, P_R P L , P R , 以及单位下三角矩阵 L L L 和非奇异上三角矩阵 U U U , 使得
P L A P R = L U . P _ {L} A P _ {R} = L U. P L A P R = LU . (板书)
证明. 用归纳法
当 n = 1 n = 1 n = 1 时, 取 P L = P R = L = 1 , U = A P_L = P_R = L = 1, U = A P L = P R = L = 1 , U = A 即可.
假设结论对所有 n − 1 n - 1 n − 1 阶矩阵都成立
考虑 n n n 阶非奇异矩阵 A ∈ R n × n A \in \mathbb{R}^{n \times n} A ∈ R n × n , 易知 A A A 至少存在一个非零元, 取置换矩阵 P 1 P_{1} P 1 和 P 2 P_{2} P 2 使得
P 1 A P 2 = [ a 11 A 12 A 21 A 22 ] , 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], P 1 A P 2 = [ a 11 A 21 A 12 A 22 ] , 其中 a 11 ≠ 0 , A 22 ∈ R ( n − 1 ) × ( n − 1 ) a_{11} \neq 0, A_{22} \in \mathbb{R}^{(n-1) \times (n-1)} a 11 = 0 , A 22 ∈ R ( n − 1 ) × ( n − 1 ) . 令
u 11 = a 11 , U 12 = A 12 , L 21 = A 21 / a 11 , U 22 = A 22 − L 21 U 12 . 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}. u 11 = a 11 , U 12 = A 12 , L 21 = A 21 / a 11 , U 22 = A 22 − L 21 U 12 . 则 u 11 ≠ 0 u_{11} \neq 0 u 11 = 0 ,且有
[ 1 0 L 21 I ] [ u 11 U 12 0 U 22 ] = [ a 11 A 12 A 21 A 22 ] = P 1 A P 2 . \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}. [ 1 L 21 0 I ] [ u 11 0 U 12 U 22 ] = [ a 11 A 21 A 12 A 22 ] = P 1 A P 2 . 两边取行列式可得
0 ≠ det ( P 1 A P 2 ) = det ( [ 1 0 L 21 I ] ) ⋅ det ( [ u 11 U 12 0 U 22 ] ) = a 11 ⋅ det ( U 22 ) . 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}). 0 = det ( P 1 A P 2 ) = det ( [ 1 L 21 0 I ] ) ⋅ det ( [ u 11 0 U 12 U 22 ] ) = a 11 ⋅ det ( U 22 ) . 所以 det ( U 22 ) ≠ 0 \operatorname{det}(U_{22}) \neq 0 det ( U 22 ) = 0 ,即 U 22 ∈ R ( n − 1 ) × ( n − 1 ) U_{22} \in \mathbb{R}^{(n-1) \times (n-1)} U 22 ∈ R ( n − 1 ) × ( n − 1 ) 非奇异. 由归纳假设可知, 存在置换矩阵 P ~ L ∈ R ( n − 1 ) × ( n − 1 ) \tilde{P}_L \in \mathbb{R}^{(n-1) \times (n-1)} P ~ L ∈ R ( n − 1 ) × ( n − 1 ) 和 P ~ R ∈ R ( n − 1 ) × ( n − 1 ) \tilde{P}_R \in \mathbb{R}^{(n-1) \times (n-1)} P ~ R ∈ R ( n − 1 ) × ( n − 1 ) , 使得
P ~ L U 22 P ~ R = L ~ 22 U ~ 22 , \tilde {P} _ {L} U _ {2 2} \tilde {P} _ {R} = \tilde {L} _ {2 2} \tilde {U} _ {2 2}, P ~ L U 22 P ~ R = L ~ 22 U ~ 22 , 其中 L ~ 22 \tilde{L}_{22} L ~ 22 为单位下三角矩阵, U ~ 22 \tilde{U}_{22} U ~ 22 为非奇异上三角矩阵. 令
P L = [ 1 0 0 P ~ L ] P 1 , P R = P 2 [ 1 0 0 P ~ 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], P L = [ 1 0 0 P ~ L ] P 1 , P R = P 2 [ 1 0 0 P ~ R ] , 则有
P L A P R = [ 1 0 0 P ~ L ] P 1 A P 2 [ 1 0 0 P ~ R ] = [ 1 0 0 P ~ L ] [ 1 0 L 21 I ] [ u 11 U 12 0 U 22 ] [ 1 0 0 P ~ R ] = [ 1 0 P ~ L L 21 P ~ L ] [ u 11 U 12 0 P ~ L T L ~ 22 U ~ 22 P ~ R T ] [ 1 0 0 P ~ R ] = [ 1 0 P ~ L L 21 P ~ L ] [ 1 0 0 P ~ 1 T L ~ 22 ] [ u 11 U 12 0 U ~ 22 P ~ R T ] [ 1 0 0 P ~ R ] = [ 1 0 P ~ L L 21 L ~ 22 ] [ u 11 U 12 P ~ R 0 U ~ 22 ] ≜ L U , \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} P L A P R = [ 1 0 0 P ~ L ] P 1 A P 2 [ 1 0 0 P ~ R ] = [ 1 0 0 P ~ L ] [ 1 L 21 0 I ] [ u 11 0 U 12 U 22 ] [ 1 0 0 P ~ R ] = [ 1 P ~ L L 21 0 P ~ L ] [ u 11 0 U 12 P ~ L T L ~ 22 U ~ 22 P ~ R T ] [ 1 0 0 P ~ R ] = [ 1 P ~ L L 21 0 P ~ L ] [ 1 0 0 P ~ 1 T L ~ 22 ] [ u 11 0 U 12 U ~ 22 P ~ R T ] [ 1 0 0 P ~ R ] = [ 1 P ~ L L 21 0 L ~ 22 ] [ u 11 0 U 12 P ~ R U ~ 22 ] ≜ LU , 其中 L L L 为单位下三角矩阵, U U U 为非奇异上三角矩阵, 即 A A A 存在 LU 分解.
因此, 由数学归纳法可知, 结论成立.
定理2.5也可以利用定理2.1的结论来证明,见习题2.3 事实上, 定理2.5中的 P L P_L P L 和 P R P_R P R 只有一个是必需的
置换矩阵的选取 问题: 第 k k k 步时, 如何选取置换矩阵 P L ( k ) P_L^{(k)} P L ( k ) 和 P R ( k ) P_R^{(k)} P R ( k ) ?
选法一.选取 P L ( k ) P_L^{(k)} P L ( k ) 和 P R ( k ) P_R^{(k)} P R ( k ) 使得主元为剩下的矩阵中绝对值最大,这种选取方法称为“全主元Gauss消去法”,简称GECP(Gaussianeliminationwithcomplete pivoting);
选法二.选取 P L ( k ) P_L^{(k)} P L ( k ) 和 P R ( k ) P_R^{(k)} P R ( k ) 使得主元为第 k k k 列中第 k k k 到第 n n n 个元素中,绝对值最大,这种选取方法称为“部分选主元Gauss消去法”,简称GEPP(Gaussianeliminationwithpartial pivoting),此时 P R ( k ) = I P_R^{(k)} = I P R ( k ) = I ,因此也称为列主元Gauss消去法.
(1) GECP 比 GEPP 更稳定, 但工作量太大, 在实际应用中通常使用 GEPP 算法. (2) GEPP 算法能保证 L L L 所有的元素的绝对值都不超过 1.
算法2.8.部分选主元LU分解 1: p = 1 : n p = 1:n p = 1 : n % \% % 用于记录置换矩阵 2: for k = 1 k = 1 k = 1 to n − 1 n - 1 n − 1 do
3: [ a max , l ] = max k < i < n ∣ a i k ∣ % [a_{\max}, l] = \max_{k < i < n} |a_{ik}| \quad \% [ a m a x , l ] = max k < i < n ∣ a ik ∣ % 选列主元, 其中 l l l 表示主元所在的行 4: if l ≠ k l \neq k l = k then
5: for j = 1 j = 1 j = 1 to n n n do 6: a t m p = a k j , a k j = a l j , a l j = a t m p % a_{tmp} = a_{kj}, a_{kj} = a_{lj}, a_{lj} = a_{tmp} \quad \% a t m p = a kj , a kj = a l j , a l j = a t m p % 交换 A A A 的第 k k k 行与第 l l l 行
7: end for
8: p t m p = p ( k ) , p ( k ) = p ( l ) , p ( l ) = p t m p % p_{tmp} = p(k), p(k) = p(l), p(l) = p_{tmp} \quad \% p t m p = p ( k ) , p ( k ) = p ( l ) , p ( l ) = p t m p % 更新置换矩阵 9: end if
10: for i = k + 1 i = k + 1 i = k + 1 to n n n do 11: a i k = a i k / a k k a_{ik} = a_{ik} / a_{kk} a ik = a ik / a kk 12: for j = k + 1 j = k + 1 j = k + 1 to n n n do 13: a i j = a i j − a i k a k j a_{ij} = a_{ij} - a_{ik}a_{kj} a ij = a ij − a ik a kj 14: end for 15: end for 16: end for
相应的MATLAB程序见LE_PLU.m.
例2.2 用部分选主元LU分解求解线性方程组 A x = b Ax = b A x = b ,其中 A = [ 0.02 61.3 3.43 − 8.5 ] A = \begin{bmatrix} 0.02 & 61.3 \\ 3.43 & -8.5 \end{bmatrix} A = [ 0.02 3.43 61.3 − 8.5 ] , b = [ 61.5 25.8 ] b = \begin{bmatrix} 61.5 \\ 25.8 \end{bmatrix} b = [ 61.5 25.8 ] ,要
求在运算过程中保留3位有效数字
(板书)
解.由于 ∣ a 21 ∣ > ∣ a 11 ∣ |a_{21}| > |a_{11}| ∣ a 21 ∣ > ∣ a 11 ∣ ,根据部分选主元LU分解算法,我们需要将第一行与第二行交换,即取 P = [ 0 1 1 0 ] , P = \left[ \begin{array}{ll}0 & 1\\ 1 & 0 \end{array} \right], P = [ 0 1 1 0 ] , 然后计算 A ~ = P A = [ 3.43 − 8.5 0.02 61.3 ] \tilde{A} = PA = \left[ \begin{array}{ll}3.43 & -8.5\\ 0.02 & 61.3 \end{array} \right] A ~ = P A = [ 3.43 0.02 − 8.5 61.3 ] 的LU分解,即设
A ~ = L U = [ 1 0 l 21 1 ] [ u 11 u 12 0 u 22 ] . \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]. A ~ = LU = [ 1 l 21 0 1 ] [ u 11 0 u 12 u 22 ] . 直接比较等式两边可得
u 11 = a ~ 11 = 3.43 , u 12 = a ~ 12 = − 8.5 , l 21 = a ~ 21 / u 11 ≈ 5.83 × 10 − 3 , u 22 = a ~ 22 − l 21 u 12 ≈ 61.3 + 0.0496 ≈ 61.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} u 11 = a ~ 11 = 3.43 , u 12 = a ~ 12 = − 8.5 , l 21 = a ~ 21 / u 11 ≈ 5.83 × 1 0 − 3 , u 22 = a ~ 22 − l 21 u 12 ≈ 61.3 + 0.0496 ≈ 61.3 , 即
P A ≈ [ 1.00 0 5.83 × 10 − 3 1.00 ] [ 3.43 − 8.50 0 61.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]. P A ≈ [ 1.00 5.83 × 1 0 − 3 0 1.00 ] [ 3.43 0 − 8.50 61.3 ] . 解方程组 L y = P b Ly = Pb L y = P b 可得
y 1 = 25.8 , y 2 ≈ 61.2. y _ {1} = 2 5. 8, \quad y _ {2} \approx 6 1. 2. y 1 = 25.8 , y 2 ≈ 61.2. 解方程组 U x = y Ux = y Ux = y 可得
x 2 = y 2 / u 22 ≈ 0.998 , x 1 = ( y 1 − u 12 x 2 ) / u 11 ≈ 10.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. x 2 = y 2 / u 22 ≈ 0.998 , x 1 = ( y 1 − u 12 x 2 ) / u 11 ≈ 10.0. 与精确解 x 1 = 10 , x 2 = 1 x_{1} = 10, x_{2} = 1 x 1 = 10 , x 2 = 1 相比,数值解具有3位有效数字
2.1.5 矩阵求逆 我们可以通过部分选主元 LU 分解来计算矩阵的逆. 设 P A = L U PA = LU P A = LU , 则
A − 1 = U − 1 L − 1 P , A ^ {- 1} = U ^ {- 1} L ^ {- 1} P, A − 1 = U − 1 L − 1 P , 等价于求解下面 2 n 2n 2 n 个三角线性方程组
L y i = P e i , U x i = y i , i = 1 , 2 , … , n . L y _ {i} = P e _ {i}, \quad U x _ {i} = y _ {i}, \quad i = 1, 2, \dots , n. L y i = P e i , U x i = y i , i = 1 , 2 , … , n .
思考:也可以分别计算 L − 1 L^{-1} L − 1 和 U − 1 U^{-1} U − 1 ,然后相乘.哪种方法划算?
2.1.6 分块LU分解 为了提高计算效率, 实际计算中通常采用分块 LU 分解, 即
A = [ A 11 A 12 … A 1 p A 21 A 22 … A 2 p ⋮ ⋱ ⋮ A p 1 A p 2 … A p p ] = [ I 1 L 21 I 2 ⋮ ⋱ ⋱ L p 1 … L p , p − 1 I p ] [ U 11 U 12 … U 1 p U 22 … U 2 p ⋱ ⋮ U p p ] = L U , \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}, A = A 11 A 21 ⋮ A p 1 A 12 A 22 A p 2 … … ⋱ … A 1 p A 2 p ⋮ A pp = I 1 L 21 ⋮ L p 1 I 2 ⋱ … ⋱ L p , p − 1 I p U 11 U 12 U 22 … … ⋱ U 1 p U 2 p ⋮ U pp = LU , 其中 A i i A_{ii} A ii 是非奇异的方阵
与定理2.1相类似, 对于分块LU分解, 我们有下面的结论
定理2.6(分块LU分解的存在性和唯一性)矩阵 A \mathbf{A} A 存在唯一分块LU分解的充要条件是 A \mathbf{A} A 的所有顺序分块主子矩阵都非奇异. (留作练习)
几点注记 分块LU分解不是LU分解,若 A A A 存在LU分解,则一定存在分块LU分解,反之不成立. 分块 LU 分解与普通 LU 分解的总运算量是一样的, 但分块 LU 分解可以借助 3 级 BLAS 运算, 因此效率更高. 在计算分块 LU 分解过程中需要求解一系列小规模的线性方程组 (以 A i i A_{ii} A ii 为系数矩阵), 可以采用普通 (选主元) LU 分解方法求解.