36基于梯形法和辛普生求定积分文档格式.docx
《36基于梯形法和辛普生求定积分文档格式.docx》由会员分享,可在线阅读,更多相关《36基于梯形法和辛普生求定积分文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
说明各功能模块的实现方法
1)对源程序的函数源进行声明及宏定义,便于后面的调用。
2)主函数部分:
编写好主函数程序,里面含有函数调用,成为主调函数;
。
3)梯形法求定积分:
即被调函数部分,利用函数调用及for循环求累加和,计算出此时的函数值并将其反回到主函数中。
4)辛普生法求定积分:
调用函数求函数值,并利用for循环求累加和。
计算出函数的值并返回到主函数中。
3、设计中的主要困难及解决方案
1)困难1:
函数调用比较多,程序冗长,容易出现混乱。
解决方案:
函数的取名要尽量简单,取名之后按顺序排放。
2)困难2:
计算函数时,涉及到多个函数计算以及for循环求累加和。
清晰地定义多个函数,及宏定义,利用函数调用的知识,每计算一步,要用return返到主函数中。
4、你所设计的程序最终完成的功能
1)向程序中输入a,b,n的值后,会分别用梯形法和辛普生法计算出相应的结果。
2)准备的测试数据和运行结果:
三、程序清单
#include<
iostream.h>
stdlib.h>
#defineHIGH1(a,b,n)(b-a)/n//宏定义
doubleF1(doublex,doubley,intz);
//函数原型说明
doubleF2(doublex,doubley,intz);
doublef1(doubleu);
doublef2(doublev);
doublesum1(doublec,doubled,inte);
doublesum2(doublep,doubleq,intr);
#defineHIGH2(a,b,n)(b-a)/(2*n)//宏定义
doubleF3(doublex,doubley,intz);
//函数说明
doubleF4(doublex,doubley,intz);
doublef3(doubleu);
doublef4(doublev);
doublesum5(doublep,doubleq,intr);
doublesum6(doublep,doubleq,intr);
doublesum3(doublec,doubled,inte);
doublesum4(doublec,doubled,inte);
voidintegralts(doublex,doubley,intz,double(*f)(double,double,int));
voidintegralt(doublex,doubley,intz,double(*f)(double,double,int));
voidmain()//主函数
{
intn;
doublea,b;
cout<
<
"
pleaseinputa,b,n=\n"
;
//输出提示
cin>
>
a>
b>
n;
a="
a<
\nb="
b<
\nn="
n<
endl;
梯形法:
intesum1="
integralt(a,b,n,F1);
//应用函数指针调用函数
intesum2="
integralt(a,b,n,F2);
辛普生法:
integralts(a,b,n,F3);
integralts(a,b,n,F4);
}
voidintegralt(doublex,doubley,intz,double(*f)(double,double,int))//利用梯形法球定积分
{
doubleff;
ff=(*f)(x,y,z);
//用函数指针调用F1函数
ff<
}
doubleF1(doublex,doubley,intz)
doubleh,Y1;
//定义局部变量
h=HIGH1(x,y,z);
//调用宏定义
Y1=h/2*(f1(x)+f1(y)+2*sum1(x,y,z));
//梯形法公式
returnY1;
//返回梯形法得到的1+x*x的定积分的值
doubleF2(doublex,doubley,intz)
doubleh,Y2;
Y2=h/2*(f2(x)+f2(y)+2*sum2(x,y,z));
//梯形法公式,调用f2,sum2函数
returnY2;
//返回梯形法得到的1+x+x*x+x*x*x的定积分的值
doublef1(doubleu)
doubley1;
//定义变量
y1=u*u+1;
returny1;
//返回值
doublef2(doublev)
doubley2;
//定义变量
y2=1+v+v*v+v*v*v;
returny2;
//返回值
doublesum1(doublec,doubled,inte)
doubleh=HIGH1(c,d,e);
doubles1=0;
for(inti=1;
i<
=e-1;
i++)//for循环
{
doubleg=c+i*h;
s1+=f1(g);
}
returns1;
doublesum2(doublep,doubleq,intr)
doubleh=HIGH1(p,q,r);
//引用宏定义
doubles2=0;
=r-1;
doubleg=p+i*h;
s2+=f2(g);
returns2;
voidintegralts(doublex,doubley,intz,double(*f)(double,double,int))//辛普生法
//函数指针
doubleF3(doublex,doubley,intz)
h=HIGH2(x,y,z);
Y1=h/3*(f3(x)+f3(y)+4*sum5(x,y,z)+2*sum6(x,y,z));
//调用f3,sum5,sum6函数
doubleF4(doublex,doubley,intz)
Y2=h/3*(f4(x)+f4(y)+4*sum3(x,y,z)+2*sum4(x,y,z));
doublef3(doubleu)
doubley1=1+u*u;
doublef4(doublev)
doubley2=1+v+v*v+v*v*v;
doublesum5(doublep,doubleq,intr)
doubleh=HIGH2(p,q,r);
doubles=0;
=2*r-1;
i+=2)//for循环
s+=f3(g);
returns;
doublesum6(doublep,doubleq,intr)
for(inti=2;
=2*r-2;
doublesum3(doublec,doubled,inte)
doubleh=HIGH2(c,d,e);
=2*e-1;
i+=2)
s+=f4(g);
doublesum4(doublec,doubled,inte)
=2*e-2;
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
复习了函数和函数指针部分的内容,通过运用函数调用,for循环以及累加和运算,经过反复调试,将近一周的时间,终于完成了课程设计,感觉很充实,进一步熟悉了函数的运用,进步很大,同时课设过程中也是遇到很多困难,通过和同学的讨论和向老师的请教,终于完成了课程设计。
2、对课题提出更完善的方案
改程序,使一次运行中,可以输入多组数据,并进行计算,在输出结果中可以直观的比较出梯形法与辛普生法求定积分的精度问题。
五、收获及心得体会
1、通过本次课程设计,自己在哪些方面的能力有所提高。
熟悉了函数和函数指针的知识,以及for循环和函数累加和的应用。
提高了自学能力,通过不断地调试程序,不断的改进,在此过程中,,磨砺了自己的毅力,最终程序成功运行,更增强了今后在学习中的自信。
2、收获和心得体会。
1)首先要有耐心;
2)增强自学能力,不会就问,或查资料;
3)锻炼自己的意志,要能坚持,不放弃,要自信。
日期:
2012年06月28日