前言
这个代码的实现,其实主要是因为所修课程当中老师要求,所以自己就写了这么一个代码,具体原理就不提及了,各处文献都写的很清楚了,如果想要从原理仔细学习,可以参照各种数值分析课本。
这里讲一下这里面的一些问题:
·首先,这其中关于迭代是否收敛的判断有一点小问题,就是关于迭代矩阵(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
诸位可以试一下,如果有问题,还请斧正~
本文介绍了作者在MATLAB中实现高斯-赛戴尔迭代法的过程,探讨了迭代收敛判断的问题,并提供了代码示例。虽然存在迭代矩阵谱半径判断不准确的情况,但整体上仍可作为参考。文章最后鼓励读者自行试验并提出反馈。
5662

被折叠的 条评论
为什么被折叠?



