设计采用梯形法和辛普生法求定积分的程序.docx
《设计采用梯形法和辛普生法求定积分的程序.docx》由会员分享,可在线阅读,更多相关《设计采用梯形法和辛普生法求定积分的程序.docx(16页珍藏版)》请在冰豆网上搜索。
设计采用梯形法和辛普生法求定积分的程序
河北工业大学计算机软件技术基础(VC)课程设计报告
学院机械工程学院班级工程力学101姓名万乐乐_学号100540____成绩______
一、题目:
设计采用梯形法和辛普生法求定积分的程序(17)
二、设计思路
1、总体设计
1)分析程序的功能
对梯形法和辛普生法计算在不同区间下的积分值,比较二者的精确度;并与真实积分值比较求其误差。
2)系统总体结构:
该程序有定义梯形法和辛普生法函数,f(x)函数,计算真实值的牛顿莱布尼茨函数和主函数。
①梯形法和辛普生法函数:
将积分转化为VC++语言,输入被积函数和积分区间等数据,能计算出对应的积分值。
②f(x)函数:
将所求的被积分的函数转化为VC++语言,被主函数调用。
③计算真实值的牛顿莱布尼茨函数:
计算所积函数在其被积区间下的真实积分值。
④主函数:
程序的主体,调用各个模块的运行。
2、各功能模块的设计:
①梯形法和辛普生法函数:
定义函数指针求积分,将数学表达式转化为VC++语言。
②f(x)函数:
通过写f1,f2函数的表达式,计算结果作为函数返回值。
③计算真实值的牛顿莱布尼茨函数:
通过写出f1,f2函数的原函数;用牛顿莱布尼茨公式计算其真实积分值作为函数的返回值。
④主函数:
调用梯形法和辛普生法函数,f(x)函数,计算真实值的牛顿莱布尼茨函数完成积分及误差的计算。
3、设计中的主要困难及解决方案
在这部分论述设计中遇到的主要困难及解决方案。
1)对函数指针不是很了解,查阅相关的资料学习其使用方法。
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分别取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
#include"head.h"
#include
voidmain()//主程序文件
{
doublea,b;
intn,c,d=0;
doublef_1,f_2,zs1,zs2;//f_1,f_2为算法计算的积分值;zs1为f1真实的积分值zs2为f2真实的积分值
cout<<"f1(x)=1+x*xf2(x)=1+x+x*x+x*x*x"<cout<<"以下为求f1,f2的对应积分区间的积分"<while
(1)//循环语句
{
if(d!
=2)//重新输入新的数据
{
cout<<"请输入下限a,上限b和n:
";
cin>>a>>b>>n;
}
else//只改变n的值
{
cout<<"请输入n:
";
cin>>n;
}
cout<<"梯形法求积分请按:
1\n辛普法生求积分按:
2"<cin>>c;
if(c!
=1&&c!
=2)//输入错误就重新输入
{
for(;;)
{
cout<<"错误请重新选择:
";
cin>>c;
if(c==1||c==2)break;
}
}
if(c==1)//选择梯形法计算
{
f_1=integralt(a,b,n,f1);
f_2=integralt(a,b,n,f2);
zs1=realintegral(a,b,real1);
zs2=realintegral(a,b,real2);
cout<<"-------------------------------梯形法结果为------------------------------"<}
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<<"------------------------------辛普生法结果为-----------------------------"<}
cout<<"n\ta\tb\tf1\tf1误差\t\tf2\tf2误差"<cout<cout<<"重新输入请按:
1\n只改变n的值请按:
2\n推出请按:
0"<cin>>d;
if(d!
=0&&d!
=1&&d!
=2)//当d输入错误时重新输入
{for(;;)
{
cout<<"错误请重新选择:
";
cin>>d;
if(d==1||d==2||d==3)
break;
}
}
if(d==0)//结束循环体
{
cout<<"谢谢您的使用再见"<break;
}
}
}
2、f(x).cpp文件清单
#include//函数f1和f2
doublef1(doublex)
{return1+x*x;}
doublef2(doublex)
{return1+x+x*x+x*x*x;}
3、txf.cpp文件清单
#include//梯形法求积分算法
doubleintegralt(doublea,doubleb,intn,double(*f)(double))
{
doubleh,jf=0;
h=(b-a)/n;
for(inti=1;i<=n;i++)
{
jf+=((*f)(a+i*h)+(*f)(a+(i-1)*h))*h/2.0;
}
returnjf;
}
4、sinpson.cpp文件清单
#include//辛普生法求积分算法
doubleintegrals(doublea,doubleb,intn,double(*f)(double))
{doubleh,sj=0,sr=0;
h=(b-a)/(2*n);
for(inti=1;i<=2*n-1;i=i+2)
sj+=(*f)(a+i*h);
for(intj=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//辛普生法求积分算法
doubleintegrals(doublea,doubleb,intn,double(*f)(double))
{doubleh,sj=0,sr=0;
h=(b-a)/(2*n);
for(inti=1;i<=2*n-1;i=i+2)
sj+=(*f)(a+i*h);
for(intj=2;j<=2*n-2;j+=2)
sr+=(*f)(a+j*h);
return((*f)(a)+(*f)(b)+4*sj+2*sr)*h/3;
}
6、head.h文件清单
#include
doublef1(doublex);//声明f1函数
doublef2(doublex);//声明f2函数
doublereal1(doublex);//声明real1函数
doublereal2(doublex);//声明real2函数
doubleintegrals(doublea,doubleb,intn,double(*f)(double));//声明辛普生法函数
doubleintegralt(doublea,doubleb,intn,double(*f)(double));//声明梯形法函数
doublerealintegral(doublea,doubleb,double(*r)(double));//声明牛顿莱布尼茨计算积分函数
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
能够完成题目要求并且有一定的创新。
2、对课题提出更完善的方案
设计更加简单的用户界面,方便使用者的使用,在主函数的循环体中可以使用switch,case语句,这样看起来更加美观方便,输出界面可以采用列表的形式,这样能让使用者一目了然。
五、收获及心得体会
1、通过本次课程设计,自己在哪些方面的能力有所提高。
通过本次的课程设计,熟悉了函数指针和循环体的使用,加强了对多个函数调用的了解,提高软件系统分析能力和程序文档的建立、归纳总结的能力,现在我自己已经具备使用VC++开发应用软件和解决实际问题的能力。
2、收获和心得体会。
认识到了上学期学习VC++的重要性和实用性,让我深刻理解不论解决什么问题都要有逻辑的思维,认真的学习,大胆的创新;必要时查找相关资料;感谢老师的指导,让我受益匪浅。
通过自己独立完成这次课程设计,我在运用VC++解决实际问题的能力提高了
日期:
2011年9月7日