1、设计采用梯形法和辛普生法求定积分的程序河北工业大学计算机软件技术基础(VC)课程设计报告学院 机械工程学院 班级 工程力学101 姓名 万乐乐 _ 学号 100540_ 成绩 _ _一、题目:设计采用梯形法和辛普生法求定积分的程序 (17)二、设计思路1、总体设计1)分析程序的功能对梯形法和辛普生法计算在不同区间下的积分值,比较二者的精确度;并与真实积分值比较求其误差。2)系统总体结构:该程序有定义梯形法和辛普生法函数,f(x)函数,计算真实值的牛顿莱布尼茨函数和主函数。梯形法和辛普生法函数:将积分转化为VC+语言,输入被积函数和积分区间等数据,能计算出对应的积分值。f(x)函数:将所求的被积
2、分的函数转化为VC+语言,被主函数调用。计算真实值的牛顿莱布尼茨函数:计算所积函数在其被积区间下的真实积分值。主函数:程序的主体,调用各个模块的运行。2、各功能模块的设计:梯形法和辛普生法函数:定义函数指针求积分,将数学表达式转化为VC+语言。f(x)函数:通过写f1,f2函数的表达式,计算结果作为函数返回值。计算真实值的牛顿莱布尼茨函数:通过写出f1,f2函数的原函数;用牛顿莱布尼茨公式计算其真实积分值作为函数的返回值。主函数:调用梯形法和辛普生法函数,f(x)函数,计算真实值的牛顿莱布尼茨函数完成积分及误差的计算。3、设计中的主要困难及解决方案在这部分论述设计中遇到的主要困难及解决方案。1
3、)对函数指针不是很了解,查阅相关的资料学习其使用方法。2)对于程序的循环使用及判断不易掌握,用到了while,for,if,break语句来解决。4、你所设计的程序最终完成的功能1)说明你编制的程序能完成的功能用梯形法和辛普生法分别计算函数的积分,比较二者的精确度和与真实值之间的误差。2)准备的测试数据及运行结果当下限a=0上限b=1,n分别取2,10,100,1000,5000,20000,50000时用梯形法求f1,f2的积分及误差当下限a=0上限b=1,n分别取2,10,100,1000,5000,20000,50000时用辛普生法求f1,f2的积分及误差当下限a=0上限b=2,n分别取
4、2,10,100,1000,5000,20000,50000时用梯形法求f1,f2的积分及误差当下限a=0上限b=2,n分别取2,10,100,1000,5000,20000,50000时用辛普生法求f1,f2的积分及误差三、程序清单本程序包含main.cpp、f(x).cpp、txf.cpp、sinpson.cpp、zhengshi.cpp、head.h、6个文件。1、main.cpp文件清单#include#includehead.h#includevoid main()/主程序文件double a,b;int n,c,d=0;double f_1,f_2,zs1,zs2;/f_1,f_2
5、为算法计算的积分值;zs1为f1真实的积分值zs2为f2真实的积分值coutf1(x)=1+x*x f2(x)=1+x+x*x+x*x*xendl;/输出f1,f2函数cout以下为求f1,f2的对应积分区间的积分endl;while(1) /循环语句if(d!=2)/重新输入新的数据coutabn;else/只改变n的值coutn;cout梯形法求积分请按:1n辛普法生求积分按:2c;if(c!=1&c!=2)/输入错误就重新输入for(;)coutc;if(c=1|c=2)break;if(c=1)/选择梯形法计算f_1=integralt(a,b,n,f1);f_2=integralt(
6、a,b,n,f2);zs1=realintegral(a,b,real1);zs2=realintegral(a,b,real2);cout-梯形法结果为-endl;if(c=2)/选择辛普生法计算f_1=integrals(a,b,n,f1);f_2=integrals(a,b,n,f2);zs1=realintegral(a,b,real1);zs2=realintegral(a,b,real2);cout-辛普生法结果为-endl;coutntatbtf1tf1误差ttf2tf2误差endl;/输入的格式coutntatbtf_1tfabs(f_1-zs1)tf_2tfabs(f_2-z
7、s2)endl;cout重新输入请按:1n只改变n的值请按:2n推出请按:0d;if(d!=0&d!=1&d!=2)/当d输入错误时重新输入for(;)coutd;if(d=1|d=2|d=3)break;if(d=0)/结束循环体cout谢谢您的使用再见endl;break;2、f(x).cpp文件清单#include/函数f1和f2double f1(double x)return 1+x*x;double f2(double x)return 1+x+x*x+x*x*x;3、txf.cpp文件清单#include/梯形法求积分算法double integralt(double a,dou
8、ble b,int n,double (*f)(double)double h,jf=0;h=(b-a)/n;for(int i=1;i=n;i+)jf+=(*f)(a+i*h)+(*f)(a+(i-1)*h)*h/2.0;return jf;4、sinpson.cpp文件清单#include/辛普生法求积分算法double integrals(double a,double b,int n,double(*f)(double)double h,sj=0,sr=0;h=(b-a)/(2*n);for(int i=1;i=2*n-1;i=i+2)sj+=(*f)(a+i*h);for(int j
9、=2;j=2*n-2;j+=2)sr+=(*f)(a+j*h);return (*f)(a)+(*f)(b)+4*sj+2*sr)*h/3;5、zhengshi.cpp文件清单#include/辛普生法求积分算法double integrals(double a,double b,int n,double(*f)(double)double h,sj=0,sr=0;h=(b-a)/(2*n);for(int i=1;i=2*n-1;i=i+2)sj+=(*f)(a+i*h);for(int j=2;j=2*n-2;j+=2)sr+=(*f)(a+j*h);return (*f)(a)+(*f)
10、(b)+4*sj+2*sr)*h/3;6、head.h文件清单#includedouble f1(double x);/声明f1函数double f2(double x);/声明f2函数double real1(double x);/声明real1函数double real2(double x);/声明real2函数double integrals(double a,double b,int n,double(*f)(double);/声明辛普生法函数double integralt(double a,double b,int n,double (*f)(double);/声明梯形法函数dou
11、ble realintegral(double a,double b,double(*r)(double);/声明牛顿莱布尼茨计算积分函数四、对该设计题目有何更完善的方案1、对自己完成程序进行自我评价。能够完成题目要求并且有一定的创新。2、对课题提出更完善的方案设计更加简单的用户界面,方便使用者的使用,在主函数的循环体中可以使用switch,case语句,这样看起来更加美观方便,输出界面可以采用列表的形式,这样能让使用者一目了然。五、收获及心得体会1、通过本次课程设计,自己在哪些方面的能力有所提高。通过本次的课程设计,熟悉了函数指针和循环体的使用,加强了对多个函数调用的了解,提高软件系统分析能力和程序文档的建立、归纳总结的能力,现在我自己已经具备使用VC+开发应用软件和解决实际问题的能力。2、 收获和心得体会。认识到了上学期学习VC+的重要性和实用性,让我深刻理解不论解决什么问题都要有逻辑的思维,认真的学习,大胆的创新;必要时查找相关资料;感谢老师的指导,让我受益匪浅。通过自己独立完成这次课程设计,我在运用VC+解决实际问题的能力提高了日期: 2011 年 9月 7日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1