牛顿迭代、割线法、二分法算法实验报告

更新时间:2023-03-20 03:15:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

20123789 黄佳诚 2014/11/25 数值分析作业 [键入文档副标题]

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

摘要

本文分别采用了“二分法”、“牛顿法”、 “割线法”、3种方法讨论如何求解方程“x3 9=0”,描述了每个算法的算法思想,给出了计算结果与迭代时间以及每一步迭代结果和解的精度,并且用多项式拟合了不同算法的时间复杂度函数进行收敛性和时间复杂度分析比较了的优劣。在最后报告给出了其他可供使用的求根方法例如,“简易牛顿算法”、Steffensenf迭代法并对它的思想和计算流程进行了简单的介绍。

关键词:二分法 牛顿法 割线法 简易牛顿法 Steffensenf迭代法

一、计算机配置

操作系统:windows7旗舰版

处理器:Intel(R) Core(TM) i5-3210M CPU@2.50GHz

安装内存(RAM):4.00GB(2.91GB可用)

系统类型:32位操作系统

二、二分法计算实验

2.1 二分法算法思想和简要描述

若f是区间[a,b]上的连续函数,且f(a)f(b)<0,根据连续函数闭区间零点定

理,f在[a,b]内必有一零点。

利用这一思想:若f(a)f(b)<0,则计算c=(a+b)/2,并检验f(a)f(c)<0是否是

真的,若是把c改为b重新开始;若不是真的,则f(c)f(b)<0,把c改为a;反复重复上述过程。

2.2 MATLAB运行二分法程序

二分法求解f=x^3-9的根

参数设置:a,b设置为估计零点所在区间的上确界和下确界。 n设置为二分法for语句迭代次数。

alpha设置为最后结果f(x)的精度。

delta设置为最后结果x的精度。

(若alpha,delta都符合设置的计算精度时,结束迭代并得

出计算结果,否则一直迭代到n次)

设置初始值:设置参数a,b分别为为2,3;迭代次数n为50次;alpha

和delta都设置为0.001。

列出计算结果:>> erfen(f,2,3,50,0.001,0.001)

n a b delta alpha 1.0000 2.0000 2.5000 0.5000 19.0000

2.0000 2.0000 2.2500 0.2500 7.6250

3.0000 2.0000 2.1250 0.1250 3.3906

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

4.0000 2.0625 2.1250 0.0625 1.5957

5.0000 2.0625 2.0938 0.0313 0.8220

6.0000 2.0781 2.0938 0.0156 0.4049

7.0000 2.0781 2.0859 0.0078 0.2040

8.0000 2.0781 2.0820 0.0039 0.1016

9.0000 2.0801 2.0820 0.0020 0.0507

10.0000 2.0801 2.0811 0.0010 0.0254

11.0000 2.0801 2.0806 0.0005 0.0127

12.0000 2.0801 2.0803 0.0002 0.0063

13.0000 2.0801 2.0802 0.0001 0.0032

14.0000 2.0801 2.0801 0.0001 0.0016

elapsed time is 0.316426 seconds.

三、牛顿法计算实验

3.1 牛顿法算法思想和简要描述

我们有一个函数f,其零点由数值计算得出,设r是f的一个零点,x

是r的一个近似。若f的二阶导数存在并且连续,则有泰勒定理,得

0=f(r)=f(x+h)=f(x)+hf’(x)+o(h^2)

其中h=r-x。若h较小(即x在r附近),则有理由略去o(h^2)项并且

在余下方程中求h。即得到h=-f(x)/f’(x)。故x-f(x)/f’(x)是比x更好的一个近似。牛顿法从r的一个估计x0开始,得到更加准确的近似值xn。递推式定义为:

f(xn)xn+1=xn n3.2 MATLAB运行牛顿法程序

牛顿法求解f=x^3-9的根

参数设置:x0设置为函数f零点的近似。

n设置为牛顿法for语句迭代次数。

alpha设置为最后结果f(x)的精度。

delta设置为最后结果x的精度。

(若alpha,delta都符合设置的计算精度时,结束迭代并得

出计算结果,否则一直迭代到n次)

