通过实例验证加速对简单迭代的改进效果,注意到加速法使在简单迭代情况下不收敛的迭代方程也能收敛,这也是迭代法的特色哦。
实例: 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
加速: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步
加速效果非常好。