数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

合集下载

非线性方程求解

非线性方程求解

⾮线性⽅程求解基于MATLAB的⾮线性⽅程的五种解法探讨摘要:本⽂利⽤matlab软件对⾮线性⽅程解法中的⼆分法、简单迭代法、⽜顿法、割线法以及Steffensen法的数值分析⽅法的算法原理及实现⽅法进⾏了探讨。

对f x x x=+-()2ln2的零点问题,分别运⽤以上五种不同的⽅法进⾏数值实验,⽐较⼏种解法的优缺点并进⾏初步分析评价。

关键词:⼆分法、简单迭代法、⽜顿法、割线法、Steffensen法1、引⾔在很多实际问题中,经常需要求⾮线性⽅程f(x) =0的根。

⽅程f(x) =0的根叫做函数f(x)的零点。

由连续函数的特性知:若f(x)在闭区间[a,b ]上连续,且()()0f a f b<.则f(x) =0在开区间(a,b)内⾄少有⼀个实根。

这时称[a,b]为⽅程f(x) =0的根的存在区间。

本⽂主要对⾮线性⽅程的数值解法进⾏分析,并介绍了⾮线性⽅程数值解法的五种⽅法。

并设=+-.f x x x()2ln2f x在[1,2]上的图形,如图1:. 显然,函数在[1,2]之间有⼀个零点。

⾸先画出()2、计算机配置操作系统Windows 7 旗舰版内存2GB处理器AMD 4核 A6-3400M APU 1.4GHz图.13、⼆分法⼆分法的基本思想是将⽅程根的区间平分为两个⼩区间,把有根的⼩区间再平分为两个更⼩的区间,进⼀步考察根在哪个更⼩的区间内。

如此继续下去,直到求出满⾜精度要求的近似值。

设函数()f x 在区间[a,b ]上连续,且f(a)·f(b) <0,则[a,b ]是⽅程f(x) =0的根的存在区间,设其内有⼀实根,记为x*。

取区间[a,b ]的中点()2k a b x +=并计算1()f x ,则必有下列三种情况之⼀成⽴: (1) 1()f x =0,x1就是⽅程的根x*;(2)()f a .1()f x <0,⽅程的根x*位于区间[a, 1x ]之中,此时令111,a a b x ==; (3)1()f x .()f b <0,⽅程的根x*位于区间[1x ,b ]之中,此时令11a x =,1b b =。

数值分析求解非线性方程根的二分法简单迭代法和牛顿迭代法

数值分析求解非线性方程根的二分法简单迭代法和牛顿迭代法

实验报告一:实验题目一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。

二、 实验内容1、编写二分法、并使用这两个程序计算02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。

2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。

3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭代法求这个方程的最小正根。

4、用牛顿法求方程的根,精确至8位有效数字。

比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。

第1题:02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。

画图函数:function Test1()% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0r = 0:0.01:1;y = r + exp(r) - 2plot(r, y);grid on 二分法程序:计算调用函数:[c,num]=bisect(0,1,1e-4)function [c,num]=bisect(a,b,delta)%Input –a,b 是取值区间范围% -delta 是允许误差%Output -c 牛顿迭代法最后计算所得零点值% -num 是迭代次数ya = a + exp(a) - 2;yb = b + exp(b) - 2;if ya * yb>0return;endfor k=1:100c=(a+b)/2;yc= c + exp(c) - 2;if abs(yc)<=deltaa=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif abs(b-a)<deltanum=k; %num为迭代次数break;endendc=(a+b)/2;err=abs(b-a);yc = c + exp(c) - 2;牛顿迭代法程序:计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:function [y] = func1(x)y = x + exp(x) - 2;end迭代算法:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;%num为迭代次数break;endendc=p0;第2题:由题意得到算式:计算调用函数:[c,num]=newton(@func2,0.02,1e-8)程序:先用画图法估计出大概零点位置在0.02附近。

数值分析作学习总结

数值分析作学习总结

