每种迭代方法的程序都返回迭代步数,可以很方便的进行对比

雅克比方法

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

posted on 2008-12-13 21:28  秋波渡  阅读(1689)  评论(0编辑  收藏  举报