通过实例验证加速对简单迭代的改进效果,注意到加速法使在简单迭代情况下不收敛的迭代方程也能收敛,这也是迭代法的特色哦。 

实例: f(x)=x^3+10*x-20 精确到6位小数

迭代方程:     φ(1  20/(x.^2+10)φ(2        x.^3+11*x-20φ(3        2-x.^3/10 

简单迭代:

%简单迭代法 use structure 
i=2;N=100;
x0=1.5;%设初始值
%f=inline('20/(x.^2+10)');          %我到现在还没有找到如何把函数(迭代方程)以参数的形式输入程序的方法
f=inline('x.^3+11*x-20');
%f=inline('2-x.^3/10');
x1=f(x0);
S.result=[x0;x1];
while abs(x1-x0)>=1e-6
    x0=x1;
    x1=f(x0);
    if i>=N|abs(x1)>1e6                        %这样判断发散是不是有点儿笨啊?应该用abs(x1-x2)来判断
        warning('迭代次数过的,请调整迭代方程!');
        break;
    else
        i=i+1;
        S.result(i)=x1;
    end
end
S.step=[(0:i-1)]';
fprintf('The number of steps:\t%d\n',i-1);
for j=1:i
    fprintf('%10d',S.step(j));fprintf('\t');
    fprintf('%10.7f\n',S.result(j));
end

迭代结果: φ(1  20/(x.^2+10);15步φ(2        x.^3+11*x-20;46步φ(3        2-x.^3/10;不收敛 

加速:Steffensen方式(Aitken方式类似)

%Steffensen方法加速迭代 use structure 
i=2;x0=1.5;%设初始值
%f=inline('20/(x.^2+10)');
%f=inline('2-x.^3/10');
f=inline('x.^3+11*x-20');
y=f(x0);
z=f(y);
x1=x0-(y-x0).^2/(z-2*y+x0);
S.result=[x0;x1];
while abs(x1-x0)>=1e-6
    x0=x1;
    y=f(x0);
    z=f(y);
    x1=x0-(y-x0).^2/(z-2*y+x0);
    i=i+1;
    S.result(i)=x1;
end
S.step=[(0:i-1)]';
fprintf('The number of steps:\t%d\n',i-1);
for j=1:i
    fprintf('%10d',S.step(j));fprintf('\t');
    fprintf('%10.7f\n',S.result(j));
end

迭代结果: φ(1  20/(x.^2+10);3步φ(2        x.^3+11*x-20;3步φ(3        2-x.^3/10;5步

加速效果非常好。

posted on 2008-12-15 09:32  秋波渡  阅读(4837)  评论(0编辑  收藏  举报