摘 要在科学工作中经常出现这类问题,我们关注求解非线性方程或非线性方程组——求x 使得f (x )=0或求得X= 使得F (X )=0。

这些方程中,至少一个变量以任意的非线性方程形式出现。

在实变量变量的实值函数这种最简单的情况下,提出的一般问题是:已知函数f :R →R ,求x 的解使得f (X )=0这里主要讨论解决这类问题的一般方法和过程。

在许多应用中可以发现非线性方程的例子。

例如在光的衍射理论中,我们需要用到方程:X-tanX=0在行星轨道的计算中我们需要开普勒方程:X-asinX=b其中a 和b 任意取值。

在科学研究和科学计算中常常碰到以上的非线性方程求解问题。

非线性方程的解一般不能解析求出。

所以数值解法显得非常重要,而数值解法在实际中的实现则更为重要。

本文将介绍几种数值解法以及Matlab 中的实现程序。

为研究非线性方程数值解,给出了二分法、简单迭代法和牛顿迭代法的Matlab 程序,并进行了近似计算。

结果表明,牛顿迭代法收敛最快。

关键词:非线性方程;Matlab 程序;二分法;迭代法;简单迭代法;弦截法。

()T1n x x x ⋅⋅⋅2,,非线性方程数值解法1 二分法设f (x)在[a,b]连续,假定f (a)<0,f (b)>0,取中点 ,检查f (x0)符号。

若f (x0)=0,则x0就是一个根;若f (x0)>0,记a为a1,x0为b1,则得有根区间[a1,b1];若f(x0)<0,记x0为a1,b为b1,则得有根区间[a1,b1]。

后两种情况都得到有根区间[a1,b1],它的长度为原区间的一半。

对[a1,b1],令 ,再用同样的方法,可得新的有根区间[a2,b2],它的长度为[a1,b1]的一半,如此反复进行下去,其中每一个区间是前一区间的一半。

有这就是方程的根。

而即为方程的近似根,且有估计误差下面用二分法求在区间[1,2]上的根.因为二分法只能求单根,首先可以搜索函数(2.2)在区间[1,2]的根的情况。

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

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

三、牛顿法计算实验
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 − ′ f (xn ) 3.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.
4.0000 2.0625 2.1250 5.0000 2.0625 2.0938 6.0000 2.0781 2.0938 7.0000 2.0781 2.0859 8.0000 2.0781 2.0820 9.0000 2.0801 2.0820 10.0000 2.0801 2.0811 11.0000 2.0801 2.0806 12.0000 2.0801 2.0803 13.0000 2.0801 2.0802 14.0000 2.0801 2.0801 elapsed time is 0.316426 seconds.

数值分析非线性方程的数值解法

数值分析非线性方程的数值解法

数值分析非线性方程的数值解法数值分析是一种应用数学方法来分析和解决数学问题的领域。

非线性方程是数值分析中一类重要的问题,其解法包括了迭代法、牛顿法、割线法等。

本文将详细介绍这些数值解法及其原理和应用。

一、迭代法迭代法是解非线性方程的一种常用数值方法。

该方法的基本思想是通过不断迭代逼近方程的根,直到达到所需精度或满足停止准则为止。

迭代法的求根过程如下:1.选择适当的初始值x0。

2. 利用迭代公式xn+1 = g(xn),计算下一个近似根。

3.重复步骤2,直到满足停止准则为止。

常用的迭代法有简单迭代法、弦截法和牛顿法。

简单迭代法的迭代公式为xn+1 = f(xn),其中f(x)为原方程的一个改写形式。

该方法的收敛性要求函数f(x)在解附近有收敛性且导数在一个区间内收敛。

弦截法的迭代公式为xn+1 = xn - f(xn) * (xn-xn-1) / (f(xn)-f(xn-1))。

该方法通过连接两个点上的函数值的割线来逼近方程的根。

牛顿法的迭代公式为xn+1 = xn - f(xn) / f'(xn),其中f'(x)为f(x)的导数。

该方法通过用切线来逼近方程的根。

二、牛顿法牛顿法是解非线性方程的一种常用迭代法。

