LU分解是矩阵因式分解的一种,也叫Doolittle分解。旨在将 A x = b Ax = b Ax=b中的矩阵 A A A表示为两个或多个矩阵的乘积。LU分解是将矩阵 A A A分解为一个下三角矩阵(Lower Triangular) L L L和一个上三角矩阵(Upper Triangular) U U U。形象一点可写为
A = ◣ × ◥ A = ◣ \times ◥ A=◣×◥
高斯分解法的乘法计算量为
分解过程的计算量: ∑ k = 1 n − 1 ( n − k ) ( n − k + 2 ) = n 3 3 + n 2 2 − 5 6 n 求解过程的计算量: ∑ k = 1 n − 1 ( n − k + 1 ) ( n − k + 2 ) = n 2 + n 2 \begin{split} 分解过程的计算量:&\sum_{k=1}^{n-1}(n-k)(n-k+2) \\ &= \frac {n^3}3 + \frac {n^2}{2} - \frac 56n\\ 求解过程的计算量:&\sum_{k=1}^{n-1}(n-k+1)(n-k+2) \\ &= \frac{n^2+n}{2} \end{split} 分解过程的计算量:求解过程的计算量:k=1∑n−1(n−k)(n−k+2)=3n3+2n2−65nk=1∑n−1(n−k+1)(n−k+2)=2n2+n
LU分解法的乘法计算量为
分解过程 A = L U 的计算量: 2 n 3 3 计算过程 L y = b 的计算量级: n 2 2 计算过程 U x = y 的计算量级: n 2 2 分解过程A = LU的计算量:\frac {2n^3}{3} \\ 计算过程Ly = b的计算量级: \frac{n^2}{2} \\ 计算过程Ux = y的计算量级: \frac{n^2}{2} \\ 分解过程A=LU的计算量:32n3计算过程Ly=b的计算量级:2n2计算过程Ux=y的计算量级:2n2
高斯消元法与LU分解的分解过程计算量都是 O ( n 3 ) O(n^3) O(n3)量级,求解过程是 O ( n 2 ) O(n^2) O(n2)量级。但是LU的分解过程可以离线处理好,在线使用时可以直接进入求解过程,这是LU分解相对高斯分解法的优点。
LU主要用来加快求解方程组的速度,常用于二次型矩阵求解。LU分解是接近中小规模、稠密矩阵的最好方法。假设 A = L U A = LU A=LU后,原方程 A x = b Ax=b Ax=b可写为 L U x = b LUx =b LUx=b,此时令 U x = y Ux=y Ux=y,即可通过一对方程来求解 x x x,写作
{ L y = b U x = y \begin{cases} Ly = b \\ Ux = y \end{cases}\\ {Ly=bUx=y
求解过程可转换为
L U x = b ⇒ x = ( L U ) − 1 b = U − 1 L − 1 b LUx = b \\ \begin{split} \\ \Rightarrow x &=(LU)^{-1}b \\ &= U^{-1}L^{-1}b \end{split} LUx=b⇒x=(LU)−1b=U−1L−1b
实际应用中,矩阵 A A A往往是固定的,而右侧向量 b b b经常会替换。当矩阵 A A A被分解后, L L L, U U U可充分利用,提高效率。
以下以 A A A矩阵为例开展相关的LU分解
A = [ 1 5 − 3 − 2 − 7 3 4 9 6 ] A = \begin{bmatrix} 1 & 5 & -3 \\ -2 & -7 & 3 \\ 4 & 9 & 6 \end{bmatrix} A= 1−245−79−336
基本假设:
消元顺序
通常手动消元的时候,消元顺序不是固定的,但是在LU分解时,消元顺序是固定的,即以第一行为主元,依次向下消元,最终消元为一个上三角矩阵。如果是4*4的矩阵,消元顺序为 r 2 r 1 → r 3 r 1 → r 4 r 1 → r 3 r 2 → r 4 r 2 → r 4 r 3 r_2r_1 \rightarrow r_3r_1 \rightarrow r_4r_1 \rightarrow r_3r_2 \rightarrow r_4r_2 \rightarrow r_4r_3 r2r1→r3r1→r4r1→r3r2→r4r2→r4r3,共消元6次;如果是n*n矩阵,则总共需要 1 + 2 + 3 + ⋅ + ( n − 1 ) = n ( n − 1 ) 2 1 + 2 +3 +\cdot + (n-1) = \displaystyle\frac{n(n-1)}{2} 1+2+3+⋅+(n−1)=2n(n−1)次消元。参考实例如下
A = [ 1 5 − 3 − 2 − 7 3 4 9 6 ] → r 2 + 2 r 1 E 21 [ 1 5 3 0 3 − 3 4 9 6 ] → r 3 − 4 r 1 E 31 [ 1 5 3 0 3 − 3 0 − 11 18 ] → r 3 + 11 3 r 2 E 32 [ 1 5 3 0 3 − 3 0 0 7 ] = U A = \begin{bmatrix} 1 & 5 & -3 \\ -2 & -7 & 3 \\ 4 & 9 & 6 \end{bmatrix}\xrightarrow[r_2+2r_1]{E_{21}} \begin{bmatrix} 1 & 5 &3 \\0 & 3 &-3 \\4 & 9 & 6 \end{bmatrix} \xrightarrow[r_3-4r_1]{E_{31}} \begin{bmatrix} 1 & 5 &3 \\0 & 3 &-3 \\0 & -11 & 18 \end{bmatrix} \xrightarrow[r_3+\frac{11}{3}r_2]{E_{32}} \begin{bmatrix} 1 & 5 &3 \\0 & 3 &-3 \\0 & 0 & 7 \end{bmatrix} =U A= 1−245−79−336 E21r2+2r1 1045393−36 E31r3−4r1 10053−113−318 E32r3+311r2 1005303−37 =U
上式中的消元变换过程为
E 32 E 31 E 21 A = U E_{32}E_{31}E_{21}A = U E32E31E21A=U
其中的变换矩阵写作矩阵形式,有
E 21 = [ 1 0 0 2 1 0 0 0 1 ] E 31 = [ 1 0 0 0 1 0 − 4 0 1 ] E 32 = [ 1 0 0 0 1 0 0 11 3 1 ] E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \hspace{1cm} E_{31} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -4 & 0 & 1 \end{bmatrix} \hspace{1cm} E_{32} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & \frac{11}{3} & 1 \end{bmatrix} E21= 120010001 E31= 10−4010001 E32= 10001311001
因此,因式矩阵 A A A可写作
A = ( E 32 E 31 E 21 ) − 1 U = L U \begin{split} A &= (E_{32}E_{31}E_{21})^{-1}U \\ &=LU \end{split} A=(E32E31E21)−1U=LU
式中有
E 32 E 31 E 21 = [ 1 0 0 2 1 0 10 3 11 3 1 ] L = ( E 32 E 31 E 21 ) − 1 = [ 1 0 0 − 2 1 0 4 − 11 3 1 ] \begin{split} E_{32}E_{31}E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ \frac {10}{3} & \frac{11}{3} & 1 \end{bmatrix} \\ L = (E_{32}E_{31}E_{21})^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ -2 & 1 & 0 \\ 4 & -\frac{11}{3} & 1 \end{bmatrix} \\ \end{split} E32E31E21= 1231001311001 L=(E32E31E21)−1= 1−2401−311001
原变换矩阵 E 32 E 31 E 21 E_{32}E_{31}E_{21} E32E31E21,会在矩阵(3,1)中引入一个无实际意义的 10 3 \frac{10}{3} 310,而改写的 L L L矩阵,其中的(2,1)(3,1)(3,2)位置对应的则刚好均是初等变换矩阵 E 21 E_{21} E21、 E 31 E_{31} E31、 E 32 E_{32} E32中实际变换位置处元素的相反数,这就是LU分解的优点:只保留了消元过程中最关键的消元信息,同时其上/下三角矩阵形式减少了大量计算量。
f = x 1 2 + 2 x 2 2 + 6 x 3 2 + 2 x 1 x 2 − 2 x 1 x 3 + 2 x 2 x 3 = ( x 1 + x 2 − x 3 ) 2 + ( x 2 + 2 x 3 ) 2 + x 3 2 \begin{split} f &= x_1^2 + 2x_2^2 + 6x_3^2 + 2x_1x_2- 2x_1x_3 + 2x_2x_3 \\ &= (x_1 + x_2 - x_3)^2 + (x_2 + 2x_3)^2 + x_3^2 \end{split} f=x12+2x22+6x32+2x1x2−2x1x3+2x2x3=(x1+x2−x3)2+(x2+2x3)2+x32
上式中二次型所对应的矩阵 A A A为
A = [ 1 1 − 1 1 2 1 − 1 1 6 ] A = \begin{bmatrix} 1 & 1 & -1 \\ 1 & 2 & 1 \\ -1 & 1 & 6 \end{bmatrix} A= 11−1121−116
对其进行LU分解,过程可写作
A = [ 1 1 − 1 1 2 1 − 1 1 6 ] → [ 1 0 0 − 1 1 0 0 0 1 ] E 21 [ 1 1 − 1 0 1 2 − 1 1 6 ] → [ 1 0 0 0 1 0 1 0 1 ] E 31 [ 1 1 − 1 0 1 2 0 2 5 ] → [ 1 0 0 0 1 0 0 − 2 1 ] E 32 [ 1 1 − 1 0 1 2 0 0 1 ] = U A = \begin{bmatrix} 1 & 1 & -1 \\ 1 & 2 & 1 \\ -1 & 1 & 6 \end{bmatrix}\xrightarrow[\begin{bmatrix} 1 & 0 & 0 \\ -1 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}]{E_{21}} \begin{bmatrix} 1 & 1 &-1 \\0 & 1 & 2 \\-1 & 1 & 6 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}]{E_{31}} \begin{bmatrix} 1 & 1 & -1 \\0 & 1 & 2 \\0 & 2 & 5 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -2 & 1 \end{bmatrix}]{E_{32}} \begin{bmatrix} 1 & 1 & -1 \\0 & 1 &2 \\0 & 0 & 1 \end{bmatrix} =U A= 11−1121−116 E21[1−10010001] 10−1111−126 E31[101010001] 100112−125 E32[10001−2001] 100110−121 =U
其变换矩阵为
L = ( E 32 E 31 E 21 ) − 1 = [ 1 0 0 1 1 0 − 1 2 1 ] \begin{split} L = (E_{32}E_{31}E_{21})^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ -1 & 2 & 1 \end{bmatrix} \\ \end{split} L=(E32E31E21)−1= 11−1012001
L L L和 U U U矩阵一个为上三角矩阵,另一个为下三角矩阵。 L L L矩阵中同样是对应位置为初等变换矩阵系数的相反数,例如 E 21 E_{21} E21的(2,1)位置的值为 L L L矩阵对应位置的相反数, E 31 E_{31} E31与 E 32 E_{32} E32同理。此外还有
A = L U = [ 1 0 0 1 1 0 − 1 2 1 ] [ 1 1 − 1 0 1 2 0 0 1 ] f = ( x 1 + x 2 − x 3 ) 2 + ( x 2 + 2 x 3 ) 2 + x 3 2 A = LU = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ -1 & 2 & 1 \end{bmatrix} \begin{bmatrix} 1 & 1 & -1 \\0 & 1 &2 \\0 & 0 & 1 \end{bmatrix} \\ f = (x_1 + x_2 - x_3)^2 + (x_2 + 2x_3)^2 + x_3^2 A=LU= 11−1012001 100110−121 f=(x1+x2−x3)2+(x2+2x3)2+x32
注意 L L L的列以及 U U U的对角线
L L L每一列对应配方后每一个平方项中各个未知数的系数,而 U U U每个对角线上的值对应配方后每个平方项的系数,写作
f = 1 × [ 1 ∗ x 1 + 1 ∗ x 2 + ( − 1 ) ∗ x 3 ] 2 + 1 × ( 1 ∗ x 2 + 2 ∗ x 3 ) 2 + 1 × ( 1 ∗ x 3 ) 2 = ( x 1 + x 2 − x 3 ) 2 + ( x 2 + 2 x 3 ) 2 + x 3 2 \begin{split} f &= 1\times[1*x_1 + 1*x_2 + (-1)* x_3]^2 + 1\times(1 * x_2 + 2 * x_3)^2 + 1\times(1*x_3)^2 \\ &=(x_1 + x_2 - x_3)^2 + (x_2 + 2x_3)^2 + x_3^2 \end{split} f=1×[1∗x1+1∗x2+(−1)∗x3]2+1×(1∗x2+2∗x3)2+1×(1∗x3)2=(x1+x2−x3)2+(x2+2x3)2+x32
在matlab平台上对比直接求逆求解与LU分解的效率,代码如下
A = rand(10000,10000); %系数矩阵
B = rand(10000,1); %求解目标矩阵
tic
x = inv(A)*B; % 利用求逆求解
toc
[L,U] = lu(A); % LU分解
tic
x = (L*U)\B;
toc
结果如下
由上图可见,LU分解比直接求逆求解的效率快百分之十五左右。
如果有一个待LU分解的二次型方程为
f = 2 x 2 2 + 2 x 3 2 + 4 x 1 x 2 − 4 x 1 x 3 + 8 x 2 x 3 f =2x_2^2 + 2x_3^2 + 4x_1x_2- 4x_1x_3 + 8x_2x_3 \\ f=2x22+2x32+4x1x2−4x1x3+8x2x3
它的 A A A矩阵为
A = [ 0 2 − 2 2 2 4 − 2 4 2 ] A = \begin{bmatrix} 0 & 2 & -2 \\ 2 & 2 & 4 \\ -2 & 4 & 2 \end{bmatrix} A= 02−2224−242
它的主元(位于第一行第一列的元素)为0,不能直接进行LU分解。
如果出现LU分解后 U U U为非满秩这种情况
A = L U = [ 1 0 0 1 1 0 2 1 1 ] [ 1 1 2 0 − 3 − 3 0 0 0 ] A = LU = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 2 & 1 & 1 \end{bmatrix} \begin{bmatrix} 1 & 1 & 2 \\0 & -3 &-3 \\0 & 0 & 0 \end{bmatrix} \\ A=LU= 112011001 1001−302−30
概念
LU的推广形式为LDU, D D D为对角矩阵(Diagonal),形象一点可写作
A = ◣ × ⋱ × ◥ A = ◣ \times \ddots \times ◥ A=◣×⋱×◥
D D D中的元素是U中提取出的对角元素。
一个实例
A = [ 2 1 1 0 4 3 3 1 8 7 9 5 6 7 9 8 ] A = \begin{bmatrix} 2 & 1 & 1 & 0 \\ 4 & 3 & 3 & 1 \\ 8 & 7 & 9 & 5 \\ 6 & 7 & 9 & 8 \end{bmatrix} \\ A= 2486137713990158
A = [ 2 1 1 0 4 3 3 1 8 7 9 5 6 7 9 8 ] → [ 1 0 0 0 − 2 1 0 0 0 0 1 0 0 0 0 1 ] E 21 [ 2 1 1 0 0 1 1 1 8 7 9 5 6 7 9 8 ] → [ 1 0 0 0 0 1 0 0 − 4 0 1 0 0 0 0 1 ] E 31 [ 2 1 1 0 0 1 1 1 0 3 5 5 6 7 9 8 ] → [ 1 0 0 0 0 1 0 0 0 0 1 0 − 3 0 0 1 ] E 32 → E 32 [ 2 1 1 0 0 1 1 1 0 3 5 5 0 4 6 8 ] → [ 1 0 0 0 0 1 0 0 0 − 3 1 0 0 0 0 1 ] E 32 [ 2 1 1 0 0 1 1 1 0 0 2 2 0 4 6 8 ] → [ 1 0 0 0 0 1 0 0 0 0 1 0 0 − 4 0 1 ] E 42 [ 2 1 1 0 0 1 1 1 0 0 2 2 0 0 2 4 ] → [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 1 ] E 43 → E 43 [ 2 1 1 0 0 1 1 1 0 0 2 2 0 0 0 2 ] = U \begin{split} &A = \begin{bmatrix} 2 & 1 & 1 & 0 \\ 4 & 3 & 3 & 1 \\ 8 & 7 & 9 & 5 \\ 6 & 7 & 9 & 8 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ -2 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}]{E_{21}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 8 & 7 & 9 & 5 \\ 6 & 7 & 9 & 8 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ -4 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}]{E_{31}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 3 & 5 & 5 \\ 6 & 7 & 9 & 8 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -3 & 0 & 0 & 1 \end{bmatrix}]{E_{32}} \\ &\xrightarrow{E_{32}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 3 & 5 & 5 \\ 0 & 4 & 6 & 8 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & -3 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}]{E_{32}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 2 & 2 \\ 0 & 4 & 6 & 8 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & -4 & 0 & 1 \end{bmatrix}]{E_{42}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 2 & 2 \\ 0 & 0 & 2 & 4 \end{bmatrix} \xrightarrow[\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & -1 & 1 \end{bmatrix}]{E_{43}} \\ &\xrightarrow{E_{43}} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 2 & 2 \\ 0 & 0 & 0 & 2 \end{bmatrix} =U \end{split} A= 2486137713990158 E21 1−200010000100001 2086117711990158 E31 10−40010000100001 2006113711590158 E32 100−3010000100001 E32 2000113411560158 E32 100001−3000100001 2000110411260128 E42 1000010−400100001 2000110011220124 E43 10000100001−10001 E43 2000110011200122 =U
A = L U = [ 1 0 0 0 2 1 0 0 4 3 1 2 3 4 1 1 ] [ 2 1 1 0 0 1 1 1 0 0 2 2 0 0 0 2 ] A = LU = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 2 & 1 & 0 & 0 \\ 4 & 3 & 1 & 2 \\ 3 & 4 & 1 & 1 \end{bmatrix} \begin{bmatrix} 2 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 2 & 2 \\ 0 & 0 & 0 & 2 \end{bmatrix} A=LU= 1243013400110021 2000110011200122
转写为LDU分解即为
A = L D U = [ 1 0 0 0 2 1 0 0 4 3 1 2 3 4 1 1 ] [ 2 1 2 2 ] [ 1 1 2 1 2 0 0 1 1 1 0 0 1 1 0 0 0 1 ] A = LDU = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 2 & 1 & 0 & 0 \\ 4 & 3 & 1 & 2 \\ 3 & 4 & 1 & 1 \end{bmatrix} \begin{bmatrix} 2 & & & \\ & 1 & & \\ & & 2 & \\ & & & 2 \end{bmatrix} \begin{bmatrix} 1 & \frac 12 & \frac 12 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} A=LDU= 1243013400110021 2122 100021100211100111
Crout分解即是在LDU分解的基础上,把LD的乘积作为另一个矩阵,写作
A = L D U = [ 1 0 0 0 2 1 0 0 4 3 1 2 3 4 1 1 ] [ 2 1 2 2 ] [ 1 1 2 1 2 0 0 1 1 1 0 0 1 1 0 0 0 1 ] C r o u t 分解 ⇒ [ 2 0 0 0 4 1 0 0 8 3 2 4 6 4 2 2 ] [ 1 1 2 1 2 0 0 1 1 1 0 0 1 1 0 0 0 1 ] \begin{split} &A = LDU = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 2 & 1 & 0 & 0 \\ 4 & 3 & 1 & 2 \\ 3 & 4 & 1 & 1 \end{bmatrix} \begin{bmatrix} 2 & & & \\ & 1 & & \\ & & 2 & \\ & & & 2 \end{bmatrix} \begin{bmatrix} 1 & \frac 12 & \frac 12 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ &Crout分解 \Rightarrow \begin{bmatrix} 2 & 0 & 0 & 0 \\ 4 & 1 & 0 & 0 \\ 8 & 3 & 2 & 4 \\ 6 & 4 & 2 & 2 \end{bmatrix} \begin{bmatrix} 1 & \frac 12 & \frac 12 & 0 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ \end{split} A=LDU= 1243013400110021 2122 100021100211100111 Crout分解⇒ 2486013400220042 100021100211100111