设置初始值:设置参数x0分别为为3;迭代次数n为50次;alpha和

delta都设置为0.001。

列出计算结果:

>> newton(f,50,3,0.001,0.001)

n x f(x) delta alpha

1.0000 2.3333 3.7037 0.6667 3.7037

2.0000 2.1066 0.3483 0.2268 0.3483

3.0000 2.0804 0.0043 0.0262 0.0043

Elapsed time is 0.166680 seconds.

四、割线法计算实验

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

4.1 割线法算法思想和简要描述

割线法思路总体上与牛顿法一致,但是为了避免牛顿法中求函数导数所带来的困难,用差商来近似的代替导数得到了割线法近似值的递推式: xn xn 1xn+1=xn nn 1因为xn+1的计算需要xn和xn 1,所以开始时需要两个初始点。

4.2 MATLAB运行割线法程序

割线法求解f=x^3-9的根

参数设置:a,b设置为函数f零点的两个近似值。

n设置为牛顿法for语句迭代次数。

alpha设置为最后结果f(x)的精度。

delta设置为最后结果x的精度。

(若alpha,delta都符合设置的计算精度时,结束迭代并得

出计算结果,否则一直迭代到n次)

设置初始值:设置参数a,b分别为为3,4;迭代次数n为50次;alpha

和delta都设置为0.001。

列出计算结果:

>> gexian(f,3,4,50,0.001,0.001)

n x0 delta alpha

1 3 1 37

2.0000 2.5135 0.4865 11.1202

3.0000 2.2125 0.3010 5.0486

4.0000 2.1034 0.1092 1.5254

5.0000 2.0815 0.0219 0.2874

6.0000 2.0801 0.0014 0.0181

Elapsed time is 0.080747 seconds.

五、收敛性和时间复杂度分析

5.1 三种算法的收敛性分析

从理论上来看,二分法每次估计的范围都是前一次迭代时(a,b)区间的1/2,所以要达到千分位的精度至少应该进行10次左右的迭代;而牛顿法的收敛速度是最快的;割线法把牛顿算法中的导函数用插商代替造成了一定的误差,故收敛速度稍慢于牛顿迭代。

从实验结果来看,结果也与理论上的判断相符,在实验精度取0.001的情况下,二分法迭代次数最多,进行了14次迭代;牛顿迭代算法的次数最少,只进行了3次迭代就到达了0.001位的精度要求;割线迭代法相对于牛顿算法的迭代次数要稍多一点,进行了6次迭代。

5.2 三种算法的时间复杂度分析

我们用迭代次数n来反映算法的要解决问题的规模并作为自变量,用tic toc函数记录每次迭代所花费的时间,记录随着n的不断增大,各算法所耗费时间的变化趋势,得到如下函数图像:

二分法的渐进时间复杂度函数图像

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

牛顿法的渐进时间复杂度函数图像

割线法的渐进时间复杂度的函数图像

MATLAB实现的用二分法,割线法,牛顿迭代法求解方程的根的实验报告

从三种算法的渐进时间复杂度函数图像容易看出,随着n的不断增大是图像大致呈线性变化,说明了每次迭代所进行的计算量都是大致相当的,可以认为是三种算法都是稳定的。

图像也反映出二分法的计算时间明显大于另外两种算法,这是由于二分法每一个循环语句内都要进行求f(a),f(b),f(a)*f(b),(a+b)/2四次计算计算量大于其他两种算法;牛顿法相较于割线法虽然收敛速得更快,但每次迭代都要重新计算f(x和f’(x),相比于割线法每次只需计算一个f(x),计算量要稍大一些,所以每次迭代耗时更多。

六、其他可供使用的算法

6.1 简易牛顿法算法思想简述

简易牛顿法即将

xk 1 xk f(xk) f (xk)

中的f (xk)换成一个常数M,迭代公式为

xk 1 xk

6.2 Steffensenf迭代法算法思想简述 f(xk)M

假设我们要解方程x g(x),这个方法的迭代公式是

yk g(xk),zk g(yk),

(yk xk)2

xk 1 xk ,k 0,1,2,3,....

zk 2yk xk

本文来源:https://www.bwwdw.com/article/rc0m.html

Top