该方法通过使用方程的导数来逼近方程的根。

迭代过程如下:1.选择适当的初始值x0。

2. 利用迭代公式xn+1 = xn - f(xn) / f'(xn),计算下一个近似根。

3.重复步骤2,直到满足停止准则为止。

牛顿法的收敛速度较快,但要求方程的导数存在且不为0。

三、割线法割线法是解非线性方程的另一种常用迭代法。

该方法通过连接两个点上的函数值的割线来逼近方程的根。

迭代过程如下:1.选择适当的初始值x0和x12. 计算下一个近似根xn+1 = xn - f(xn) * (xn-xn-1) / (f(xn)-f(xn-1))。

3.重复步骤2,直到满足停止准则为止。

割线法的收敛速度介于简单迭代法和牛顿法之间。

数值求解方法

数值求解方法

数值求解方法数值求解方法是一种通过数值计算来解决数学问题的方法。

在许多实际问题中,我们需要求解各种方程或函数的根、极值、积分等问题,而数值求解方法可以提供一种有效的途径来解决这些问题。

本文将介绍几种常见的数值求解方法,并分析其原理和应用。

一、二分法二分法是一种简单而有效的数值求解方法,它通过不断将求解区间一分为二,并根据函数值的正负判断根的位置,最终逼近根的位置。

二分法的原理是基于函数在连续区间上的性质,通过不断缩小求解区间的范围来逼近根的位置。

二分法的优点是简单易用,但收敛速度相对较慢,对于某些特殊函数可能不适用。

二、牛顿迭代法牛顿迭代法是一种通过线性逼近来求解方程的数值方法。

它通过对方程进行泰勒展开,利用切线与x轴的交点作为下一个近似解,从而逐步逼近方程的根。

牛顿迭代法的优点是收敛速度快,但对于某些复杂函数可能存在收敛性问题,需要进行合理的初始近似值选择。

三、割线法割线法是一种通过线性逼近来求解方程的数值方法,类似于牛顿迭代法。

它通过对方程进行割线近似,利用割线与x轴的交点作为下一个近似解,从而逐步逼近方程的根。

割线法的优点是相对于牛顿迭代法而言,不需要计算函数的导数,因此更加简单易用,但收敛速度较慢。

四、高斯消元法高斯消元法是一种用于求解线性方程组的数值方法。

它通过对方程组进行一系列的行变换,将方程组化为上三角形矩阵,然后通过回代求解得到方程组的解。

高斯消元法的优点是简单直观,适用于一般的线性方程组求解,但对于某些特殊的方程组可能存在奇异性或多解的问题。

五、龙贝格积分法龙贝格积分法是一种用于数值积分的方法,通过对区间进行逐步细分,并计算相应的复合梯形面积来逼近积分值。

龙贝格积分法的优点是收敛速度较快,精度较高,适用于各种类型的函数积分求解,但对于某些特殊函数可能存在收敛性问题。

六、插值法插值法是一种通过已知数据点来求解未知数据点的数值方法。

它通过构造一个插值函数,使得该函数在已知数据点上与原函数值相等,从而通过插值函数来求解未知数据点的近似值。

数值分析基本概念与方法

数值分析基本概念与方法

数值分析基本概念与方法数值分析是一种应用数学的学科,通过使用数值方法和算法来解决数学问题。

它涉及到将问题转化为数字形式,然后使用计算机进行计算和分析。

本文将讨论数值分析的基本概念和常用方法。

一、误差与收敛性在数值分析中,误差是一个重要的概念。

它指的是数值方法的近似解与真实解之间的差距。

误差可以分为截断误差和舍入误差两种类型。

截断误差是由于使用有限步骤的近似方法而引入的误差,而舍入误差是由于计算机无法存储无限精度的数字而引入的误差。

数值方法的收敛性是指随着使用更精确的近似方法,近似解逐渐接近真实解。

我们通常希望选择收敛性较好的数值方法来获得更精确的结果。

