数值线性代数Gauss消去解线性方程组MATLAB实现

算法思想

如何利用电子计算机来快速、有效地求解线性方程组是数值线性代数研究的核心问题,而且也是目前人在继续研究的重大课题之一。
对于下三角矩阵L,因为特殊的形式,我们可以用前代法很轻易地算出其结果。(上三角也是,用回代法)
而Gauss消去是分解A=LU,其中L为下三角阵,U为上三角阵。(也称LU分解)原方程的解x由下面两部可以得到:
(1)用前代法解Ly=b得y;
(2)用回代法解Ux=y得x。

矩阵创建

function [A,b]=creatMaxtrix(n)
    T=zeros(n-1,n-1);
    for i=1:n-1
        T(i,i)=2;
    end
    for i=1:n-2
        T(i,i+1)=-1;
        T(i+1,i)=-1;
    end
    I=eye(n-1,n-1);
    k=(n-1)^2;
    A=zeros(k,k);
    b=ones(k,1);
    j=1;
    for i=1:n-1
        A(j:j+n-2,j:j+n-2)=T+2*I;
        j=j+n-1;
    end
    j=1;
    for i=1:n-2
        A(j:j+n-2,j+n-1:j+2*n-3)=-I;
        A(j+n-1:j+2*n-3,j:j+n-2)=-I;
        j=j+n-1;
    end
end

该矩阵是一个(n-1)2 阶的矩阵,其具有这样几个特点,
(1)A是块三对角阵,共有五条对角线上有非零元素;
(2)A是不可约对角占优的;
(3)A是对称正定的,而且是稀疏的。
矩阵的形式如下
数值线性代数Gauss消去解线性方程组MATLAB实现_第1张图片
可通过spy来观察矩阵的分布,一个n=11时的矩阵分布情况如下

数值线性代数Gauss消去解线性方程组MATLAB实现_第2张图片

Gauss消去

function []=Gauss(n)
[A,b]=creatMaxtrix(n);
[n,~]=size(b);
x=A\b;
%Gauss消去
for k=1:n-1
    A(k+1:n,k)=A(k+1:n,k)/A(k,k);
    A(k+1:n,k+1:n)= A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n);
end
%计算时将y,x存在b的存储单元里
%解下三角形方程组:前代法
L=tril(A,-1);
L=L+eye(n);
for j=1:n-1
    b(j)=b(j)/L(j,j);
    b(j+1:n)=b(j+1:n)-b(j)*L(j+1:n,j);
end
b(n)=b(n)/L(n,n);
 
%解上三角形方程组:回代法
U=triu(A,-1);
for j=n:-1:2
    b(j)=b(j)/U(j,j);
    b(1:j-1)=b(1:j-1)-b(j)*U(1:j-1,j);
end
b(1)=b(1)/U(1,1);
%用二范数来衡量误差
norm(x-b)

总结

运行结果如下

>> Gauss(11)
ans =
   1.8752e-14

可以发现当矩阵为100阶时,误差十分小。但是对于很多问题来说矩阵的阶数往往很大,这时候需要考虑的就不仅仅是算法的准确性,还要考虑算法的复杂度。

你可能感兴趣的:(MATLAB)