MATLAB解非线性方程简单迭代及加速
2008-12-15 09:32
162 查看
通过实例验证加速对简单迭代的改进效果,注意到加速法使在简单迭代情况下不收敛的迭代方程也能收敛,这也是迭代法的特色哦。
实例: 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步
加速效果非常好。
实例: 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步
加速效果非常好。
相关文章推荐
- 简单迭代法求方程根的MATLAB程序
- Matlab 数值计算----斯特芬森加速迭代法
- MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根
- 一点MATLAB程序加速技巧
- 非刚性图像配准 matlab简单示例 demons算法
- [Matlab]简单的人脸祛痘
- Matlab简单教程:绘图
- 如何借助配置中心ACM加速企业IT服务快速迭代
- metropolis算法的简单c++实现以及matlab实现
- 让产品有效迭代,前端A/B Testing的简单实现
- 两个简单方法加速DataGridView
- MATLAB——scatter的简单应用
- MATLAB GUI ,1,GUIDE 实例_简单的作图
- 利用matlab进行简单的贝叶斯网络构建
- 利用matlab进行简单的贝叶斯网络构建
- RBF神经网络简单介绍与MATLAB实现
- python 基础知识回顾篇之简单迭代和列表生成
- MATLAB简单入门一
- 赛德尔迭代(MatLab)
- matlab的GUI简单实例——二阶系统的阶跃响应