实 验 报 告
四、实验结果(含算法说明、程序、数据记录及分析等,可附页) #include<stdio.h> #include<stdlib.h> #include<iostream> #include<math.h> using namespace std; double f(double x) { return x/(4+x*x); } int main() { int a,b,n,i,j; double s,x,h,e,T[30][30]; printf("请输入区间 a,b 和 n 值:\n"); scanf("%d%d%d",&a,&b,&n); printf("此题求[%d,%d]区间的函数 x/(4+x*x)值\n",a,b); x=1.0*a;h=1.0*(b-a)/n; s=0; for(i=1;i<n;i++) { x=x+h; s=s+f(x); } s=h*(f(a)+2*s+f(b))/2; printf("复合梯形求积结果是 %lf\n",s); s=0; x=1.0*a; for(i=1;i<=n/2;i++) { x=a+(2*i-1)*h; s+=2*f(x)+f(x+h); } s=h/3*(f(a)-f(b)+2*s); printf("复合吉普森求积结果是 %lf\n",s); printf("输入取值精度 e:\n"); scanf("%lf",&e); s=0; memset(T,0,sizeof(T)); T[0][0]=0.5*(b-a)*(f(a)+f(b)); i=1; do { s=0; for(n=1;n<=pow(2,i-1);n++) s=s+f(a+1.0*(2*n-1)*(b-a)/pow(2,i)); T[i][0]=0.5*T[i-1][0]+1.0*(b-a)*s/pow(2,i); for(j=1;j<=i;j++) T[i][j]=(1.0*pow(4,j)*T[i][j-1]-T[i-1][j-1])/(pow(4,j)-1); i++; }while(fabs(T[i-1][i-1]-T[i-2][i-2])>=e);
printf("龙贝格求积结果是 for(n=0;n<=i-1;n++) { printf("\n"); for(j=0;j<=n;j++) printf("%lf ",T[n][j]); } system("pause"); return 0; }
%lf\n",T[i-1][i-1]);
五、实验思考题 复合梯形求积公式是将积分区间分成 n 个很小的区间,然后将各个小区间的面积相加就得到 整个积分区间的积分,当分成的区间个数 n 无穷大时,求得的面积就等于积分的精确值;复合辛普 森求积公式是在每个子区间[xn,xn+1]上使用带余项的 Simpson 公式求和得出的;龙贝格求积公式 也称为逐次分半加速法,它是在梯形公式、辛普森公式和科特斯公式之间的关系的基础上,构造出 一种加速计算积分的方法,作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。
六、实验总结(
含实验心得体会,收获与不足等) 通过这次实验,我了解了复合梯形、复合辛普森和龙贝格求积的基本原理,熟悉了相关的基本 概念,通过编程完成锻炼了我的实践能力与动手能力,为以后的学习打下了坚实的基础。使我对算 法上机实践有了更深的理解。