列主元Gauss消元法求解线性方程组的MATLAB实现

目录

  1. 顺序高斯消去法求解线性方程组的MATLAB实现
  2. 列主元Gauss消元法求解线性方程组的MATLAB实现

一、简介

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

三、数值结果分析

列主元Gauss消元法求解线性方程组的MATLAB实现_第1张图片

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消去法的精确度不如列主元消去法,特别是当矩阵规模变大时,由于迭代次数增加,舍入误差累计,所得结果与精确解差距较大。最终得出的矩阵条件数都较大,尤其是当矩阵阶数变大时,条件数剧增,舍入误差对解的影响很大。在这样的情况下就更应该考虑更优化的算法。

你可能感兴趣的:(列主元Gauss消元法求解线性方程组的MATLAB实现)