1.问题引出
求解类线性问题是求解许多问题的基础。然而,采用传统的“高斯消元(Gaussian elimination)”法时间复杂度为,在A足够大(或者说是方程组足够大)时开销很大,那么有没有一种方法能够降低计算的复杂度,减小计算开销呢?为了解决这个问题,LU分解算法应运而生。
2.总体思想
将矩阵A变为下三角矩阵L与上三角矩阵U,这样原始问题就转化为了
此时,我们令,原式就又变为了
因为L与U都为三角矩阵,所以时间复杂度为,由反推的时间复杂度也为。至此,我们已经成功地把时间复杂度降了下来。需要注意的是,将A矩阵分解为L与U两个三角矩阵的过程时间复杂度为,但这属于是一劳永逸的,算一遍就完事了。
3.具体分解过程
本部分举例引用自书”Data-Driven Modeling & Scientifific Computation“ 让我们拿一个的矩阵为例
由基本的线代知识可知,一个矩阵与单位矩阵相乘还等于其本身,因此
第一列
此时,我们已经成功地将A矩阵分解为了一个下三角矩阵L与一个上三角矩阵U。
4.排列矩阵P
在高斯消元的过程中,我们经常会碰到消到零主元(zero pivot)的情况,此时无法求解。为了解决此类问题,我们引入了排列矩阵(The permutation matrix)P。排列矩阵P的作用是将A矩阵的行位置互换从而避免零主元情况的发生。
P矩阵长这个样子
我们想将A矩阵的哪几行互换,就可以对单位矩阵I施行相同操作。这样,I矩阵就成功的变为了P矩阵啦。在我们之前所讨论的问题中,为了避免出现零主元的情况,我们将其升级为,再将进行LU分解,最后变为,之后的步骤就和3中所述相同啦。
5.Matlab实现
Matlab已经贴心地为我们准备了相应的函数接下来拿4中的矩阵来进行实验
clear all;close all;clc
A=[4 3 -1;-2 -4 5;1 2 6];
b=[1;2;3];
[L,U,P]=lu(A)
y=L\(P*b)
x1=A\b
x2=U\y
可以看出,我们输出的是高斯消元解出的结果,输出是LU分解后得出的结果,两个结果进行比照。中间我们也输出了L、U、P、y等矩阵以供读者对照理解。输出结果如下。
L =
1.0000 0 0
-0.5000 1.0000 0
0.2500 -0.5000 1.0000
U =
4.0000 3.0000 -1.0000
0 -2.5000 4.5000
0 0 8.5000
P =
1 0 0
0 1 0
0 0 1
y =
1.0000
2.5000
4.0000
x1 =
0.4824
-0.1529
0.4706
x2 =
0.4824
-0.1529
0.4706
6.小结
LU算法能够大幅降低时间复杂度,以至于”Data-Driven Modeling & Scientifific Computation“中甚至直接说''you should always use LU decomposition if possible''。除此以外,我们也有其它算法来解决此类问题,下一篇我们将来一起学习迭代算法(Iterative Solution Methods)在处理线性系统问题时的操作。
下面的话题与内容无关了。作为一名在校学生,这是我第一次尝试以写博客的方式来学习知识,在写的过程中发现自己也对一些内容增加了思考,加深了理解。也希望这是记录我学习生活的起点,希望以后能继续和大家一起分享探讨知识。