每种迭代方法的程序都返回迭代步数,可以很方便的进行对比
雅克比方法
function [x,n]=jacob(A,b,x0,eps,M)
%雅可比迭代
%x 解 n 达到所需精度实际用的步数
%对输入单数进行默认设置 x0初始值 eps精度 M限制步数
if nargin==3
eps=1.0e-6;
M=200;
elseif nargin==4
M=200;
elseif nargin<3
error;
return;
end
D=diag(diag(A));
B=inv(D)*(D-A);
f=inv(D)*b;
x=B*x0+f;%迭代公式
n=1;
while norm(x-x0)>=eps
x0=x;
x=B*x0+f;
n=n+1;
%如果不收敛从此退出
if(n>=M)
disp('迭代次数过多可能不收敛!!');
return;
end
end
高斯-赛得尔方法
function [x,n]=gaussseidel(A,b,x0,eps,M)
%高斯赛德尔迭代
%x 解 n 达到所需精度实际用的步数
%对输入单数进行默认设置 x0初始值 eps精度 %M限制步数
if nargin==3
eps=1.0e-6;
M=200;
elseif nargin==4
M=200;
elseif nargin<3
error;
return;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
G=(D-L)\U;
f=(D-L)\b;
x=G*x0+f;%迭代公式
n=1;
while norm(x-x0)>=eps
x0=x;
x=G*x0+f;
n=n+1;
%如果不收敛从此退出
if(n>=M)
disp('迭代次数过多可能不收敛!!');
return;
end
end
SOR超松弛法
function [x,n]=SOR(A,b,x0,w,eps,M)
%SOR方法
%x 解 n 达到所需精度实际用的步数
%对输入参数进行限制 x0 初始变量 w 松弛因子 eps 精度控制 M 最大步数
if nargin==4
eps=1.0e-6;
M=200;
elseif nargin==5
M=200;
elseif nargin<4
error;
return;
end
if(w<=0|w>=2)
error; return;
end
D=diag(diag(A));L=-tril(A,-1);U=-triu(A,1);B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=B*x0+f;%迭代公式
n=1;
while norm(x-x0)>=eps
x0=x;
x=B*x0+f;
n=n+1;
%如果不收敛从此退出
if(n>=M)
disp('迭代次数过多可能不收敛!!');
return;
end
end