您的位置:首页 > 编程语言 > MATLAB

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

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

实例: 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步

加速效果非常好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: