高斯-赛戴尔(Gauss-Seidel)迭代法基于MATLAB的实现

本文介绍了作者在MATLAB中实现高斯-赛戴尔迭代法的过程,探讨了迭代收敛判断的问题,并提供了代码示例。虽然存在迭代矩阵谱半径判断不准确的情况,但整体上仍可作为参考。文章最后鼓励读者自行试验并提出反馈。
部署运行你感兴趣的模型镜像

前言

这个代码的实现,其实主要是因为所修课程当中老师要求,所以自己就写了这么一个代码,具体原理就不提及了,各处文献都写的很清楚了,如果想要从原理仔细学习,可以参照各种数值分析课本。

这里讲一下这里面的一些问题:
·首先,这其中关于迭代是否收敛的判断有一点小问题,就是关于迭代矩阵(D-L)\U求其谱半径作为判断标准的问题:我只采用了迭代矩阵谱半径为判断标准,但是遇到了有一些矩阵该值比1稍大小数点后一点点,被判断不收敛,但实际上可以收敛;
·其次,关于高斯-赛德尔迭代法的实现形式,我并非采用的是矩阵分解的形式,而是以方程组的解法来进行迭代。

嘛,总的来说,只算作一个样例供大家参考~(Kira)

代码

function [X1]=GS(A_matrix, B) 
%取得n并给输出向量留一个初值
[row_a,col_a] = size(A_matrix);
X1=zeros(row_a,1);
%取得对角矩阵、严格上三角矩阵、严格下三角矩阵
D=zeros(row_a,col_a);
for i=1:row_a
    D(i,i)=A_matrix(i,i);
end
U=-A_matrix;
for i=1:row_a
    for j=1:i
        U(i,j)=0;
    end
end
L=-A_matrix;
for i=row_a:-1:1
    for j=row_a:-1:i
        L(i,j)=0;
    end
end
C=(D-L)\U;%迭代矩阵
m=eig(C);
for i=1:row_a
    m(i,1)=abs(m(i,1));
end
[max_m,~]=max(m,[],1);%迭代矩阵的谱半径
if(max_m>1)%判断迭代矩阵的谱半径是否小于1
    fprintf('在该条件下高斯-赛德尔迭代法不收敛。\n');
else
    fprintf('在该条件下高斯-赛德尔迭代法收敛,请继续输入相应参数。\n');
    X1=Iteration(A_matrix, B,row_a);
end    


function [X1]=Iteration(A_matrix, B,row_a)

%设定初值
Value0=input('输入初值:');
X0=zeros(row_a,1);
X1=zeros(row_a,1);
for i=1:row_a
    X0(i,1)=Value0;
end
    X1(:,1)=X0(:,1);
    
%设定迭代次数限制
Nm=input('输入最大迭代次数:');

%设定迭代精度
ep0=input('输入迭代精度:');

%进入迭代循环
ep1=1;
N=0;
while(ep1>ep0)
    %迭代
    N=N+1;
    for i=1:row_a %此处迭代部分是根据多项式格式列写的,并不是完全基于矩阵形式列写
        X2=X1(:,1).*A_matrix(i,:)';
        X1(i,1)=(B(i,1)-sum(X2)+X1(i,1)*A_matrix(i,i))/A_matrix(i,i);
    end
    %计算精度
        ep1=abs(X1(1,1)-X0(1,1));
    %不满足情况但迭代次数达到
    if(N>Nm)
        fprintf('不满足精度,但迭代次数已达上限。\n');
        break;
    end
    %换值
    X0(:,1)=X1(:,1);
end
fprintf('已满足精度要求,迭代次数为 %d。\n',N-1);      

随便写一个矩阵来进行试验:

A = [2,2,3;4,7,6;-2,4,5];
B = [3;1;-7];

结果如下:

ans =

   2.0416
   -1.6667
    0.7500

诸位可以试一下,如果有问题,还请斧正~

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值