- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数值分析大作业
数值分析报大作业班级:铁道2班专业:道路与铁道工程姓名:蔡敦锦学号、序言该数值分析大作业是通过C语言程序编程在Microsoft Visual C++6.0编程软件上运行实现的。本来是打算用Matlab软间来计算非线性方程的根的。学习Matlab也差不多有一个多月了,感觉自己编程做题应该没什么问题了;但是当自己真心的去编程、运行时才发现有很多错误,花了一天时间修改、调试程序都没能得到自己满意的结果。所以,我选择了自己比较熟悉的C程序语言来编程解决非线性的求值问题,由于本作业是为了比较几种方法求值问题的收敛速度和精度的差异,选择了一个相对常见的非线性函数来反映其差异,程序运行所得结果我个人比较满意。编写C语言,感觉比较上手,程序出现问题也能比较熟练的解决。最终就决定上交一份C程序语言编程的求值程序了!二、选题本作业的目的是为了加深对非线性方程求根方法的二分法、简单迭代法、、牛顿迭代法弦截法等的构造过程的理解;能将各种方法的算法描述正确并且能够改编为程序并在计算机上实现程序的正确合理的运行,能得到自己满意的结果,并且能调试修改程序中可能出现的问题和程序功能的增减修改。本次程序是为了比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。为了达到上面的条件我选择自己比较熟悉的语言—C语言来编程,所选题目为计算方程f(x)=x3-2x-5=0在区间[2,3]内其最后两近似值的差的绝对值小于等于的根的几种方法的比较。本文将二分法、牛顿法、简单迭代法、弦截法及加速收敛法这五种方法在同一个程序中以函数调用的方式来实现,比较简洁明了,所得结果能很好的比较,便于分析;发现问题和得出结论。三、程序运行结果四、分析及结论由以上程序得出的结果可以看出此程序中加速收敛的收敛速度最快其次是弦截法接下来是牛顿法、简单迭代法、二分法。下面来分析出现这种结果的理论基础。由数值分析知识可知,加速收敛法的收敛速度、弦截法和牛顿法都是二次收敛,但是其收敛的迭代公式收敛的速度是有区别的,加速收敛的迭代公式比弦截法和牛顿法收敛的速度要快。这也就解释了上述程序运行后在相同的初始值时加速收敛法比牛顿法快了一倍的原因。(加速收敛只需3次迭代就得到满足精度的值,而牛顿迭代需要6次迭代)。弦截法的收敛速度从其收敛公式上来看是没有牛顿法的收敛速度快的,但是其迭代的次数还和其选取的初始值有关,弦截法需要两个初始值,这就必然使得其迭代的次数受到这两个初始值的影响,初始值选取的大小及合理与否直接影响其迭代的次数。由程序运行的结果可以看出,虽然弦截法收敛速度比牛顿法慢,但是由于初始值的影响其迭代次数明显比牛顿法的次数少。简单迭代的收敛速度和其迭代方程息息相关,一般来说简单迭代的收敛速度是低于加速法、牛顿法和弦截法的。从程序运行结果中也可以得出这个结论。所以在进行简单迭代计算时,其迭代的函数要合理选取。二分法是一个收敛速度比较慢的非线性函数求根法,并且其只能求得一个根,当函数有两个解时,二分法将失去其效用。综上所述,当对计算速度有较高要求时尽量采用加速收敛法,一般建议采用牛顿法,当对计算速度无要求且只有单根时,采用二分法所得结果比较精确,其他情况视个人喜好及方便选择。五、C程序#includestdio.h#includemath.h#define f(x) (pow(x,3)-2*x-5)#define g(x) (3*x*x-2)#define m 2.0#define n 3.0 float dffqsg(float a,float b);//对分法求方程的根,a,b为区间,返回值为方程的根float ndddfqsg(float a);//牛顿迭代法求方程的根,a为初值,返回值为方程的根float jdddf(float a);//简单迭代法求在a附近的根float Aitken(float a);//加速收敛法float xianjie(float a,float b);//弦截法求根main(){float x;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);}float dffqsg(float a,float b){float c; do{c=(a+b)*0.5;printf(%f\t%f\n,c,f(c));if(
文档评论(0)