计算方法与实习 方程求根(二分法)
- 格式:doc
- 大小:60.50 KB
- 文档页数:4
《数值分析》实验报告实验一方程求根一、实验目的:掌握二分法、Newton法、不动点迭代法、弦截法求方程的根的各种计算方法、并实施程序调试和运行,学习应用这些算法于实际问题。
二、实验内容:二分法、Newton法、不动点迭代法、弦截法求方程的根、程序的调试和运行,给出实例的计算结果。
观察初值对收敛性的影响。
三、实验步骤:①、二分法:定义:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
实现方法:首先我们设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根,误差限为e=10^-4。
PS:本方法应用的软件为matlab。
disp('二分法')a=0.1;b=1;tol=0.0001;n0=100;fa=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;for i=1:n0 p=(a+b)/2;fp=400*(p.^4)-300*(p.^3)+200*(p.^2)-10*p-1;if fp==0||(abs((b-a)/2)<tol)disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;end;if fa*fp>0 a=p;else b=p;end;end;if i==n0&&~(fp==0||(abs((b-a)/2)<tol)) disp(n0) disp('次二分迭代后没有求出方程的根')end;程序调试:运行结果:用二分法求得方程的根p=0.1108二分迭代次数为:14②Newton法定义:取定初值x0,找到函数对应的点,然后通过该点作函数切线,交x轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。
实验一 方程求根一、实验目的用不同方法求任意实函数方程f (x )=0在自变量区间[a ,b]内或某一点附近的实根,并比较方法的优劣性。
二、实验方法 (1)二分法对方程f (x )=0在[a ,b]内求根。
将所给区间二等分,在二分点x=(b-a)/2处判断是否f (x )=0。
若是,则有根x=(b-a)/2;否则继续判断是否f(a)·f(b)<0,若是,则令b=x ,否则令a=x 。
重复此过程,直至求出方程f(x)=0在[a ,b]内的近似根为止。
(2)迭代法将方程f (x )=0等价变换为x=φ(x )的形式并建立相应的近似根为止。
(3)牛顿法设已知方程f (x )=0的一个近似根x 0,则函数f (x )在点x 0附近可用一阶泰勒多项式p 1(x )=f (x 0)+f ’(x 0)(x-x 0)来近似,因此方程f (x )=0可近似表示为f (x 0)+f ’(x 0)(x-x 0)=0。
设f ’(x 0)≠0,则 x=x 0-f (x 0)/’f (x 0)取x 作为原方程新的近似根x 1,然后再将x 1作为x 0代入上式。
迭代公式为 x k+1=x k -f (x k )/f ’(x k )三、实验内容1)在区间[0,1]内用二分法求方程e x +10x-2=0的近似根,要求误差不超过0.5×10-3。
2)取初值x0=0,用迭代公式x k+1=(2-e x k )/10,(k=0,1,2,…)求方程e x + 10x-2=0的近似根,要求误差不超过0.5×10-3。
3)取初值x 0=0用牛顿迭代法求方程e x + 10x-2=0的近似根,要求误差不超过0.5×10-3。
四、实验程序 (1)二分法(2)迭代法(3)牛顿法五、实验结果(仅供参考)(1)x11=0.09033 (2)x5=0.09052 (3)x2=0.09052六、结果分析由上面的对二分法、迭代法、牛顿法三种方法的三次实验结果,我们可以得出这样的结论:二分法要循环k=10次,迭代法要迭代k=4次,牛顿法要迭代k=2次才能达到精度为0.5×10-3的要求,而且方程e x+10x-2=0的精确解经计算,为0.0905250,由此可知,牛顿法和迭代法的精确度要优越于二分法。
二分法、试位法,牛顿法求方程的根二分法、试位法和牛顿法是求解方程根的常用数值方法。
一、二分法二分法是一种简单而有效的数值方法,它通过不断将区间一分为二来逼近方程的根。
它的基本思想是,如果在一个闭区间[a, b]内,函数f(x)在a和b两点的函数值f(a)和f(b)异号,那么函数在[a, b]内至少存在一个根。
算法步骤如下:1.初始化区间[a, b]和误差容限ε。
2.计算区间中点c=(a+b)/2。
3.如果f(c)=0或者(b-a)/2<ε,则停止迭代,c即为近似的根。
4.如果f(c)与f(a)异号,则根在[a, c]内,将b=c,否则根在[c,b]内,将a=c。
5.回到步骤2。
二、试位法试位法也是一种通过逼近来求解方程根的方法。
与二分法不同,试位法通过计算函数在两个点之间的插值点来逼近根。
它的基本思想是,如果在一个闭区间[a, b]内,函数f(x)在两个点a和b之间有一个变号点c,则函数在[a, b]内至少存在一个根。
算法步骤如下:1.初始化区间[a, b]和误差容限ε。
2.计算函数在区间[a, b]上的插值点c。
3.如果f(c)=0或者(b-a)/2<ε,则停止迭代,c即为近似的根。
4.如果f(c)与f(a)异号,则根在[a, c]内,将b=c,否则根在[c,b]内,将a=c。
5.回到步骤2。
三、牛顿法牛顿法又称为牛顿-拉弗森方法,它是一种通过不断迭代逼近根的方法。
牛顿法基于函数的局部线性近似,通过求导数来计算函数在当前近似根附近的切线与x轴的交点作为新的近似根。
算法步骤如下:1.初始化初始近似根x0和误差容限ε。
2.计算函数在当前近似根x的导数f'(x)。
3.如果f'(x)为0,则停止迭代,x即为近似的根。
4.计算函数在当前近似根x的函数值f(x)。
5.如果|f(x)|<ε,则停止迭代,x即为近似的根。
6.计算新的近似根x=x-f(x)/f'(x)。
《数值分析》实验报告一**: **学号: PB********实验一一、实验名称方程求根二、实验目的与要求:通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。
三、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。
(一)二分法算法:给定区间[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<stdio.h>#include<math.h>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;elsea=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}输入0 1.5707563( /2~1.5705563)得到下表:由上表可以看出刚开始时f(c)取值幅度很大,但是经过一段历程之后,幅度变得平缓甚至基本接近与零,我们认为,x=0.8603是方程的根,结果与实际想要得到的值相当接近。
实验一 二分法求方程的根
一、实验题目
用二分法求方程的根
二、实验目的和意义
1、学习二分法求方程根的理论
2、利用该理论能够构造求解该类典型问题数值解的算
3、编程上机实现算法,在上机过程中加强对算法的理
4、应用算法去解决具体的非线性方程的求根问题
5、通过编程练习提高学生的程序设计能力。
三、实验要求
利用C 编写二分法的程序并利用编好的程序求解非线性方程f(x)=0在区间[a,b]上的所有单重实根。
使误差不超过规定的要求。
1、根据算法理论编程,从a 开始以—个基本步长h 分隔,若一步前后的函数值yo 与y1等于零,则此小区问中必有一个实根。
把这个根的小区间记为[a,b],计算f((a+b)/2)且比较y0,也能选出一个函数值异号的区间[a2,b2]。
再计算f((a2+b2)/2)且与y0比较,又能选出一个函数值异号的区间[a3,b3]。
重复上述二分法区间的过程,直到区间的最小长度小于给定的精度要求,则认为求得一个根;求出一个根后继续分隔,重复上述过程,直到求出[a,b]中全部实根为止。
2、利用已编程序解决实际问题
四、实验问题提出
对于给定的方程02010)(3=-+=x x x f ,试用二分法求在区间)2,1(之间的根,要求精度610-=ε。
五、实验源代码
六、实验结果
Root=
七、实验结果分析
1、算法简单直观,收敛性总能得到保证
2、不能求重根,计算速度较慢。
二分法求方程的实根一:实验目的 通过编程实现二分法,并利用所编程序求函数x e x y --=3在(0,1)的近似解,然后比较和计算器所求的结果,从理性和实践上认识两种计算方法。
二:基本原理连续函数的零点定理1、假定f(x)在区间(x ,y )上连续 , 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2]。
2、假设f(a)<0,f(b)>0,a<b①令a a =1,()11121,b a x b b +==,如果f(x)=0,该点就是零点。
如果0)()(1<x f a f ,则新的有根区间为[][]x a b a ,,122=;否则[][]122,,b x b a =。
此时有[][]2211,,b a b a ⊃,且()112221a b a b -=-。
对区间[]22,b a 重复上述做法多步有[][][][] n n b a b a b a b a ,,,,332211⊃⊃⊃且()a b a b n n n -=--121(式1)记*x 为0)(=x f 的根,我们有[]n n b a x ,*∈,即),3,2,1(* =≤≤n b x a n n 由(式1)及夹逼定理有:*lim lim x b a n n n n ==∞→∞→,实际计算时,当ε<-)(n n a b 时,取)(21*n n b a x +≈作为所求根近似值。
三:实验步骤1:建立如下函数文件f.m :Function f=f(x)f=x e x --32:通过如下框图编写二分法程序:erfen.m开始输入f,a,b,delta计算fa,fb,fa*fbfa*fb>0计算最多二分次数max1计算c=(a+b)/2, fcfc=0fb*fc>0b=c,a=a a=c,b=b|a-b|<=0.0005结束是否是否是否是否(3)、在Matlab 命令窗口键入:[c,err,yc]=bisect(‘f ’,0,1,0.005)(4)、得出结果,并与计算器所得结果比较分析误差。
实验7二分法求方程的根实验7 二分法求方程的根一、问题:求324100x x +-=于区间[1,2]内的一个实根,且要求精确到0.001 二、算法:第一步:计算);(),(21b f y a f y ←←第二步:计算)(),(5.0000x f y b a x ←+←,若00ε<="" ,则输出0x="">否则转第三步; 第三步:若010<="" ,则置;,020y="">第四步; 第四步:若1ε>-a b 则转第二步;否则,输出0x 结束.三、练习编写程序或函数实现上以上区间的近似解,要求记录迭代次数。
函数或程序为:结果为:迭代次数为:四、逐步搜索法求方程根的存在区间在给定的区间[,]a b上判定根的大致分布,从区间左端点a出发,按某个预定的步长h一步一步地向右跨,每跨一步进行一次根的搜索,并记录所有的根的存在区间。
用你编写的程序搜索问题中[0,5]的根的存在区间,步长要求为0.1 h函数为:根的存在区间为:五、综合练习(选做)用逐步搜索法找到根的存在区间,并用二分法求出在该区间上方程根的近似解。
附:分组名单星期二下午5-6节第1组组长:陈絮莹缪妃何贵堂刘钰马倩第2组组长:李杰玉黎筱惠雷霞肖娴林碧珍朱元正第3组组长:陈静苏小丽李郑何淑楠田冬秀曾敬军第4组组长:杨欣王雪梅徐莉萍石小芳雷敏唐嘉第5组组长:杨佳悦郭滢李媛媛何可陈思露第6组组长:王钰琪寇玠杨丹熊晨曦周丹第7组组长:姚瑶高倩倩金杨周海宁杨琴第8组组长:雷芳陈艳王玉娇余非张雪王海燕星期三下午5-6节第9组组长:刘超慧王玉利秦佳丽张青梅廖婷程思远第10组组长:杨琴冯康欣黄宜纯田晓东郑美艳第11组组长:黄倩肖雪梅舒玉秀杨阳黄倩宋亚超第12组组长:乔欢曹人月万袁源刘学勤师小诚沈金勇第13组组长:张全兴程德超冯啸魏丹李茜罗凤菊第14组组长:张洋何婷婷刘云丹彭英萍马静第15组组长:杨丽王书琪袁杰宋慧玲杨璐萍李琳玲星期三下午7-8节第16组组长:李欢蒋书丽康斯梦王菊花李芝琴第17组组长:杨梅郑雨来李维刘玉兰羊玲第18组组长:左艳君古月黄文凤杨娟胡洲黄川第19组组长:吴星谭婷张欢向巧钱强陈虹弟第20组组长:曾大超胡敏马树述罗玉婷第21组组长:石章波拉吉石明岳榆川金小刚张泽松第22组组长:贾孙鹏袁鹏颜冬芹陈诚张博第23组组长:李自强黄金辉彭琦岳琪李宾李闯第24组组长:王文媛林小渝刘燕严英何思敏穆芦芸。
1 求下列方程的所有实根。
534221.204508967.8701231924.7590738320.6246081017.082712590x x x x x +--+-=1.1二分法计算该题1.1.1 确定区间[a,b].(1)用excel 进行计算出区间:最终确定区间范围是[1,2](2)作图法画出函数y=f(x)的大概图象,观察曲线y=f(x)与x 轴交点的大致位置,从而确定隔根区间。
上图是大概的图形,由此确定区间为[1,2]经计算f(a)和f(b)得f(a)*f(b)<0,所以确定方程的根在[1,2]之间。
1.1.2算法过程设函数f (x )在区间[1,2]上连续,且f(1)·f(2)<0根据连续函数的性质可知f(x)=0在[1,2]内一定有实根,并称[1,2]为方程f(x)=0的有根区间。
(1)取(a, b)的()k f x 中点,计算11()02a b f +=的值.若()02a b f +<,则2a b +为方程f(x)的根,计算结束.若()02a b f +¹,如果()2a b f +与f(a)同号,则记21b b =,1b b =如果11()2a b f +与f(a)异号,则记1a a =, 12a b b +=;(a1, b1)为新的有根区间, (a1,b1) (a,b)且进行下一步。
(2)取(a1, b1)的中点,计算112a b +的值.若11()02a b f +¹,则112a b +为方程f(x)=0的根,计算结束. 若11()02a b f +¹,如果11()2a b f +与f(a1)同号,则记112()2a b b f +=;21a a =;如果11()2a b f +与f(a1)异号,则记21a a =,112()2a b b f +=这时(a2, b2)为新的有根区间,(a2,b2)⊂ (a1,b1)⊂(a,b)且进行下一步。
1求下列方程的所有实根。
5342+--+-= x x x x x21.204508967.8701231924.7590738320.6246081017.082712590用二分法程序计算该题(1)该方程区间以确定为[1,2](2) 用程序中的x=(a+b)/2求区间(a,b)的中点x.(3) 判断根在那个区间(a) 若f(a)*f(x)<0,则根在区间的左半部分,b=x;(b) 若f(a)*f(x)>0,则根在区间的右半部分,a=x;( b) fabs(b-a)>eps;判断结果是否达到精度要求,若没有达到,则返回前面继续执行;若达到精度,则取最后的小区间中点作为根的近似值x=(a+b)/2;(4)运行结果#include<stdio.h>#include <math.h>#define f(x) (pow(x,5)+21.20450896*pow(x,3)-7.87012319*pow(x,4)-24.75907383*x*x+20.6246 0810*x-17.08271259)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);}。