二、插值与拟合插值是一种常用的数值方法,用于根据给定的离散数据点,构建拟合曲线或曲面。

插值方法通过使用已知数据点之间的函数关系来估计未知点的值。

常见的插值方法包括拉格朗日插值和牛顿插值。

拟合是另一种常用的数值方法,用于找到一个函数或曲线,最能拟合给定的离散数据点。

拟合方法通过选择适当的函数形式和参数来实现。

最小二乘法是一种常见的拟合方法,它通过最小化数据点与拟合曲线之间的误差来确定最佳拟合。

三、数值积分数值积分是计算函数定积分的一种方法。

定积分通常用于计算曲线下面的面积或求解物理问题中的积分方程。

数值积分方法基于将定积分转化为求和或求平均值的问题。

矩形法和梯形法是最简单的数值积分方法。

矩形法将曲线下面的面积近似为由矩形组成的总面积,而梯形法将曲线下面的面积近似为由梯形组成的总面积。

辛普森法则是一种更精确的数值积分方法,它使用二次多项式逼近曲线,并通过拟合曲线下的小区间来计算积分。

四、数值微分数值微分是计算函数导数的一种方法。

导数在数学和物理中具有广泛的应用,如求解微分方程和优化问题等。

常用的数值微分方法包括前向差分法、后向差分法和中心差分法。

前向差分法使用函数在当前点和下一个点之间的斜率来近似导数。

后向差分法使用函数在当前点和上一个点之间的斜率来近似导数。

二分法、牛顿法、割线法、简易牛顿法

二分法、牛顿法、割线法、简易牛顿法

二分法、牛顿法、割线法、简易牛顿法二分法是一种简单而常用的求解方程近似解的方法。

其基本思想是将函数的定义域分为两个部分,并通过比较函数在这两个部分的取值来确定方程的解在哪一部分。

然后,再将该部分继续二分,直到找到近似解为止。

牛顿法是一种迭代求解方程根的方法。

它基于函数的局部线性逼近,通过不断更新当前的近似解,直到满足精度要求为止。

牛顿法的核心思想是利用函数的导数来不断修正当前的近似解,使得每次迭代都能更接近方程的根。

割线法是一种类似于牛顿法的迭代求解方程根的方法。

它也是基于函数的局部线性逼近,但不需要计算函数的导数。

割线法通过连接两个近似解的割线来估计方程的根,并利用割线与坐标轴的交点作为下一个近似解,不断迭代直到满足精度要求。

简易牛顿法是对牛顿法的一个简化版本。

在简易牛顿法中,不需要每次迭代都计算函数的导数,而是利用两个近似解的函数值来估计导数。

这样可以减少计算量,并在一定程度上提高计算效率。

二分法、牛顿法、割线法和简易牛顿法都是常用的求解方程近似解的方法,它们各自有着不同的特点和适用范围。

在实际应用中,我们可以根据具体的问题选择合适的方法来求解方程的近似解。

二分法适用于函数在定义域上单调且连续的情况,它的收敛速度较慢但稳定可靠。

牛顿法适用于函数在定义域上具有充分光滑的情况,它的收敛速度较快但对初值敏感。

割线法适用于函数在定义域上具有充分光滑的情况,它的收敛速度介于二分法和牛顿法之间。

简易牛顿法是对牛顿法的简化,适用于函数在定义域上具有充分光滑的情况,它的收敛速度介于割线法和牛顿法之间。

无论是二分法、牛顿法、割线法还是简易牛顿法,它们的求解过程都可以表示为迭代的形式。

通过不断更新当前的近似解,直到满足精度要求为止。

在每一次迭代中,我们都可以利用函数的信息来修正当前的近似解,使其更接近方程的根。

这种迭代的过程可以通过循环结构来实现,其中迭代的终止条件可以是近似解的精度达到要求或者迭代次数达到一定的限制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本科生实验报告实验课程数值计算方法学院名称信息科学与技术学院专业名称计算机科学与技术学生姓名学生学号指导教师实验地点实验成绩二〇一六年五月二〇一六年五月实验一非线性方程求根1.1问题描述实验目的:掌握非线性方程求根的基本步骤及方法,。

