当前位置:文档之家› 二分法和牛顿迭代法求解非线性方程的比较及应用

二分法和牛顿迭代法求解非线性方程的比较及应用

二分法和牛顿迭代法求解非线性方程的比较及应用
二分法和牛顿迭代法求解非线性方程的比较及应用

二分法和牛顿迭代法求解非线性方程的比较及应用

摘要:本文基于计算机matlab和c语言编程去分析两者的计算复杂性,并深入探讨了两种方法的优缺点。最后,通过将两种方法结合起来解决非线性方程的求解问题,取得了显著地效果。同时,这也再次证明了方法组合解决问题的高效性。

关键词:二分法;牛顿迭代法;非线性方程

中图分类号:o242 文献标志码:b 文章编号:1674-9324(2013)25-0139-01

求解方程的近似根,一般需要解决两个问题:

1.根的隔离。即找出有根区域,使得在一些小区间中方程只有一根(或一对共轭复根)以便获取各根的较粗糙的近似值。

2.近似根的精确化。即用求根的数值方法,使求得的近似根逐步精确化,直到获得一定精度的近似根。

一、二分法和牛顿迭代法的基本思想

1.二分法。一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c叫做函数f(x)的零点。解方程即要求f(x)的所有零点。假定f(x)在区间(x,y)上连续,先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求[f(a+b)/2],现在假设f(a)0,a=a,从①开始继续使用中点函数值判断。如果[f(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,注:(a+b)/2<=b,从①开始继续使用中点函数值判断。这样就可以不断接近零点。通过每次把

二分法及迭代法求解非线性方程根

二分法及迭代法求解非线性方程根 班级:姓名:方学号:日期: 一、实验目的 1、熟悉二分法及迭代法求解非线性方程根的数值算法; 2、用matlab软件实现二分法及迭代法,掌握迭代法的收敛性和收敛速度问 题及其加速方法; 二、基本理论及背景 1、牛顿迭代法具有平方收敛的速度,所以在迭代过程中只要迭代几次就会得到很精确的解。这是牛顿迭代法比简单迭代法优越的地方,但是选定的初值要接近方程的解,否则有可能得不到收敛的结果,再者,牛顿迭代法计算量比较大。因每次迭代除计算函数值外还要计算微商值。 2、牛顿迭代理论推导:设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)- f(x(n))/f'(x(n)),称为r的n+1次近似值; 3、参考《二分法求非线性方程根》,实现二分算法,完成下面的题目: 求方程○1的根,精度至少达到10-6; 比较迭代下列迭代法求解○1中方程根的收敛性: ○2,; 用牛顿法设计迭代函数求解○1中方程的根(精度至少达到10-6),并与○2中收敛的迭代法比较收敛的速度。。 三、算法设计及实现 1、设计:方程○1function f=fun1(x) f=exp(x)-x-3;; ○2function y=Exp2(x) y=exp(x)-3; function y=Exp3(x) y=log(x+3); 牛顿迭代:

MAAB计算方法迭代法牛顿法二分法实验报告

姓名 实验报告成绩 评语: 指导教师(签名) 年 月 日 说明:指导教师评分后,实验报告交院(系)办公室保存。 实验一 方程求根 一、 实验目的 用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。并比较方法的优劣。 二、 实验原理 (1)、二分法 对方程0)(=x f 在[a ,b]内求根。将所给区间二分,在分点 2a b x -=判断是否0)(=x f ;若是,则有根2a b x -=。否则,继续判断是否0)()(

+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(') (00x f x f 。取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。迭代公式为:=+1 k x -0x )(')(k k x f x f 。 三、 实验设备:MATLAB 软件 四、 结果预测 (1)11x = (2)5x = (3)2x =0,09052 五、 实验内容 (1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超 过3105.0-?。 (2)、取初值00=x ,用迭代公式=+1 k x -0x )(') (k k x f x f ,求方程0210=-+x e x 的近似根。要求误差不超过3105.0-?。 (3)、取初值00=x ,用牛顿迭代法求方程0210=-+x e x 的近似根。要求误差 不超过3105.0-?。 六、 实验步骤与实验程序 (1) 二分法 第一步:在MATLAB 软件,建立一个实现二分法的MATLAB 函数文件如下: function x=agui_bisect(fname,a,b,e) %fname 为函数名,a,b 为区间端点,e 为精度 fa=feval(fname,a); %把a 端点代入函数,求fa fb=feval(fname,b); %把b 端点代入函数,求fb if fa*fb>0 error('两端函数值为同号'); end

牛顿迭代法

牛顿迭代法 李保洋 数学科学学院信息与计算科学学号:060424067 指导老师:苏孟龙 摘要:牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,即牛顿迭代法.迭代法是一种不断用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“牛顿迭代法”属于近似迭代法,本文主要讨论的是牛顿迭代法,方法本身的发现和演变和修正过程,避免二阶导数计算的Newton迭代法的一个改进,并与中国古代的算法,即盈不足术,与牛顿迭代算法的比较. 关键词:Newton迭代算法;近似求解;收敛阶;数值试验;中国古代数学; 九章算术;Duffing方程;非线性方程;收敛速度;渐进性 0 引言: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“二分法”和“牛顿迭代法”属于近似迭代法. 迭代算法是用计算机解决问题的一种基本方法.它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值.具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制. (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败. 所以利用迭代算法解决问题,需要做好以下三个方面的工作: 1、确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 2、建立迭代关系式.所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 3、对迭代过程进行控制,在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地重复执行下去.迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定.对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件. 1牛顿迭代法:

用二分法求非线性方程实根

A-1 用二分法求非线性方程实根 本实验用二分法求方程f (x) = x3 ?2x ?5 =0 在区间[2,3]内的根。 源程序: #include #include #include float f(float x) { float a; a=x*x*x-2*x-5; return a; } /*求函数值,如果求其它函数,只需改成其它函数即可*/ main() { float a,b,,e,x; /* a,b 分别表示有根区间的左、右端点, e 是精度要求,x 区间中点值*/ clrscr(); printf(" \n please input data a ="); scanf("%f",&a); printf(" \n please input data b="); scanf("%f",&b); printf("\n please input data eps="); scanf("%f",&e); if(f(a)*f(b)<0) { while(f(x)!=0) { x=(a+b)/2; if(f(x)*f(a)<0) { b=x; if(fabs(b-a)

} else printf("\ not root! afresh input\n"); /*表示[a,b] 区间无根,重新选择有根区间*/ getch(); teturn(x); } 计算结果: please input data a = 2 please input data b = 3 please input data eps= 0.00001 the root of f(x)=0 is x= 2.094555

数值分析报告-二分法和牛顿法方程求根

《数值分析》实验报告一 姓名: 周举 学号: PB09001046

实验一 一、实验名称 方程求根 二、实验目的与要求: 通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点; 比较二者的计算速度和计算精度。 三、实验内容: 通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。 (一)二分法 算法:给定区间[a,b],并设f (a )与f (b )符号相反,取δ为根的容许误差,ε为值的容许误差。 (1)令c=(a+b)/2 (2)如果(c-a)< δ或)(c f <ε,则输出c ,结束;否则执行(3) (3)如果f(a)f(c)<0,则令)()(,c f b f c b ←←;否则,则令 )()(,c f a f c a ←←,重复(1),(2),(3)。 (二)牛顿迭代法:给定初值0x ,ε为根的容许误差,η为)(x f 的容 许误差,N 为迭代次数的容许值。 (1)如果)(x f <η或迭代次数大于N ,则算法结束;否则执行(2)。

(2)计算)('/)(0001x f x f x x -= (3)若 < 或 < ,则输出 ,程序结束;否则执行(4)。 (4)令 = ,转向(1)。 四、实验题目与程序设计 1、二分法 3.1.1、用二分法求方程 a. f(x)= x x tan 1--在区间[0,π/2]上的根, c. f(x)=6cos 22-++-x e x x 在区间[1,3]上的根。 源程序: 3.1.1.a #include #include void main() { float a,b;double c,y,z; printf("plese input two number a and b:\n"); scanf("%f%f",&a,&b); c=(a+b)/2; y=1/c-tan(c); printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y); while(fabs(b-a)>0.00001|| fabs(y)>0.00001) { z=1/a-tan(a); if(z*y<0) b=c; else a=c; c=(a+b)/2; y=1/c-tan(c); printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y); } } x x 01-ε)(1x f ηx 1x 0x 1

用二分法求方程的近似解-经典例题及答案

例1:利用计算器,求方程0122=--x x 的一个近似解(精确到0.1). 【解】设2()21f x x x =--, 先画出函数图象的简图. (如右图所示) 因为 (2)10,(3)20f f =-<=>, 所以在区间(2,3)内,方程2210x x --=有一解,记为1x .取2与3的平均数2.5,因为 (2.5)0.250f =>, 所以 12 2.5x <<. 再取2与2.5的平均数2.25,因为(2.25)0.43750f =-<, 所以 12.25 2.5x <<. 如此继续下去,得 1(2)0,(3)0(2,3) f f x <>?∈1(2)0,(2.5)0(2,2.5) f f x <>?∈1(2.25)0,(2.5)0(2.25,2.5) f f x <>?∈1(2.375)0,(2.5)0(2.375,2.5) f f x <>?∈1(2.375)0,(2.4375)0(2.375,f f x <>?∈ 2.4375),因为2.375与2.4375精确到0.1的 近似值都为2.4,所以此方程的近似解为 1 2.4x ≈. 利用同样的方法,还可以求出方程的另一个近似解. 点评:①第一步确定零点所在的大致区间),(b a ,可利用函数性质,也可借助计算机或计算器,但尽量取端点为整数的区间,尽量缩短区间长度,通常可确定一个长度为1的区间; 如此列表的优势:计算步数明确,区间长度小于精度时,即为计算的最后一步. 例2:利用计算器,求方程x x -=3lg 的近似解(精确到0.1). 分析:分别画函数lg y x =和3y x =- 的图象,在两个函数图象的交点处,函数值相等.因此,这个程x x -=3lg 的解.由函数lg y x =与 点的横坐标就是方

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

本科生实验报告 实验课程数值计算方法 学院名称信息科学与技术学院 专业名称计算机科学与技术 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年五月二〇一六年五月

实验一非线性方程求根 1.1问题描述 实验目的:掌握非线性方程求根的基本步骤及方法,。 实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-1= 0 在区间 [-8,8]上的全部实根,误差限为10-6。 要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较, 第2章算法思想 2.1二分法 思想:在函数的单调有根区间内,将有根区间不断的二分,寻找方程的解。 步骤: 1.取中点mid=(x0+x1)/2 2.若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,e X1=f(x0)|x1-x0|

全国一等奖用二分法求方程的近似解教学设计

用二分法求方程的近似解 一、教学内容分析 本节课选自《普通高中课程标准实验教科书数学1必修本(A版)》的第三章3.1.2用二分法求方程的近似解.本节课要求学生根据具体的函数图象能够借助计算机或信息技术工具计算器用二分法求相应方程的近似解,了解这种方法是求方程近似解的常用方法,从中体会函数与方程之间的联系;它既是本册书中的重点内容,又是对函数知识的拓展,既体现了函数在解方程中的重要应用,同时又为高中数学中函数与方程思想、数形结合思想、二分法的算法思想打下了基础,因此决定了它的重要地位. 二、学生学习情况分析 学生已经学习了函数,理解函数零点和方程根的关系, 初步掌握函数与方程的转化思想.但是对于求函数零点所在区间,只是比较熟悉求二次函数的零点,对于高次方程和超越方程对应函数零点的寻求会有困难.另外算法程序的模式化和求近似解对他们是一个全新的问题. 三、设计思想 倡导积极主动、勇于探索的学习精神和合作探究式的学习方式;注重提高学生的数学思维能力,发展学生的数学应用意识;与时俱进地认识“双基”,强调数学的内在本质,注意适度形式化;在教与学的和谐统一中体现数学的文化价值;注重信息技术与数学课程的合理整合. 四、教学目标 通过具体实例理解二分法的概念,掌握运用二分法求简单方程近似解的方法,从中体会函数的零点与方程根之间的联系及其在实际问题中的应用;能借助计算器用二分法求方程的近似解,让学生能够初步了解逼近思想;体会数学逼近过程,感受精确与近似的相对统一;通过具体实例的探究,归纳概括所发现的结论或规律,体会从具体到一般的认知过程. 五、教学重点和难点 1.教学重点:用“二分法”求方程的近似解,使学生体会函数零点与方程根之间的联系,初步形成用函数观点处理问题的意识.2.教学难点:方程近似解所在初始区间的确定,恰当地使用信息技术工具,利用二分法求给定精确度的方程的近似解. 六、教学过程设计 (一)创设情境,提出问题 问题1:在一个风雨交加的夜里,从某水库闸房到防洪指挥部的电话线路发

二分法和牛顿法求解非线性方程(C语言)

(1)二分法求解非线性方程: #include #include #define f(x)((x*x-1)*x-1) void main() {float a,b,x,eps; int k=0; printf("intput eps\n");/*容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f,%f",&a,&b); if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do {x=(a+b)/2; k++; if(f(a)*f(x)<0)/*如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x; else if(f(a)*f(x)>0)/*否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2;/*取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f,k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721,k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x)/*定义函数f(x)*/ {return((-3*x+4)*x-5)*x+6;} float f1(float x)/*定义函数f(x)的导数*/

用二分法求方程的近似解-经典例题及答案上课讲义

用二分法求方程的近似解-经典例题及答案

例1:利用计算器,求方程X 2 2x 1 0的一个近似解(精确到0.1) 【解】设f (x) x 2 2x 1, 先画出函数图象的简图.'i (如右 图所示) 丨 因为 ; f(2) 1 0, f (3) 2 0, 所以在区间(2,3)内,方程x 2.5,因为 f (2.5) 0.25 0, 所以 2人 2.5. 再取2与2.5的平均数2.25,因为f(2.25) 0.4375 0, 所以2.25 治 2.5. 如此继续下去,得 f(2) 0, f(3) 人(2,3) f(2) 0, f(2.5) 0 捲(2,2.5) f(2.25) 0, f (2.5) 0 x 1 (2.25, 2.5) f (2.375) 0, f (2.5) 0 x 1 (2.375,2.5) f (2.375) 0, f (2.4375) 0 为(2.375, 2.4375),因为 2.375与 2.4375精确到 0.1的近似值都为2.4,所以此方程的近似解为 洛 2.4 . 利用同样的方法,还可以求出方程的另一个近似解 . 点评:①第一步确定零点所在的大致区间(a,b),可利用函数性质,也可借助计算 机或计算器,但尽量取端点为整数的区间,尽量缩短区间长度,通常可确定一 个长度为1的区间; ②建议列表样式如下: 零点所在 区 间 区间中点函数 值 区间长 度 [2,3] f(2.5) 0 1 [2,2.5] f (2.25) 0 0.5 [2.25,2.5] f (2.375) 0 0.25 [2.375,2.5] f (2.4375) 0.125 如此列表的优势:计算步数明确,区间长度小于精度时,即为计算的最后一 步. 1 0有一解,记为x 1.取2与3的平均数 例 2:利用计算器,求方程lgx 3 x 的近似解(精确到0.1) 1-- 3 4 I I 斗- 3-' 分析:分别画函数y lg x 和y 3 x

数值分析——二分法和牛顿法

二分法和牛顿法的比较 二分法的基本思想是对有根区间[a,b]逐次分半,首先计算区间[a,b]的中间点x0,然后分析可能出现的三种情况:如果f(x0)f(a)<0,则f(x)在区间[a,x0]内有零点;如果f(x0)f(b)<0,则f(x)在区间[x0,b]内有零点;如果f(x0)=0,则x0是f(x)在区间[a,b]内所求零点。但是二分法的缺点是收敛速度慢且不能求复根。牛顿迭代法的基本思想是将方程f(x)=0中函数f(x)线性化,以线性方程的解逼近非线性方程的解其迭代函数为) (') ()(x f x f x x -=?。牛顿迭代法的缺点是可能发生被零除错误,且可能出现死循环。 用二分法和牛顿法分别计算多项式02432 3 =-+-x x x 的解。该多项式的解为1、1+i 和1-i ,使用二分法计算时,区间为(-1,2),使用牛顿法计算时取初始值为0。误差都为0.0001。 编程如下 二分法(erfen.m): syms x ; fun=x^3-3*x^2+4*x-2; a=-1; b=2; d=0.0001; f=inline(fun); e=b-a; k=0; while e>d c=(a+b)/2; if f(a)*f(c)<0 b=c; elseif f(a)*f(c)>0 a=c; else a=c;b=c; end e=e/2; k=k+1; end k x=(a+b)/2 牛顿法(newton.m): function [k,x,wuca] = newton() k=1; x0=0; tol=0.0001; yx1=fun(x0); yx2=fun1(x0); x1=x0-yx1/yx2; while abs(x1-x0)>tol x0=x1; yx1=fun(x0); yx2=fun1(x0); k=k+1; x1=x1-yx1/yx2; end k x=x1 wuca=abs(x1-x0)/2 end function y1=fun(x) y1=x^3-3*x^2+4*x-2; end function y2=fun1(x) y2=3*x^2-6*x+4; end 分析结果得知,在相同的误差精度下,二分法需要计算15次,而牛顿法只需计算5次,得知牛顿法比二分法优越。

二分法非线性方程求解

1、编程实现以下科学计算算法,并举一例应用之(参考书籍《精通MATLAB 科学计算》,王正林等编著,电子工业出版社,2009年) “二分法非线性方程求解” 二分法的具体求解步骤如下。 (1)计算函数f(x)在区间[a,b]中点的函数值f((a+b)/2),并作下面的判断: 如果0)2 () (<+b a f a f ,转到(2); 如果0)2( )(>+b a f a f ,令 2b a a +=,转到(1); 如果 0)2()(=+ b a f a f ,则 2b a x +=为一个跟。 (2)如果 ε<+-|2| b a a (ε为预先给定的精度),则4 3a b x +=为一个根,否则令2 b a b +=,转到(1)。 在MATLAB 中编程实现的二分法函数为:HalfInterval 。 功能:用二分法求函数在某个区间上的一个零点。 调用格式:root=HalfInterval(f,a,b,eps). 其中,f 函数名; a 为区间左端点; b 为区间右端点; eps 为根的精度; root 为求出的函数零点。 二分法的MATLAB 程序代码如下: function root=HalfInterval(f,a,b,eps) %二分法求函数f 在区间[a,b]上的一个零点 %函数名:f %区间左端点:a %区间右端点:b %根的精度:eps %求出的函数零点:root if (nargin==3) eps=1.0e-4;

end f1=subs(sym(f),findsym(sym(f)),a); %两端点的函数值f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0) root=b; end if(f1*f2>0) disp('两端点函数值乘积大于0!'); return; else root=FindRoots(f,a,b,eps); %调用求解子程序end function r=FindRoots(f,a,b,eps) f_1=subs(sym(f),findsym(sym(f)),a); f_2=subs(sym(f),findsym(sym(f)),b); mf=subs(sym(f),findsym(sym(f)),(a+b)/2); %中点函数值if(f-1*mf>0) t=(a+b)/2; r=FindRoots(f,t,b,eps); %右递归 else if(f_1*mf==o) r=(a+b)/2; else if(abs(b-a)<=eps) r=(b+3*a)/4; %输出根 else s=(a+b)/2; r=FindRooots(f,a,b,eps); %左递归 end end end 流程图:

九、解非线性方程组的逐步搜索方法和二分法

一、编写函数作图的程序,通过图形求出方程的近似解。 1、>> clear >> syms x y >> x=-10:0.1:10; >> y=2.*x.*sin(x)-3; >> plot(x,y); >> grid >> gtext('y=2.*x.*sin(x)-3') 2、>> clear >> syms x y1 y2 >> x=0:0.1:10; >> y1=2.*sin(x); >> y2=3./x; >> plot(x,y1,x,y2); >> grid >> gtext('y1=2sin(x),y2=3/x')

3、>> clear >> syms x y >> x=-2:0.1:4; >> y=4.*x.^5-8.*x.^4-26.*x.^3+30; >> plot(x,y); >> grid >> gtext('y=4*x^5-8*x^4-26*x^3+30')

>> x=solve('4*x^5-8*x^4-26*x^3+30=0','x'); >> x1=double(x) x1 = 1.0000 3.7117 -1.9244 -0.3936 + 0.9461i -0.3936 - 0.9461i 二、用逐步搜索的方法求解。 function [k,r]=zhubuss(a,b,h,tol) X=a:h:b;Y=funs(X); n=(b-a)/h+1;m=0; X(n+1)=X(n);Y(n+1)=Y(n); for k=2:n X(k)=a+k*h; Y(k)=funs(X(k)); sk=Y(k)*Y(k-1); if sk<=0 m=m+1; r(m)=X(k); end xielv=(Y(k+1)-Y(k))*(Y(k)-Y(k-1)); if (abs(Y(k))

牛顿法和割线法

作业十(第五章):1. 在区间(0,1.5)上分别用二分法、牛顿法和割线法编程求下面的函数的零点,精度要求10-10。 22 ()=cos(2) f x x x 二分法 function [X]=bisection(fx,xa,xb,n,delta) % 二分法解方程 % fx是由方程转化的关于x的函数,有fx=0。 % xa 解区间上限 % xb 解区间下限 %解区间人为判断输入 % n 最多循环步数,防止死循环。 %delta 为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); for i=1:n xc=(xa+xb)/2;x=xc;fc=eval(fx);

X=[i,xc,fc]; if fc*fa<0 xb=xc; else xa=xc; end if (xb-xa)

return end while k<=m x=x0;g=eval(diff(fx)); x1=x0-F/g; x=x1;F=eval(fx);k=k+1; if abs(F)<=e X=[x1 F k];return end if k>m fprintf('牛顿法迭代M次没有找到方程的根') return end x0=x1; end fprintf('\n%s%.4f\t%s%d','X=',X,'k=',k) %输出结果牛顿法结果: 迭代5次结果0.5149 割线法:function [X]=gx9(fx,x0,x1,m,e)

二分法 牛顿迭代法

2014级硕士研究生数值分析上机实习 (第一次) 姓名:乔永亮 学号:14S030125 学院:船舶与海洋工程学院 实习题目:分别用二分法和Newton 迭代法求方程02010223=-++x x x 的根. 实习目的:掌握两种解法,体会两种解法的收敛速度. 实习要求:用C 程序语言编程上机进行计算,精确到8位有效数字. 报告内容: 1. 确定实根的个数以及所在区间. 解:对函数3 2 ()21020f x x x x =++-求导,得2 ()34100f x x x '=++=。 易知()0f x '>恒成立,所以函数(x)f 没有极值,只有一个实根。又可以知道(1)0f <,(2)0f >方程在区间(1,2)有一个实根,且为奇数重根,可以二分法和Newton 求解 2. 将最后两次计算结果填入下表(保留8位数字): 3. 实习过程中遇到哪些问题?如何解决?有何心得体会? 在编程的过程中由于对基本计算原理的理解有一定不足,同时对编程语言的不熟悉,导致在编程过程中错误百出,耗费了大量时间。但是通过课本以及网络对所需知识的不断学习,通过尝试不同的方法,最终还是得到了几种不同的思路与方法。通过这次编程,深深的感受到自己的不足,同时也明白了数学与计算机编程的紧密结合,不努力提高自己在当今社会就要被淘汰。

4. 两种解法的计算程序(此页写不下时可以加页): 二分法(Fortran 语言) program Analysis1 real::a,b,c,m real::fa,fc a=1. b=2. m=0.0001 !-------------------- do while(abs(b-a)>=m) c=(a+b)/2 fa=a**3+2.*a*a+10.*a-20 fc=c**3+2.*c*c+10.*c-20 if(fa*fc<0) then b=c else a=c end if write(*,"(f10.7)")c end do pause end program Anslysis1 牛顿迭代法(Fortran语言) program Analysis2 implicit none !定义变量---------------------------------------------------------------external f,df real m,x0,x1,f,df integer i !初始化变量-------------------------------------------------------------m=0.0001 x0=1.5 !牛顿迭代法-------------------------------------------------------------do while(abs(f(x0))>=m) x1=x0-f(x0)/df(x0) x0=x1 i=i+1 write(*,"(i4,f10.7)")i,x0 end do

用二分法求方程的近似解

用二分法求方程的近似解(1) 【教学目标】1.使学生理解利用二分法求方程的近似解的思想方法,会用二分法求某些方程的近似解 2.通过本节内容的学习,让学生体会到在现实世界中,等是相对的,而不等是绝对的,这样可以加深对数学的理解. 【学习指导】我们已经学过一元一次方程、一元二次方程等方程的解法,并掌握了一些方程的求根公式.实际上,大部分方程没有求根公式,那么,这些方程怎么解?学完这一课,你就会知道利用方程的根与函数的零点的关系求方程的实数解(近似解)了. 本节的重点就是利用二分法求方程的近似解,所谓二分法就是:对于在区间[a,b]上连续不断、且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而和到零点近似值的方法. 【例题精析】 例1.借助计算机或计算器,用二分法求函数f(x)= x3-5x2-4x+2的一个零点,精确到0.05. 【分析】先用大范围法寻找零点所在的区间,然后不断使用二分法,逐步缩小区间,直至达到精度的要求. 【解法】先作出x与f(x)的对应值表,并试图找出一个根所在的区间: 通过举值,发现函数在(0,1)与(5,6)内都至少有一个零点,现不妨求(0,1)内的一个零点.

令x1=0.5,f(0.5)= -1.125.因为f(0)·f(0.5)<0,所以零点x0∈(0,0.5).令x2=0.25,f(0.25)≈0.7.因为f(0.25)·f(0.5)<0,所以零点x0∈(0.25,0.5). 令x3=0.375,f(0.375)≈-0.15.因为f(0.375)·f(0.25)<0,所以零点x0∈(0.25,0.375). 令x4=0.3125,f(0.3125)≈0.29.因为f(0.375)·f(0. 3125)<0,所以零点x0∈(0.3125,0.375). 令x5=0.359375,f(0.359375)≈-0.04.因为f(0.359375)·f(0.3125)<0,所以零点x0∈(0.3125,0.359375). 由于|0.359375-0.3125|=0.047<0.05, 此时区间(0.3125,0.359375)的两个端点精确到0.05的近似值都是0.336,所以函数的一个零点为0.336. 【评注】①选好初定区间是使用二分法求近似解的关键.选取初定区间的方法有多种,常用方法有试验估计法,数形结合法,函数单调性法,函数增长速度差异法等等.②本题还有两个零点,你能把它独立求解出来吗?(答案为-1,5.646.) 例2.(师生共同探究)概括用二分法求方程的近似解的基本程序. 【分析】通过对例1的研究,希望能够对解决问题的方法进行提炼,而这一点切不可以由老师包办代替,要通过师生的合作探究解决问题.【解法】(1)在同一坐标系中分别作出两个简单函数的图象,注意两个图象与x轴的交点坐标; (2)估算出第一个解的区间(x1,x2),(x1<x2);

二分法求解单变量非线性方程及其应用与实现(精)

二分法求解单变量非线性方程及其应用与实现 论文作者:任珊https://www.doczj.com/doc/355518984.html, 2010-10-27 20:32:00 论文关键词:二分法单变量非线性方程收敛性误差 论文摘要:本文主要通过一个实例来研究单变量非线性方程f(x)=0的二分法求解及此方法的收敛性,根据误差估计确定二分次数并进行求解。同时实现matlab和C语言程序编写。从而掌握过程的基本形式和二分法的基本思想,在以后的学习过程中得以应用。 1. 引言 在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了我们迫切需要解决的问题。近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。我们知道,对于单变量非线性方程f(x)=0,一般都可采用迭代法求根,由此产生了二分法。 2. 二分法 一般地,对于函数f(x),如果存在实数c,当x=c时f(c)=0,那么把x=c叫做函 数f(x)的零点。 解方程即要求f(x)的所有零点。 先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求 f[(a+b)/2], 现在假设f(a)<0,f(b)>0,aa,从①开始继续使用中点函数值判断。 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2=>b,从①开始 继续使用中点函数值判断。 这样就可以不断接近零点。

二分法和牛顿迭代法求解方程的比较

二分法和牛顿迭代法求解方程的比较 200822401018 徐小良 一、问题叙述 求解1232cos 0x x -+=的解;通过编写matlab 程序分别用分析二分法和牛顿迭代法求解方程,通过两种方法的比较,分析二者求解方程的快慢程度。 二、问题分析 由matlab 画图命令,容易得到此方程解的范围为(2,4);两种迭代方法,在使用相同的误差(0.00001)的情况下,得出matlab 迭代次数,通过次数的比较得出二者求解速度快慢比较。 三、实验程序及注释 (1)、二分法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; a=2;b=4; %求解区间; er=b-a;ya=f(a);k=0;er0=0.00001; %误差分析; while er>er0 x0=.5*(a+b); y0=f(x0); if ya*y0<0 b=x0; %二分法求解程序; else a=x0; ya=y0; end disp([a,b]);er=b-a;k=k+1 %显示各个区间值和求解次数; end disp([a,b]); %显示最后一个区间值; (2)、牛顿迭代法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; b=3;a=4;k=0; %求解区间; y0=f(b);y=f(a); while abs(b-a)>0.00001 t=a-y*(a-b)/(y-y0); b=a;y0=y; %牛顿迭代法求解程序; a=t;y=f(a); k=k+1; disp([b,a]);k %显示各个区间值和求解次数; end disp([b,a]); %显示最后一个区间值;

用二分法求方程的近似解经典例题及答案

例1:利用计算器,求方程 x 2 2x 1 0的一个近似解(精确到 0.1). 2 与 2.5 的平均数 2.25,因为 f(2.25) 0.4375 2.5. x-i 2.4. 利用同样的方法,还可以求出方程的另一个近似解 点评:①第一步确定零点所在的大致区间 (a, b),可利用函数性质,也可借助计算机或计算器, 但尽量取端点为整数的区间,尽量缩短区间长度,通常可确定一个长度为 1的区间; ②建议列表样式如下: 零点所在 区 间 区间中点函数值 区间长度 1 0.5 0.25 0.125 如此列表的优势:计算步数明确,区间长度小于精度时,即为计算的最后一步. 例2:利用计算器,求方程Igx 3 x 的近似解(精确到0.1). 数图象的交点处,函数值相等?因此,这个 程lg x 3 x 的解.由函数y lg x 与 以发现,方程Igx 3 x 有惟一解,记为为, 【解】设f (x) x 2 2x 1,卜 I 先画出函数图象的简图 V (如右图所示) 因为 f(2) 1 0, f (3) 2 ° 入 所以在区间(2,3)内, 方程 X 2叫 f(2.5) 0.25 所以 2 x 1 2.5. 0 , x ,.取2与3的平均数 2.5,因为 再取 所以 如此继续下去,得 f(2) 0, f(3) f(2.25) f (2.375) 近似值都为 0, f (2.5) 0 0, f (2.4375) 2.4,所以此方程的近似解为 (2,3) f(2) 0, f(2.5) x 1 (2.25, 2.5) f (2.375) 0, f (2.5) 0 0 x . (2,2.5) (2.375, 2.5) 人(2.375, 2.4375),因为 2.375与 2.4375精确到 0.1 的 X i 2.25 x , 分析:分别画函数y 的图象,在两个函 点的横坐标就是方 y 3 x 的图象可 lg x 和 y 3 x 丁 1 0有一解,记为 3斗

二分法求非线性方程的数值解

二分法求非线性方程的数值解 function [x,k] = bisec( f,a,b,ep ) %f:f(x)=0的函数,a,b:[a,b]端点,ep:精度 %x:方程的数值解,k迭代次数 if f(a)*f(b)>=0 if f(a)* f(b)>0 warning('端点值同号,不符合二分法的条件'); return; else if f(a)==0 disp(' a就是方程的解'); return; else disp(' b就是方程的解'); return; end end end k=0; N=(log10(b-a)-log10(ep))/log10(2); %最大迭代次数 x=(a+b)/2; if f(x)==0 disp(' x就是方程的解'); return; else while abs(a-b)>ep & k> f=@(x)x-exp(-x);a=0;b=1;ep=0.5e-10; >> [x,k]=bisec(f,a,b,ep) x =0.5671432904 k =35

二分法求非线性方程的数值解(多元函数情形,以二元函数为例) function [x,k] = bisec( f,a,b,ep ) %f:f(x)=0的函数,a,b:[a,b]端点,ep:精度 %x:方程的数值解,k:迭代次数 if f(a(1),a(2))*f(b(1),b(2))>=0 if f(a(1),a(2))* f(b(1,b(2)))>0 warning('端点值同号,不符合二分法的条件'); return; else if f(a(1),a(2))==0 disp(' a就是方程的解'); return; else disp(' b就是方程的解'); return; end end end k=0; x=(a+b)/2; if f(x(1),x(2))==0 disp(' x就是方程的解'); return; else while norm(a-b)>ep if f(x(1),x(2))*f(a(1),a(2))<0 b=x; else a=x; end k=k+1; x=(a+b)/2; end t=round(-log10(ep)); x=vpa(x,t); end >> g=@(x,y)1-x^2-y^2;a=[0;0];b=[1;1];ep=0.5e-15; >> [x,k]=bisec1(g,a,b,ep) x = 0.707106781186548 0.707106781186548 k = 52

相关主题
文本预览
相关文档 最新文档