1. 目的:
(1)通过求定积分的程序设计,使学生理解和掌握C++语言的函数、函数指针等设计方法,培养学生综合利用C++语言解决数学计算问题,使学生将所学知识转化为分析和设计简单实际问题的能力,并学会查资料和工具书,进行创新设计。
(2)提高学生建立程序文档、归纳总结的能力。
(3)进一步巩固和灵活运用先修课程《计算机文化基础》有关文字处理、图表分析、数据归整、应用软件之间图表、数据共享等信息技术处理的综合能力。
2. 基本要求:
(1)要求用模块化设计和C++的思想来完成程序的设计;
(2)要求用函数分别编写梯形法和辛普生法求定积分的程序,分别存到不同的.CPP文件中;
(3)在VC++6.0环境中,学会调试程序的方法,及时查究错误,独立调试完成。
(4)程序调试通过后,完成程序文档的整理,加必要的注释。
三、设计方法和基本原理
1. 课题功能描述
本题目的功能是对梯形法和辛普森法,在不同区间数下计算所得的定积分的值,进行精度比较。
2. 问题详细描述
(1)数值积分
求一个函数f(x)在[a,b]上的定积分∫baf(x) dx,其几何意义是求f(x)曲线和直线x=a,y=0,x=b所围成的曲边梯形面积。为了近似求出此面积,可将[a,b]区间分成若各个小区间,每个区间的宽度为(b-a)/n,n为区间个数。近似求出每个小的曲边梯形面积,然后将n个小面积加起来,就近似的到总的面积。既定积分的近似值,当n愈大(即区间分的愈小),近似程度愈高。数值积分常用的算法有:
1)梯形法
用小梯形代替小曲边梯形,几何意义如图所示。
第一个小梯形的面积为:
第i个小梯形的面积为:
其中:
2) 辛普生(Sinpson)法
在小区间范围内,用一条抛物线代替该区间的f(x)。将(a,b)区间分成2n个小区间,则辛普生法求定积分的公式为:
其中:
(2)要求分别采用梯形法和辛普生法分别计算f1(x)和 f2(x)的定积分。
2、问题的解决方案:
(1) 编写一个梯形法求定积分的通用函数integralt(),其函数原型为:
double integralt(double a, double b, double(*f)( double));
函数的形参a,b,f分别为定积分的下限、上限和函数名 ,其中f为函数指针。
(2) 编写一个辛普生法求定积分的通用函数integrals(),其函数原型为:
double integrals(double a, double b, double(*f)( double));
函数的形参a,b,f分别为定积分的下限、上限和函数名 ,其中f为函数指针。
(3) 对所求的被积分表达式分别编写函数f1和f2:
f1(x)=1+x2
f2(x)=1+x+x2+x3
(4) 在主函数中输入a,b(0,1)的值,先调用梯形法求积分的integralt()函数,分别计算f1和f2的定积分,并输出计算结果。再输入a,b(0,1)的值,调用辛普生法求积分的integrals()函数,分别计算f1和f2的定积分,并输出计算结果。再次输入a,b(0,2)的值,再分别调用梯形法和辛普生法分别计算f1和f2的定积分,并输出计算结果。
(5) 要求在n相同的情况下,对同一个被积函数同区间采用梯形法和辛普生法的积分结果的精度进行分析,主要观察随着n值的增加,积分结果的有效数字位数有何变化,两种方法与精确值的误差。
要求n值,分别取2,10,100,1000,5000,20000,50000进行观察。
四、主要技术问题的描述:
1、函数指针
一个函数在编译时被分配一个入口地址,可以将该地址赋给一个指针变量,这样,这个指针变量持有函数的入口地址,它就指向了该函数,称这种指针为指向函数的指针,简称函数指针。
2、函数指针定义的一般形式:
数据类型 (*指针变量)(形式参数);
例:int (*pf)(int a,int b);
3、调用的形式举例:
double integral (double a,double b,int n,double(*f)(double ))
{
…
ff1=(*f)(a);
…
ff2=(*f)(x);
…
}
double f1(double x)
{
double y1;
y1=1+x*x;
return y1;
}
void main ()
{ 。。。
cin>>a>>b>>n;
intesum1=integral(a,b,n,f1);
}
五、创新要求
在基本要求达到后,进行创新设计:
使用多文件,即主函数和各个函数分别存放在不同的.cpp文件中,在头文件中进行函数原型声明。