实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-1= 0 在区间 [-8,8]上的全部实根,误差限为10-6。

要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较,第2章算法思想2.1二分法思想:在函数的单调有根区间内,将有根区间不断的二分,寻找方程的解。

步骤: 1.取中点mid=(x0+x1)/22.若f(mid)=0,则mid为方程的根,否则比较与两端的符号,若与f(x0)异号,则根在[x0,mid]之间,否则在[mid,x1]之间。

3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。

2.2 简单迭代法思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。

步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。

2.计算x1,x1=f(x0).3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。

4.输出x1,即为方程的近似解。

开始输入x0,eX1=f(x0)|x1-x0|<eX1=x0;输出x1结束Noyes f 为迭代函数2.3 Newton 迭代法思想:设r 是的根,选取作为r 的初始近似值,过点做曲线的切线L ,L 的方程为,求出L 与x 轴交点的横坐标,称x 1为r 的一次近似值。

过点做曲线的切线,并求该切线与x 轴交点的横坐标,称为r 的二次近似值。

重复以上过程,得r 的近似值序列,其中,称为r 的次近似值步骤:1.计算原函数的导数f ’(x);构造牛顿迭代公式2.计算 ,若f’(x0)=0,退出计算,否则继续向下迭代。

3.若|x1-x0|满足精度要求,x1即为方程的近似解。

开始输入x0,eX1=x0-f(x0)/f(x1)|x1-x0|<eX1=x0;输出x1结束Noyesf ’(x0)=02.4弦截法思想:为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f’(x)。

步骤: 1.构造双点弦法的公式2.计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x0);3.判断f(x2)是否满足精度要求,若没有则按照上述步骤继续迭代,否则输出x2.x2即为方程的近似解。

第3章测试结果及分析测试结果函数图像函数 Y=x5-3x3+x-1二分法(表1-1,1-2,1-3)[-1.6,-1.3]k xk k xk k xk0 -1.45 5 -1.50156 10 -1.504931 -1.525 6 -1.50391 11 -1.5052 -1.4875 7 -1.50508 12 -1.505043 -1.50625 8 -1.50449 13 -1.505064 -1.49688 9 -1.50479 14 -1.50507表1-1区间[-1.2,-0.9]k xk k xk k xk0 -1.05 5 -0.998437 10 -1.000051 -0.975 6 -1.00078 11 -0.9999762 -1.0125 7 -0.999609 12 -1.000013 -0.99375 8 -1.0002 13 -0.9999944 -1.00312 9 -0.999902 14 -1表1-2区间[1.5,1.8]表1-3简单迭代法(表2-1.2-2.2-3)初值-1.5表2-1初值-1表2-2表2-3牛顿迭代法(表3-1.3-2,3-3)初值-1.5 结果 x=-1.50507表3-1初值-1 结果 x=-1.50507表3-2初值1.6 结果 x=1.69028表3-3双点弦法(表4-1.4-2,4-3)区间[-1.6,-1.3] 结果 x=-1.50507表4-1区间[-1.2,-0.9] 结果 x= -1表4-2区间[1.5,1.8] 结果 x=1.69028表4-3从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦截法的收敛速度。

