对于一个非奇异的矩阵而言(非奇异!非奇异!非奇异!非奇异!重要的事情说三遍!!!),全主元三角分解是一个较为‘“靠谱”的方法,它的靠谱体现在最终的分解结果上,它对计算机精度的要求相对而言较低。
全主元三角分解是一般的高斯LU的一种改进,它在选取消去过程中的主元的时候,选取子式中元素的绝对值中的最大元(具体哪个子式...enn...看教材去^_^),也就是说,相对于一般的高斯LU分解,全主元LU分解在分解过程中,会有一系列的置换矩阵P&Q(P=pr*pr-1...*p1;Q=q1*q2...*qr)。
一般的全主元三角分解最终结果可由下式来描述:
PAQ=LU
其中:L=P(Ln-1Pn-1......L2P2L1P1),为下三角矩阵,U为上三角矩阵.
通常,全主元三角分解最主要的用途就是求解系数矩阵为满秩的线性方程组,例如:
Ax=b
将PAQ=LU带到上式,进行适当的转化,可将上式转化为:
Ly=Pb
UQ^(-1)x=y
然后再应用前代法及回代发即可完成对线性方程组的求解,相比于其他的方法而言,这种方法得到的解较为精确。
扫描二维码关注公众号,回复:
5441030 查看本文章
Ps:第一次写博客,隐隐还有点小激动呢,哎呀,,,不能暴露我话痨的本质,我可是高冷帅气男呢,,,enn..第一次就这么多吧
matlab代码实现:
%%输入要分解的非奇异矩阵(方阵)
A=input('please enter the coefficient matrix:');
%%对所给矩阵进行分解
[X,Y]=size(A); %求矩阵的阶数
I=eye(X); %生成单位矩阵,为后面置换矩阵的生成及其他做准备
p=1; %后面要用到的常量
q=1; %同上
lp=1; %同上
for jj=1:X-1
love1=zeros(X); %变量的及时更新
lk=zeros(1,X); %同上
love1(jj:X,jj:X)=abs(A(jj:X,jj:X)); %将子式中的元素都变为非负
love2=max(max(love1)); %求子式的绝对值最大值
[x,y]=find(love1==love2); %确定绝对值最大值元素所在的位置(位置可能有好几个)
row=x(1); %行位置
col=y(1); %列位置
P=I;
zj1=P(:,jj);
P(:,jj)=I(:,col);
P(:,col)=zj1; %列置换矩阵
p=P*p; %列置换矩阵的乘积(pr*pr-1*...p1)
Q=I;
zj2=Q(:,jj);
Q(:,jj)=I(:,row);
Q(:,row)=zj2; %行置换矩阵
q=q*Q; %行置换矩阵的乘积(q1*q2...qr)
A=P*A*Q; %将最大元挪到主元位置
%%高斯消去部分
ek=I(jj,:);
zj3=A(jj+1:X,jj)/A(jj,jj);
lk(jj+1:X)=zj3;
Lk=I-lk'*ek;
lp=(Lk*P)*lp;
A=Lk*A;
end
L=p*inv(lp);
U=A;