线性系统求解方法——LU分解算法

1,305 阅读3分钟

1.问题引出

求解Ax=bAx=b类线性问题是求解许多问题的基础。然而,采用传统的“高斯消元(Gaussian elimination)”法时间复杂度为O(n3)O(n^3),在A足够大(或者说是方程组足够大)时开销很大,那么有没有一种方法能够降低计算的复杂度,减小计算开销呢?为了解决这个问题,LU分解算法应运而生。

2.总体思想

将矩阵A变为下三角矩阵L与上三角矩阵U,这样原始问题就转化为了

LUx=bLUx=b

此时,我们令Ux=yUx=y,原式就又变为了

Ly=bLy=b

因为L与U都为三角矩阵,所以Ly=bLy=b时间复杂度为O(n2)O(n^2),由Ux=yUx=y反推的时间复杂度也为O(n2)O(n^2)。至此,我们已经成功地把时间复杂度降了下来。需要注意的是,将A矩阵分解为L与U两个三角矩阵的过程时间复杂度为O(n3)O(n^3),但这属于是一劳永逸的,算一遍就完事了

3.具体分解过程

本部分举例引用自书”Data-Driven Modeling & Scientifific Computation“ 让我们拿一个3×33\times 3的矩阵为例

由基本的线代知识可知,一个矩阵与单位矩阵相乘还等于其本身,因此

接着,我们使用高斯消去法将A矩阵变为一个上三角矩阵,对I矩阵进行相同操作

第一列

同理第二列

此时,我们已经成功地将A矩阵分解为了一个下三角矩阵L与一个上三角矩阵U。

4.排列矩阵P

在高斯消元的过程中,我们经常会碰到消到零主元(zero pivot)的情况,此时无法求解。为了解决此类问题,我们引入了排列矩阵(The permutation matrix)P。排列矩阵P的作用是将A矩阵的行位置互换从而避免零主元情况的发生。

P矩阵长这个样子

我们想将A矩阵的哪几行互换,就可以对单位矩阵I施行相同操作。这样,I矩阵就成功的变为了P矩阵啦。在我们之前所讨论的问题Ax=bAx=b中,为了避免出现零主元的情况,我们将其升级为PAx=PbPAx=Pb,再将PAPA进行LU分解,最后变为LUx=PbLUx=Pb,之后的步骤就和3中所述相同啦。

5.Matlab实现

Matlab已经贴心地为我们准备了相应的函数lulu接下来拿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

可以看出,我们x1x1输出的是高斯消元解出的结果,x2x2输出是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)在处理线性系统问题时的操作。

下面的话题与内容无关了。作为一名在校学生,这是我第一次尝试以写博客的方式来学习知识,在写的过程中发现自己也对一些内容增加了思考,加深了理解。也希望这是记录我学习生活的起点,希望以后能继续和大家一起分享探讨知识。