二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然收敛高,但要求导数,计算的复杂度高!双点弦法随稍慢于牛顿跌代法,可以用差商代替牛顿迭代法中的导数,降低了计算的复杂度!附录:源程序清单#include<iostream>#include<math.h>using namespace std;double foot =0.3;//定义寻根步长int a=-8,b=8;double*rn=new double[5];//解的区间double*r =new double[5];// 方程近似解int m=0;//根的个数int x_count;double precision=0.000001;//精度要求//函数的表达式(x^5-3x^3+x-1)double f(double x){return(pow(x,5)-3*pow(x,3)+x-1);}void init(){//根据函数图像确定根的区间和迭代初值r[0]=-1.5;r[1]=-1;r[2]=1.6;rn[0]=-1.6;rn[1]=-1.2;rn[2]=1.5;}//寻找根的区间void search(){ //若没有给出区间和初值,进行逐步搜索有根区间for(int i=0;i*foot-8<8;i++){if(f(i*foot-8)*f((i+1)*foot-8)<0){rn[m]=i*foot-8;m++;}}}//=====================二分法==========================double Dichotomy (double a,double b){double mid=0;int i=0;while(fabs(b-a)>precision){mid =(a+b)/2;if(f(a)*f(mid)<=0) b=mid; //判断与端点函数值得符号else a=mid;cout<<mid<<endl;}r[x_count++]=mid;return mid;//返回最终结果}//================简单迭代法=========================//构造迭代公式double fitera(double x){double result=0;double xx=3*pow(x,3)-x+1;if(xx<=0){xx=-xx;return pow(xx,1.0/5.0)*(-1);}elsereturn pow(xx,1.0/5.0);}//简单迭代double itera(double x0){cout<<x0<<endl;double x1=fitera(x0);while(fabs(x1-x0)>precision){x0=x1;x1=fitera(x0); //没有到达精度要求继续迭代cout<<x1<<endl;}return x1;//返回最终结果}//===============牛顿迭代法==================//计算函数的一阶导数fderivatives(double x)double fderivatives(double x){return5*pow(x,4)-9*(x,2)+1;}//构造牛顿迭代公式newtonitera(double x)double newtonitera(double x){if(fderivatives(x)==0)return-1;//若导数为0 则停止迭代elsereturn x-(f(x)/fderivatives(x));}//牛顿迭代double newton(double x0){double x1=newtonitera(x0);while(fabs(x1-x0)>precision){x0=x1;if(newtonitera(x0)==-1)break;x1=newtonitera(x0); //继续迭代cout<<x1<<endl;}return x1;//返回最终结果}//==================双点弦法迭代======================//构造弦截法的迭代公式double twopointchord_f(double x0,double x1){return x1-(f(x1)/(f(x1)-f(x0)))*(x1-x0);}//双点弦法迭代double twopointchord(double x0,double x1){double x3=twopointchord_f(x0,x1);cout<<x3<<endl;while(fabs(f(x3))>precision){cout<<"f(x3)"<<f(x3)<<endl; //输出x3的函数值x0=x1;x1=x3;x3=twopointchord_f(x0,x1); //没有到达精度要求继续迭代// cout<<x3<<endl;}cout<<f(x3)<<endl;return x3;//返回最终结果}//测试void main(){init(); //初始化区间和迭代初值/* 测试代码输出每次的迭代结果和最终结果cout<<"------------------------二分法----------------------"<<endl;for(int i =0;i<3;i++){double result=0;cout<<"有根区间为["<<rn[i]<<" "<<rn[i]+foot<<"]"<<endl;result=Dichotomy(rn[i],rn[i]+foot); //将区间端点带入公式cout<<"求得近似解为"<<result<<endl;}cout<<"------------------------迭代法----------------------"<<endl;for(i =0;i<3;i++){double result=0;cout<<"有根区间为["<<rn[i]<<" "<<rn[i]+foot<<"]"<<endl;double x0 =r[i]; //取得初值result=itera(x0); //带入公式cout<<"求得近似解为"<<result<<endl;}cout<<"------------------------牛顿迭代----------------------"<<endl;for(i =0;i<3;i++){double result=0;cout<<"有根区间为["<<rn[i]<<" "<<rn[i]+foot<<"]"<<endl;double x0 =r[i]; //取得初值result=newton(x0); //带入公式cout<<"求得近似解为"<<result<<endl;}cout<<"------------------------弦截法----------------------"<<endl;for(i =0;i<3;i++){double result=0;cout<<"有根区间为["<<rn[i]<<" "<<rn[i]+foot<<"]"<<endl; result=twopointchord(rn[i],rn[i]+foot); //将区间端点带入公式cout<<"求得近似解为"<<result<<endl;}/*。

相关文档
最新文档