MATLAB实现列主元Gauss消去法求解线性方程组,并与不列主元的Gauss消去法比较,最后对数值结果进行分析。
function [Solution_matrix]=GaussElimination_Pivot(Augmented_matrix)
% 2020-5-18 臻orz
% inputs:
% Augmented_matrix:增广矩阵,为n*(n+1)维矩阵
% outputs:
% Solution_matrix:计算的解,为n*1维矩阵
%initialize
[row,col]=size(Augmented_matrix);
Solution_matrix=zeros(row,1);
%判定输入矩阵是否符合要求
if row~=col-1
disp('请输入n*(n+1)维矩阵');
else
for ii = 1:row-1
%找寻主元
max = ii;
for jj = ii+1:row
if abs(Augmented_matrix(jj,ii)) > abs(Augmented_matrix(max,ii))
max = jj;
end
end
Augmented_matrix([ii,max],:) = Augmented_matrix([max,ii],:);
if Augmented_matrix(ii,ii) == 0
disp(['第',num2str(ii),'个主元素为零']);
return;
end
%开始消元
for jj = ii+1:row
Augmented_matrix(jj,:) = Augmented_matrix(jj,:)-...
Augmented_matrix(jj,ii)/Augmented_matrix(ii,ii)*Augmented_matrix(ii,:);
end
end
%消元完毕,开始回代
if Augmented_matrix(row,row)==0
disp(['第',num2str(row),'个主元素为零']);
return;
end
Solution_matrix(row)=Augmented_matrix(row,col)/Augmented_matrix(row,col-1);
for ii=row-1:-1:1
Solution_matrix(ii)=(Augmented_matrix(ii,col)...
-Augmented_matrix(ii,1:row)*Solution_matrix)/Augmented_matrix(ii,ii);
end
end
end
Emax = zeros(4,1);
index = 0;
for ii = [5,10,14,20]
index = index+1;
eval(['epsilon=1e-' num2str(ii) ';']);
A = [epsilon 2 6 22; 5 7 5 34; 3 2 1 10];
Emax(index) = max(abs(GaussElimination(A)-GaussElimination_Pivot(A)));
end
Emax
运行代码,结果为
>> GaussElimination_Compare
第3个主元素为零
Emax =
0.0000
0.0000
0.4211
3.0000
当epsilon不是很小的时候,机器误差就不是很大,此时可以不选取主元以减少计算量;当epsilon逐渐减小时,采用不选主元的方法计算时,精度逐渐不理想,误差开始增大;最后当epsilon很小时,不采用列主元得到的结果已经不正确了,最后会因为精度问题而报错(机器计算最小精度为1e-15,这时将epsilon视为0),从Emax中第四个值可以看出,此时不选主元来解时程序就会报错(Emax初始化为零,此时与准确解相差为3,故Emax第四个元素为3)。
由此可以看出,Gauss消去法的精确度不如列主元消去法,特别是当矩阵规模变大时,由于迭代次数增加,舍入误差累计,所得结果与精确解差距较大。最终得出的矩阵条件数都较大,尤其是当矩阵阶数变大时,条件数剧增,舍入误差对解的影响很大。在这样的情况下就更应该考虑更优化的算法。