高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现

高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现

  • 代码
  • 运行
  • 手算例题

迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的计算规则得到不同的迭代法。

迭代法:求解大型稀疏线性方程组的常用方法,保持矩阵的稀疏性。

本文是常用的迭代法之一:Gauss-Seidel 迭代法解线性方程组的matlab实现。

关于Jacobi迭代法的具体内容和算法见《数值计算方法》—丁丽娟,P67-68

书中算法如下:

高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现_第1张图片
代码编写同上图

代码

//  输入量:
A: 线性方程组的系数矩阵(n*n,非奇异)
b: 方程组右边的常数项列向量
n: 方程组维数
x0: 初始值
tol: 精度上限值
N:  最大迭代次数

//迭代终止标准
已达精度上限值或者到达最大迭代次数

//输出量:
x:线性方程组的解

// 程序
function x=Gauss_Seidel_fun(A,b,n,x0,tol,N)
x=zeros(n,1);  % 给x赋值
k=1;
while k<N
    for i=1:n
        if i==1
            x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);
        elseif i==n
            x(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);
        else
            x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i)       
        end  
    end
    if norm(x-x0)<tol
        break;
    end
    
    x0=x;
    k=k+1;
    
    disp(['when k=',num2str(k)])
    disp('x=');
    disp(x);                       %输出中间结果
end

if k==N
    disp('迭代次数已到达上限!');
end
disp(['迭代次数 k=',num2str(k)])

end

代码可以看出G-S迭代法和Jacobi迭代法区别只在于G-S迭代时用旧分量代替新分量,计算时须按顺序进行

运行

运行示例的线性方程组:《数值计算方法》—丁丽娟 P-66 例一

//  Command Window 中输入
>> A=[10 -1 -2;-1 10 -2;-1 -1 5];
>> b=[72;83;42];
>> n=3;
>> x0=[0;0;0];
>> tol=1e-4;
>> N=500;

// 输入后,调用函数
>>x=jacobi_fun(A,b,n,x0,tol,N)

运行结果如下:
高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现_第2张图片

迭代的中间过程其中一小部分见下图:
高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现_第3张图片

注:选取tol精度上限值不同,迭代次数略有变化。

手算例题

维数低,迭代次数少时,可以直接手算,如下:
高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现_第4张图片
G-S:减少了存储量,但要求顺序计算

你可能感兴趣的:(数值分析,matlab,matlab,算法)