matlab 求解线性方程组之LU分解
线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积。常见的有如下分解:
LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵
QR分解:
秩分解:A=CD , A是m×n矩阵,C是m×4矩阵,D是4×n矩阵。
奇异值分解:A=UDVT
谱分解:
在求解线性方程组中,一个核心的问题就是矩阵的LU分解,我们将一个矩阵A分解为两个更加简单的矩阵的复合LU,其中L是下三角矩阵,U是阶梯形矩阵。下三角矩阵和上三角矩阵具有非常良好的性质:Lx=y 或者Ux=y 很容易求解。
问题1.对于任意的矩阵A,是否存在LU分解?
定理:如果A行等价于阶梯形矩阵U,那么(EnEn-1......E1)A=U,其中的Ei,i=1,2,.....,n是高斯消去矩阵,他们都是下三角矩阵,并且都可逆。
这个定理告诉我们三件事:
1.并不是所有的矩阵都有LU分解的。
2.A=LU=(EnEn-1......E1)-1U=(E1-1E2-1.....En-1)U。
3.这个定理还给出了求解矩阵A-1的一种方法。
数值算法1.Gauss消去
用Gauss消去法将矩阵A行变换为U:
用Gauss消去矩阵将A行变换为U:
数值算法2.Gauss-jardon
过程和Gauss-jardon基本一致,之不多在选择完最大元之后,将其化为1,这样就可以通过乘以一个倍数来消去其他行了。
选择主元
当对某一列进行Gauss消去时,一般都是选择这一列中绝对值最大的一个元素作为主元,当然这会进行行交换。其好处有一下几点:
1.在Gauss会代的过程中,不会出现除数为0的情况。
2.减少误差传播,这主要是因为乘数小于等于1.
(为何乘数小于等于1,如果选择这一列中绝对值最大的一个元素作为主元,我们假设这个元素是a,那么乘数等于-b/a,此时|b/a|<=1)。
为什么不用绝对值最小的元素做主元?易知此时乘数的绝对值大于等于1,会增加误差的传播累计。
为什么应该避免用接近于0的数做主元?此时乘数可能非常大,参加如下例子: