二分法、试位法、不动点迭代法、牛顿法、割线法

  • 问题回顾
  • 问题分析
  • 1.二分法
  • 2.试位法
  • 3.不动点迭代
  • 4.Newton-Raphson法
  • 5.割线法
  • 小结

问题回顾

一段质量均匀分布的电缆线悬挂在两点之间,构成一段悬链,其满足如下微分方程:

问题分析

1.二分法

首先确定有根区间,将区间二等分,通过判断f(x)的符号,逐步将有根区间缩小,直至有根区间足够地小,便可求出满足精度要求的近似根。通过悬链最低点张力的唯一性,可以确定该区间只有一个根。

用 (xl,xr)来表示我们所感兴趣的根,初始为(1000,1500),MATLAB脚本程序如下,保留10位有效数字。

clear;
x_l = 1000; % the initial value of the left bound of x is 1000
x_r = 1500; % the initial value of the right bound of x is 15000
x_m = mean([x_l,x_r]); % x_m is the mean value of the two bounds
x_g = 0; % x_g is the target value of the Bolzano method
e_a = 5e-11;
i = 0;
if f(x_l)*f(x_r)>0error('invalid input');
else
while (abs(x_g-x_m)/x_m>e_a) % tolerance of accuracy
if f(x_m)==0                 % find the accurate rootbreak;
elseif f(x_l)*f(x_m)<0x_r = x_m;               % update the new estimation to the intervalelsex_l = x_m;end
end
x_g = x_m;
x_m = mean([x_r,x_l]);
i = i + 1;
end
end
fprintf('x = %.17f  i = %d\n', x_m, i);

程序输出为

x = 1266.32436044747009873 i = 32

本例中用了 32 次迭代达到了保留10位有效数字的计算准则。下面用图表示出迭代过程。

2.试位法

与二分法不同,每次区间的划分点不在中点,而是两区间函数值点连线与 x 轴的交点, 递归地做这样的划分求解最终的结果,图示结果附后。

clear;
x_l = 1000; % the initial value of the left bound of x is 1000
x_r = 1500; % the initial value of the right bound of x is1500
x_c = x_r; % x_c is the cross point of the two bound and the x-axis
x_t = 0; % x_t is the target ROOT of the eqation
e_a = 5e-11;
i = 0; % iteration tag
while (abs(x_t-x_c)/x_c>e_a)x_t=x_c; % update the target value with the cross pointif f(x_t)==0break;elsex_c = x_r - f(x_r)*(x_l-x_r)/(f(x_l)-f(x_r)); if f(x_c)*f(x_r)<0x_l = x_c;elsex_r = x_c;endendi = i+1;
end
fprintf('x = %.17f  i = %d\n', x_c, i);

程序输出为

x = 1266.32436040640868669 i = 16

本例中用了 16 次迭代达到了保留10位有效数字的计算准则。下面用图表示出迭代过程。

根据计算结果可以看到,此例中试位法较二分法更为快速地收敛到了想要的解,且并也已经出现“一个划界点保持不动”的现象。

3.不动点迭代

clear;
x_t = 1000;    % the initial is 1000
x_c = 0;
e_a = 5e-11;
for i=1:1000        % iteration tagx_c = f(x_t) + x_t;if(abs(x_c-x_t)/x_c<e_a) % tolerance of accuracybreak;endx_t = x_c;
end
fprintf('x = %.17f  i = %d\n', x_c, i);

程序输出为

x = 1266.32436009672028376 i = 115

本例中用了 115 次迭代达到了小数点后 10 位有效数字的计算准则。下面用图表示出迭代过程。

4.Newton-Raphson法

clear;
x_t = 1000; % the initial is 1000
x_c = 0;
e_a = 5e-11;
for i=1:1000   % iteration tagx_c = x_t-f(x_t)/df(x_t);if(abs(x_c-x_t)/x_c<e_a) % tolerance of accuracybreak;endx_t = x_c;
end
fprintf('x = %.17f  i = %d\n', x_c, i);

程序输出为

x = 1266.32436039988829179 i = 5

5.割线法

clear;
x_t = 1000; % the initial value of the second bound of x is 1000
x_r = 1500; % the initial value of the first bound of x is 1500
x_c = 0;
e_a = 5e-11;
i = 0; % iteration tag
while (abs(x_r-x_t)/x_t>e_a)x_c=x_t-f(x_t)*(x_t-x_r)/(f(x_t)-f(x_r)); % update the target if f(x_c)==0break;elsex_r = x_t; x_t = x_c;endi = i+1;
end
fprintf('x = %.17f  i = %d\n', x_c, i);

程序输出为

x = 1266.32436039988601806 i = 7

小结

本文由实际问题出发,按照题目要求的五种方法分别解了一个非线性的方程,作图比较了五种方法的收敛速度,并用每种方法都得到了最终的结果(有十位有效数字),x = 1266.324360,即悬链最低点的张力为1266.324360。

下面列表总结一下每种方法得到结果的情况:

方法名称 初始估计 1 初始估计 2 迭代次数
二分法 1000 1500 32
试位法 1000 1500 16
不动点迭代 1000 \ 115
Newton-Raphson法 1000 \ 5
割线法 1000 1500 7

二分法是最简单的方法,且易于在计算机上实现,对函数的条件要求也很低,只要求在有根区间上连续。缺点就是收敛速度较慢,本次实验进行了32次迭代得到结果,与公比为1/2的等比数列收敛速度相同。因此一般不单独使用,常用来为其他方法提供初值区间。

试位法作为二分法的改进,并不是单一的二分区间,而是利用区间两个端点的线性插值来求一个近似根,因此在大多数情况下优于二分法,收敛速度相对于二分法更快。但在实际计算中,如果区间内一阶导数值突然增长,函数图像有极大拐弯,且方程的根更靠近导数大的一侧,情况将会变得非常糟糕,出现“一个划界点保持不动”的现象,此时收敛速度会慢于二分法。本题中没有出现上述情况,进行了16次迭代后得到了结果。

为了减轻上述情况带来的影响,可以对试位法做出如下改进。如果一个端点重复两次或更多次作为新的含根区间的端点,我们将这个点的函数值乘以一个大于0小于1的常数因子w,比如可以取0.5,将停滞的边界点处的函数值变为原来的一半,能够使线性插值的根更接近于精确根。更加符合“试位”的思想。

不动点迭代法与前两种方法不同,只需要一个初始估计值。这种方法收敛较慢,本次实验迭代了115次才得出了最终结果。对初值的要求较高,需要提供较为近似的初始值x0.大多数情况下需要考虑迭代法的局部收敛性,在方成根的附近取初值。不动点迭代法是迭代法的基础,是一种一般性的方法,对研究方程解的存在性、唯一性和具体计算有重要的理论与实用价值。

Newton-Raphson法是经不动点迭代法变形而来的,是迭代法“收敛性”意义上的最优进化。牛顿法的速度很快,本次实验只用了5次迭代就得到了满足要求的解。它的最大优点是方程在单根附近有较高的收敛速度,且算法逻辑简单。但是由于牛顿法是局部收敛的,对初始估计的要求很高,如果没有估计合适,将会产生很差的结果,甚至无法得出答案。此外,牛顿法的每次迭代除了要计算函数值以外,还需要计算导数值,在导数较为复杂时,该方法会比较麻烦。

割线法是牛顿法和试位法的改进。类似于牛顿法,都是用差商估计斜率,但使用了两点的割线,避开了复杂的导数运算。采用两点投射到x轴上得到新的估计值的方法与试位法较为相似,但是初始估计不用界定根。收敛速度在中等到快,本次实验经过7次迭代后得到了结果。

对初始估计的要求很高,如果没有估计合适,将会产生很差的结果,甚至无法得出答案。此外,牛顿法的每次迭代除了要计算函数值以外,还需要计算导数值,在导数较为复杂时,该方法会比较麻烦。

割线法是牛顿法和试位法的改进。类似于牛顿法,都是用差商估计斜率,但使用了两点的割线,避开了复杂的导数运算。采用两点投射到x轴上得到新的估计值的方法与试位法较为相似,但是初始估计不用界定根。收敛速度在中等到快,本次实验经过7次迭代后得到了结果。

总而言之,不同的求解方法各有千秋,我们需要结合实际问题来选择恰当的方法。

二分法、试位法、不动点迭代法、牛顿法、割线法相关推荐

  1. 计算方法实验:方程求根二分法、不动点迭代法、牛顿法

    计算方法实验一,方程求根 分别用Matlab和C写了一下,初学Matlab,如有不足还请指正. 实验内容: 1)在区间[0,1]内用二分法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ...

  2. matlab牛顿法求区间根程序,MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根...

    一.实验原理 二.实验步骤 三.实验过程 1.(程序) (1)二分法:求  在区间(1,2)之间的根,取 (a)bipart.m: function [x,m]=bipart(fun,a0,b0,to ...

  3. 非线性方程的几种线性解法(二分法,不动点法和牛顿法)

    非线性方程的几种线性解法 对于线性方程我们有很多方法来解,比如简单的线性方程都会有公式直接来计算.但是涉及到复杂的线性方程比如高阶多项式方程,非线性性方程也是很那直接求解的,在数值分析的角度就很容易来 ...

  4. 重根的二阶迭代法matlab,MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根...

    作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.实验原理 二.实验步骤 三.实验过程 1.(程序) (1)二分法:求  在区间(1,2)之间的根,取 ...

  5. 【MATLAB实验】数学实验实验求根问题三种方法、积分画图及古典密码设计(二分法、牛顿法、不动点迭代法)

    目录 特征值与特征向量 求最简型 编程题 求积分问题(quad.trapz.int) 求根问题(二分法.不动点迭代法.牛顿法) 1.二分法: 2.不动点迭代法 3.牛顿切线法 画图题 画螺旋曲线图 画 ...

  6. 数值分析2-解非线性方程的不动点迭代法,斯蒂芬森(steffensen)迭代法,牛顿法以及简化牛顿法的matlab程序

    对于形如f(x)=0的单变量非线性方程,可以构造不同的迭代函数进行迭代求根,以f(x)=x3-x-1为例,我们可以简单的通过等式变形构造出x=x3-1和x=(x+1)(1/3)两种等价形式:也可以自己 ...

  7. 【计算方法】实验一:python使用二分法、不动点法、牛顿法求根

    题目 二分法 # x^3+2x^2+10x-20 def func(x):return x*x*x+2*x*x+10*x-20;a=-1 b=2 fa=func(a) fb=func(b) eps=1 ...

  8. 不动点迭代法matlab视频,不动点迭代法matlab

    不动点迭代法的 MATLAB 程序代码如下: Function [root,n]=StablePoint(f,x0,eps) %用不动点迭代法求函数的一个零点 %初始迭代向量:x0 %根的精度:eps ...

  9. 不动点迭代法(Fixed Point Iteration)迭代求根的python程序

    迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题.这一系列的解叫做方程的根.对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行 ...

最新文章

  1. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环amp;主角加入动作
  2. wireshark 总体结构
  3. CentOS 安装与优化
  4. LIGHTOJ 1044(动态规划)
  5. C# 遇到 which has a higher version than referenced assembly
  6. 密码学专题 随机数文件
  7. php开始页,页码从第四页开始怎么设置
  8. shell脚本编程 逐行处理文本 将字符串转化为数组
  9. Linux学习笔记之CentOS7的 wheel组
  10. MAYA制作女猎人角色毛发-3D建模场景模型教程
  11. U盘多次格式化或作为系统盘格式化后造成的容量变小解决办法
  12. Shell版本循环语句(if//for/while/case)
  13. pocketsphinx 模型库_pocketSphinx 嵌入式关键词唤醒
  14. Veloview阅读笔记1
  15. Linux下安装Git、git命令介绍
  16. 无源晶振电路设计和改进
  17. 小白终是踏上了这条不归路----小文的mysql学习笔记目录
  18. 关键对话:如何高效能沟通
  19. 【一起入门MachineLearning】中科院机器学习第*课-线性鉴别分析:Fisher判别
  20. python3 大文件去重

热门文章

  1. @Android程序员:到底是Android不行了,还是你跟不上了?
  2. 验证身份证号码是否为正确值
  3. 倍福--控制器添加路由
  4. 视频回放 | OCP 2020: 边缘计算的开放趋势
  5. 金行健:《漠河舞厅》播放超23亿次,创作者无奈:再刷就变味儿了
  6. java 腾讯地图路线搜索_Java 腾讯地图获取经度、纬度 and 计算距离
  7. commit 提交失败, 消费者自动死掉
  8. linux强制kill死掉的进程和窗口
  9. opencv学习 Resize and Crop
  10. 如何解决Adobe Photoshop CS4"产品许可证已过期的问题