定义
定义:给定矩阵A,将A表示成下三角矩阵L和上三角矩阵U的乘积,称为LU分解。再进一步,希望L的对角元素都是1,这样利于后面的计算。
此外,形如A=LDU的分解称为LDU分解,L是下三角矩阵,D是对角阵,U是上三角矩阵,其中L和U的对角元素都是1。
对于正方矩阵来说,上面的分解结果L和U的大小显而易见,都和原矩阵A的size相同。那么对于非正方矩阵而言呢?
长矩阵B经过LU分解的结果希望是如下的形式:
宽矩阵C经过LU分解的结果希望是如下的形式:
为什么要LU分解
一旦完成了LU分解,利用L和U的性质,再去求行列式的值或者解线性方程组,计算量就大大减少了。
LU分解作为基本工具在各种数值计算问题中被广泛应用。例如求解线性方程组Ax=b时,只需要做一次A=LU的分解,后面面对不同的b就可以反复使用L和U了。
为什么能做到LU分解
可以先设定最终LU分解的两个矩阵中的所有未知数,之后通过原始矩阵的每个元素反解出L和U中的每个元素,这里可以以任意例子做实验。但是需要注意,如果原始矩阵的对角元素有0,那么情况就另当别论,需要对LU的样子稍作改变再进行分解。
利用LU分解求行列式值
对于方阵A,若已经有形如A=LU的LU分解,则立即可以得到行列式值detA。因为
detA=det(LU)=(detL)(detU)
所以只需要求出det L和det U即可。而下三角矩阵和上三角矩阵的行列式就是对角元素的乘积。这里det L恰好等于1,于是
detA=U的对角元素的乘积
利用LU分解求解线性方程组
这里以有解的情况为例,考虑n阶可逆方阵A和n维向量y,需要求解满足Ax=y的向量x。
将A进行LU分解,解方程的问题就被分为了两个步骤,LUx=y。第一步就是求出满足Lz=y的z;
第二步就是求出满足Ux=z的x。
用数学表达式表述就是
Ax=LUx=L(Ux)=Lz=y
这样有什么好处?其实,由于L和U都是具有特殊形式的矩阵,所以求解过程要简单许多。对于第一步:
⎝⎜⎜⎛1 车 孙 李 1 郑 王 1 卫 1⎠⎟⎟⎞⎝⎜⎜⎛z1z2z3z4⎠⎟⎟⎞=⎝⎜⎜⎛ 子 丑 寅 卯 ⎠⎟⎟⎞
则求解顺序一目了然,先求得z1,再利用已知的z1求得z2,在利用已知的z1,z2求得z3,最后通过已知的z1,z2,z3求出z4。
上三角矩阵也一样,例如
⎝⎜⎜⎛387132−3−1−25⎠⎟⎟⎞⎝⎜⎜⎛x1x2x3x4⎠⎟⎟⎞=⎝⎜⎜⎛−13410⎠⎟⎟⎞
求解顺序就反过来,先求x4,再利用已知的x4求x3。。。以此类推即可。这样的顺序比一般解法要快非常多。一般的顺序需要不断对A进行线性变换,逐行变更消元。这里的复杂度具体优化了多少,有下表进行统计
利用LU分解求逆矩阵
前面讲解了利用LU分解求线性方程组的问题,其实逆矩阵也可以分解为多个求线性方程组的问题。
记n阶方阵A的逆矩阵为X,将X=(x1,⋯,xn)按列分块,则AX=I可以写成
A(x1,⋯,xn)=(e1,⋯,en)
按分量展开写,就是
Ax1=e1,⋯,Axn=en
这里每一个等式都对应了一个解线性方程的问题,事先对A进行LU分解,就可以快速求解Ax=b的问题了,这里的b还是有许多个的情况,LU分解就实现了一劳永逸式的求解。
对角线上元素有0的情况
如果要解决这个困难,就需要在计算行列式以及求解线性方程组的过程中用到的选主元的方法。遇到0元素,就需要在同一列的下面寻找非0的元素,找到之后与该行整体进行交换。实现交换的操作就是在原矩阵上左乘一个矩阵S,所有S的累乘结果P就叫做置换矩阵,例如
P=⎝⎜⎜⎜⎜⎜⎜⎛010000000010100000001000000100000001⎠⎟⎟⎟⎟⎟⎟⎞
矩阵P中的每一行中恰好有一个1,每一列中也恰好有一个1,其他元素都是0,这样的矩阵称为置换矩阵。之所以有这个名字,是因为将置换矩阵乘以任何向量,所得结果都相当于将向量的各个分量进行重新排列。各个S相乘所得的矩阵一定是置换矩阵。