MATLAB解非线性方程简单迭代及加速

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

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

迭代方程: φ(120/(x.^2+10)φ(2x.^3+11*x-20φ(32-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步

加速效果非常好。