数值分析报告-二分法和牛顿法方程求根.doc_第1页
数值分析报告-二分法和牛顿法方程求根.doc_第2页
数值分析报告-二分法和牛顿法方程求根.doc_第3页
数值分析报告-二分法和牛顿法方程求根.doc_第4页
数值分析报告-二分法和牛顿法方程求根.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数值分析实 验 报 告 一 姓名: 周 举 学号: PB09001046 实验一一、实验名称方程求根 二、实验目的与要求:通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。三、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。(一)二分法 算法:给定区间a,b,并设f(a)与f(b)符号相反,取为根的容许误差,为值的容许误差。(1)令c=(a+b)/2(2)如果(c-a) 或,则输出c,结束;否则执行(3)(3)如果f(a)f(c)0,则令;否则,则令,重复(1),(2),(3)。 (二)牛顿迭代法:给定初值,为根的容许误差,为的容许误差,N为迭代次数的容许值。(1)如果或迭代次数大于N,则算法结束;否则执行(2)。(2)计算(3)若 或 ,则输出 ,程序结束;否则执行(4)。(4)令 = ,转向(1)。四、实验题目与程序设计1、二分法3.1.1、用二分法求方程a. f(x)= 在区间0,/2上的根,c. f(x)= 在区间1,3上的根。源程序:3.1.1.a#include#includevoid 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)=%fn,a,b,b-a,c,y);while(fabs(b-a)0.00001| fabs(y)0.00001) z=1/a-tan(a);if(z*y0)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)=%fn,a,b,b-a,c,y);输入0 1.5707563 (/21.5705563)得到下表:由上表可以看出刚开始时f(c)取值幅度很大,但是经过一段历程之后,幅度变得平缓甚至基本接近与零,我们认为,x=0.8603是方程的根,结果与实际想要得到的值相当接近。3.1.1 c#include#includevoid 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=pow(2,-c)+exp(c)+2*cos(c)-6;printf(a=%f,b=%f,b-a=%f,c=%f,f(c)=%fn,a,b,b-a,c,y);while(fabs(b-a)0.00001 | fabs(y)0.00001) z=pow(2,-a)+exp(a)+2*cos(a)-6;if(z*y0)b=c;else a=c; c=(a+b)/2;y=pow(2,-c)+exp(c)+2*cos(c)-6; printf(a=%f,b=%f,b-a=%f,c=%f,f(c)=%fn,a,b,b-a,c,y);输入1 3 ,得到如下表:我们认为,x=1.8294是方程的根。3.1.4、用二分法求方程在5.5,6.5上的根,将-36改为-36.001,并重复试验。源程序如下:#include#includevoid main()float a,b,c,y,z,w;int n=0;printf(plese input two number a and b:n);scanf(%f%f,&a,&b);c=(a+b)/2;y=pow(c,8)-36*pow(c,7)+546*pow(c,6)-4536*pow(c,5)+22449*pow(c,4)-67284*pow(c,3)+118124*c*c-109584*c+40320; printf( a b b-a c f(a) f(c) f(b)n);printf(%f,%f,%f,%f,%f,%f,%fn,a,b,b-a,c,z,y,w);while(y0.00001 | c-a0.00001 ) z=pow(a,8)-36*pow(a,7)+546*pow(a,6)-4536*pow(a,5)+22449*pow(a,4)-67284*pow(a,3)+118124*a*a-109584*a+40320; w=pow(b,8)-36*pow(b,7)+546*pow(b,6)-4536*pow(b,5)+22449*pow(b,4)-67284*pow(b,3)+118124*b*b-109584*b+40320;if(z*y0)b=c;else a=c; c=(a+b)/2;y=pow(c,8)-36.001*pow(c,7)+546*pow(c,6)-4536*pow(c,5)+22449*pow(c,4)-67284*pow(c,3)+118124*c*c-109584*c+40320; printf(%f,%f,%f,%f,%f,%f,%fn,a,b,b-a,c,z,y,w); n+;输入5.5 6.5 得到下表:我们认为x=6.0000是方程的根。如果把第二项系数换成36.001,重复以上实验,则得到下表:由于f(a)和f(b)总是同为负数,我们在(5.5,6.5)之间没有找到需要的根,这就说明,当方程中某一个系数相差很小时,方程的根取值可能相差很大。2、牛顿迭代法3.2.5、用牛顿法求方程接近0.1的两根。源程序如下:#include#includevoid main()int n=0,M; float x,y,s,t,u,v;printf(plese input x M t and s :n);scanf(%f%d%f%f,&x,&M,&t,&s);u=2*x*x*x*x+24*x*x*x+61*x*x-16*x+1;v=8*x*x*x+72*x*x+122*x-16;y=x-u/v;printf(N=%d,x=%f,y=%f,|y-x|=%f,f(x)=%fn,n,x,y,fabs(y-x),u);n+;while(nt & fabs(u)s ) x=y;u=2*x*x*x*x+24*x*x*x+61*x*x-16*x+1; v=8*x*x*x+72*x*x+122*x-16; y=x-u/v; printf(N=%d,x=%f,y=%f,|y-x|=%f,f(x)=%fn,n,x,y,fabs(y-x),u); n+;为了能够找到x=0.1附近的两个根,我们不妨取=0.0,=0.1和=0.2两个值尝试一下,分别得到如下的结果:(1)当=0.0时,我们认为x=0.1213是方程的根。(2)当=0.1时,我们认为x=0.1213是方程的根。(3)当=0.2时,我们认为x=0.1231是方程的根。故方程在x=0.1附近的两根为x=0.1213和x=0.1231。将这一过程表示在坐标图中:由于方程的两个根和x=0.1比较接近,可以看出,当初值取为0.1时,f(c)的函数最为平缓,这表示此时f(x)最先到达零点;其次,0.2比0.0更加接近于根x=0.1213和x=0.1231,所以初值为0.2的曲线比初值为0.0的曲线更加平缓。这就说明了,用牛顿法解方程式,应该尽量使初值接近零点,这样能够更节省时间,得到的根更准确。3.2.14、用牛顿法求解下面两个非线性方程的根 a. , b. 3.2.14、a取,则 ,根据牛顿法的思想,其源程序如下:#include#includevoid main()float x,y,u,v,s,t;int n=0,M;printf(plese input two number x、y ,and M:n);scanf(%f%f%d,&x,&y,&M); printf(%f,%f,%dn,x,y,M);s=4*y*y+4*y+52*x-19;t=169*x*x+3*y*y+111*x-10*y-10;printf(N=%d,x=%f,y=%f,f1=%f,f2=%fn,n,x,y,s,t);n+;while(n4之后,f1(X)和f2(X)基本上等于零,这个接近程度相当低,而且,方程很快能够得到需要的根,这说明牛顿法的效率是相当高的。(b)和(a)的做法思想是一样的,其源程序如下:#include#includevoid main()float x,y,u,v,s,t,r;int n=0,M;printf(plese input two number x、y ,and M:n);scanf(%f%f%d,&x,&y,&M); printf(%f,%f,%dn,x,y,M);s=x+exp(-x)+y*y*y;t=x*x+2*x*y-y*y+tan(x);printf(N=%d,x=%f,y=%f,f1=%f,f2=%fn,n,x,y,s,t);n+;while(n=M) r=(1-exp(-x)*(2*x-2*y)-3*y*y*(2*x+2*y+1/(1+x*x); u=-(2*x-2*y)*s-3*y*y*t)/r; v=-(-2*x-2*y-1/(1+x*x)*s-(1-exp(-x)*t)/r; x=x+u;y=y+v; s=x+exp(-x)+y*y*y;t=x*x+2*x*y-y*y+tan(x); printf(N=%d,x=%f,y=%f,f1=%f,f2=%fn,n,x,y,s,t); n+;当输入0 0 20时,我惊奇地发现不能得到想要的结果,而是出现了很多不知何物的字母,于是我猜测在运算过程当中可能出现了分母零,于是我加入了一个r表示上面程序中u和v共同的分母,即r=(1-exp(-x)*(2*x-2*y)-3*y*y*(2*x+2*y+1/(1+x*x),验算初值为0和0时的情况,结果果然出现了r=0,于是我将初始值改为1和1,运算20次,得到下表:从中可以看出,方程的根为x= - 0.7112 ,y= - 1.0984 ,另外,从中可以看出,此次需要进行更多运算,才能是方程值趋于零,与前一个方程组(a)相比,它的求解过程步骤要多一些。五、小结: 二分法和牛顿法都是解方程的两个比较好的方法,二分法在解一元方程应用中相比牛顿法要简单些,特别是写程序要简单些,但是二分法求根过程的步骤要比

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论