数值分析大作业_第1页
数值分析大作业_第2页
数值分析大作业_第3页
数值分析大作业_第4页
数值分析大作业_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

实用文档数值分析报大作业班级:铁道2班专业:道路与铁道工程姓名:蔡敦锦学号:13011260、序言该数值分析大作业是通过C语言程序编程在MicrosoftVisualC++6.0编程软件上运行实现的。本来是打算用Matlab软间来计算非线性方程的根的。学习Matlab也差不多有一个多月了,感觉自己编程做题应该没什么问题了;但是当自己真心的去编程、运行时才发现有很多错误,花了一天时间修改、调试程序都没能得到自己满意的结果。所以,我选择了自己比较熟悉的C程序语言来编程解决非线性的求值问题,由于本作业是为了比较几种方法求值问题的收敛速度和精度的差异,选择了一个相对常见的非线性函数来反映其差异,程序运行所得结果我个人比较满意。编写C语言,感觉比较上手,程序出现问题也能比较熟练的解决。最终就决定上交一份C程序语言编程的求值程序了!、选题本作业的目的是为了加深对非线性方程求根方法的二分法、简单迭代法、 、牛顿迭代法弦截法等的构造过程的理解;能将各种方法的算法描述正确并且能够改编为程序并在计算机上实现程序的正确合理的运行,能得到自己满意的结果,并且能调试修改程序中可能出现的问题和程序功能的增减修改。 本次程序是为了比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。为了达到上面的条件我选择自己比较熟悉的语言一C语言来编程,所选题目为计算方程f(x)=x3-2x-5=0在区间[2,3]内其最后两近似值的差的绝对值小于等于1105的根的几种方法的比较。本文将二分法、牛顿法、简单迭代法、弦截法及加速收敛法这五种方法在同一个程序中以函数调用的方式来实现,比较简洁明了,所得结果能很好的比较,便于分析;发现问题和得出结论。

三、程序运行结果■■'CMsersVadunjin\Desktop^Debig'.ffixiaixingfangrhengqiujiee>e'1,匸.回S35.62SAH2.2弭0001.89N252.12S8000.3457032•師2500-0.3513182.0»3750-0.0089422•[阴3?59.1666362.1B15S30.0785622.0976560.0347142■册畀033.0128622.09472?0.0B19542.074238-9.0034V52.0^4492-0.0007712.0946340.W05922.0*4543-0.0060962-0945743.0802512.0945559.06812.074551-0.008004匚分苗驢方程根是個4皈2.0600392.8913042.0080302.3112232.00000024170352.mm2.09483122.0945522.0圖邮92.074551附脱魅求出的擁很是口畑22.mm2.0B08842.0AOO842.0923512.0723512.0942172.0942172・0945012.0945012.0945442•册45442・B94550譚训堆求册擁根是2刖倔2.0000082.0946702.8945702,0945512•刖45512.094552廊收敬法求岀粧程根和厠45522.094251-9.1000062.即45680.0942512.0945529.00031?2■册4552-».00@S16-1-AINDMB.00O0四、分析及结论由以上程序得出的结果可以看出此程序中加速收敛的收敛速度最快其次是弦截法接下来是牛顿法、简单迭代法、二分法。下面来分析出现这种结果的理论基础。由数值分析知识可知,加速收敛法的收敛速度、弦截法和牛顿法都是二次收敛,但是其收敛的迭代公式收敛的速度是有区别的,加速收敛的迭代公式比弦截法和牛顿法收敛的速度要快。这也就解释了上述程序运行后在相同的初始值时加速收敛法比牛顿法快了一倍的原因。(加速收敛只需3次迭代就得到满足精度的值,而牛顿迭代需要6次迭代)。弦截法的收敛速度从其收敛公式上来看是没有牛顿法的收敛速度快的,但是其迭代的次数还和其选取的初始值有关,弦截法需要两个初始值,这就必然使得其迭代的次数受到这两个初始值的影响,初始值选取的大小及合理与否直接影响其迭代的次数。由程序运行的结果可以看出,虽然弦截法收敛速度比牛顿法慢,但是由于初始值的影响其迭代次数明显比牛顿法的次数少。简单迭代的收敛速度和其迭代方程息息相关,一般来说简单迭代的收敛速度是低于加速法、牛顿法和弦截法的。从程序运行结果中也可以得出这个结论。所以在进行简单迭代计算时,其迭代的函数要合理选取。二分法是一个收敛速度比较慢的非线性函数求根法,并且其只能求得一个根,当函数有两个解时,二分法将失去其效用。综上所述,当对计算速度有较高要求时尽量采用加速收敛法,一般建议采用牛顿法,当对计算速度无要求且只有单根时,采用二分法所得结果比较精确,其他情况视个人喜好及方便选择。五、C程序#include<stdio.h>#include<math.h>#definef(x) (pow(x,3)-2*x-5)#defineg(x) (3*x*x-2)#definem 2.0#definen 3.0floatdffqsg(floata,floatb);//对分法求方程的根,a,b为区间,返回值为方程的根floatndddfqsg(floata);//牛顿迭代法求方程的根,a为初值,返回值为方程的根floatjdddf(floata);//简单迭代法求在a附近的根floatAitken(floata);//加速收敛法floatxianjie(floata,floatb);//弦截法求根main(){floatx;x=dffqsg(m,n);//调用二分法求根printf("二分法求出的方程根是%f\n",x);x=ndddfqsg(4.0);printf("牛顿迭代法求出的方程根是%f\n",x);x=jdddf(2.0);printf("简单迭代法求出的方程根是%f\n",x);x=Aitken(2.0);printf("加速收敛法求出的方程根是%f\n",x);x=xianjie(2.1,2.0);printf("弦截法求出的方程根是%f\n",x);}floatdffqsg(floata,floatb){floatc;do{c=(a+b)*0.5;printf("%f\t%f\n",c,f(c));if(f(c)<0){a=c;}else{b=c;}}while(fabs(f(c))>0.00001);returnc;floatndddfqsg(floata){floatc,d;c=a;do{d=c;c=c-f(c)*pow(g(c),-1);printf("%f\t%f\n",m,c);}while(fabs(c-d)>0.00001);returnc;}floatjdddf(floata){floatx,d;x=a;do{d=x;x=pow(2*x+5,1.0/3.0);printf("%f\t%f\n",d,x);}while(fabs(d-x)>0.00001);returnx;}floatAitken(floata){floatx1,x2,x,d;x=a;do{d=x;x1=pow(2*x+5,1.0/3.0);x2=pow(2*x1+5,1.0/3.0);x=(x*x2-x1*x1)/(x-2*x1+x2);printf("%f\t%f\n",d,x);}while(fabs(d-x)>0.00001);return

温馨提示

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

评论

0/150

提交评论