实验六数值积分1山西大学计算机与信息技术学院实验报告姓名学号专业班级课程名称计算方法实验日期成绩指导老师批改日期实验名称实验六数值积分一.实验目的:利用复化梯形公式、复化辛普生公式和龙贝格数值积分公式计算badxxf)(的近似值。二.实验方法:(1)将[a,b]区间n等分,记分点为),1,0,(,ninabhihaxi,并在每个小区间[1,iixx]上应用梯形公式)]()(2)([211bfxfafhTniin(2)在每个小区间[1,iixx]上,用辛普生公式)]()(2)(4)([6111021bfxfxfafhSniiniin式中21ix为[1,iixx]的中点,即hxxii2121(3)先用梯形公式计算)]()([2/)(1bfafabT,然后,将求积区间(a,b)逐次折半的方法,令区间长度).,,1,0(,2)(niabhi计算nknnkhafhTT12))21((2/2/1,式中in2。于是,得到辛普生公式)/3T-(n22nnnTTS。柯斯特求积公式15/)(22nnnnSSSC。实验六数值积分2最后,得龙贝格求积公式63/)(22nnnnCCCR。利用上述各公式计算,直到相邻两次的积分结果之差满足精度要求。三.实验内容利用复化梯形公式、复化辛普生公式和龙贝格数值积分公式计算10221214dxxdxxeex和的近似值,要求误差为71021,将计算结果与精确值比较,并对计算结果进行分析(计算量、误差)四.实验程序:复合梯形公式:#includestdio.h#includemath.h#defineesp0.5e-7#definea1#defineb2#definec0#defined1#defineE2.71828182845904523536#definef1(x)(x*pow(E,x))#definef2(x)(4/(1+(x*x)))voidfun1(){inti,n,k=0;doubleh,q,t,g;n=1;h=(double)(b-a)/2;t=h*(f1(a)+f1(b));do{k++;q=t;g=0;for(i=1;i=n;i++)g+=f1((a+(2*i-1)*h));t=(q/2)+(h*g);n*=2;h/=2;}while(fabs(t-q)esp);printf(函数1分了%d次:\n,k);printf(积分结果为:);实验六数值积分3printf(%12.8lf\n,t);}voidfun2(){inti,n,k=0;doubleh,q,t,g;n=1;h=(double)(d-c)/2;t=h*(f2(c)+f2(d));do{k++;q=t;g=0;for(i=1;i=n;i++)g+=f2((c+(2*i-1)*h));t=(q/2)+(h*g);n*=2;h/=2;}while(fabs(t-q)esp);printf(函数2分了%d次:\n,k);printf(积分结果为:);printf(%12.8lf\n,t);}intmain(){printf(//***********复合梯形公式***********//\n);fun1();fun2();return0;}复合辛普生公式代码:#includestdio.h#includemath.h#defineesp0.5e-7#definea1#defineb2#definec0#defined1#defineE2.71828182845904523536#definef1(x)(x*pow(E,x))#definef2(x)(4/(1+(x*x)))实验六数值积分4voidfun1(){inti,n,k=0;doublef1,f2,f3,h,s0,s;f1=f1(a)+f1(b);f2=f1(((double)(b+a)/2));f3=0;s=((double)(b-a)/6)*(f1+4*f2);n=2;h=(double)(b-a)/4;do{k++;f2+=f3;s0=s;f3=0;for(i=1;i=n;i++)f3+=f1((a+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while(fabs(s-s0)esp);printf(函数1分了%d次数:\n,k);printf(积分结果为:);printf(%12.8lf\n,s);}voidfun2(){inti,n,k=0;doublef1,f2,f3,h,s0,s;f1=f2(d)+f2(c);f2=f2(((double)(d+c)/2));f3=0;s=((double)(d-c)/6)*(f1+4*f2);n=2;h=(double)(d-c)/4;do{k++;f2+=f3;s0=s;f3=0;for(i=1;i=n;i++)实验六数值积分5f3+=f2((c+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while(fabs(s-s0)esp);printf(函数1分了%d次数:\n,k);printf(积分结果为:);printf(%12.8lf\n,s);}intmain(){printf(//***********复合辛普生公式***********//\n);fun1();fun2();return0;}龙贝格数值积分公式代码:#includestdio.h#includemath.h#defineesp0.5e-7#definea1#defineb2#definec0#defined1#defineE2.71828182845904523536#definef1(x)(x*pow(E,x))#definef2(x)(4/(1+(x*x)))doublet1[100][100];doublet2[100][100];voidfun1(){intn,k,i,m,w=0;doubleh,g,p;h=(double)(b-a)/2;t1[0][0]=h*(f1(a)+f1(b));k=1;n=1;do{w++;g=0;for(i=1;i=n;i++)实验六数值积分6g+=f1((a+((2*i-1)*h)));t1[k][0]=(t1[k-1][0]/2)+(h*g);for(m=1;m=k;m++){p=pow(4,(double)(m));t1[k-m][m]=(p*t1[k-m+1][m-1]-t1[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while(fabs(t1[0][m]-t1[0][m-1])esp);printf(函数1分了%d次:\n,w);printf(积分结果为:\n);printf(%12.8lf\n,t1[0][m]);}voidfun2(){intn,k,i,m,w=0;doubleh,g,p;h=(double)(d-c)/2;t2[0][0]=h*(f2(c)+f2(d));k=1;n=1;do{w++;g=0;for(i=1;i=n;i++)g+=f2((c+((2*i-1)*h)));t2[k][0]=(t2[k-1][0]/2)+(h*g);for(m=1;m=k;m++){p=pow(4,(double)(m));t2[k-m][m]=(p*t2[k-m+1][m-1]-t2[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while(fabs(t2[0][m]-t2[0][m-1])esp);printf(函数2分了%d次:\n,w);实验六数值积分7printf(积分结果为:\n);printf(%12.8lf\n,t2[0][m]);}intmain(){printf(//***********龙贝格数值积分公式***********//\n);fun1();fun2();return0;}五、结果分析复合梯形公式结果截图:复合辛普生公式结果截图:龙贝格数值积分公式结果截图:六、结果分析1在求积分时,常把积分区间分成若干小区间,在每个小区间行采用次数不高的求积公式,如梯形、辛普生然后再把它们加起来,得到整个区间上的求积公式,这就是复合求实验六数值积分8积公式的基本思想。2龙贝格采用了变步长的求解公式,可以根据精度的要求,在计算过程中适当调整步长,使计算结果逐步逼近精确值,但是近似值序列收敛于积分精确值的速度较慢。3复化梯形公式、复化辛普生公式和龙贝格数值积分公式都有着较高的精度,其中龙贝格数值积分公式精度基本上是最高的。而在对积分区间作同样的分割的条件下,复合辛普生求积公式比复合梯形公式的计算精度高。4在计算速度方面,从表中可看出,复化梯形公式的等分数要比其它两个大得多,且从计算结果上很容易知道复化辛普生公式也比复化梯形公式的收敛速度快得多。而龙贝格数值积分公式的计算量是最少的。由上可知,龙贝格数值积分公式在精度和计算速度上都是最高的。而使用龙贝格公式通过对梯形值进行外推加速的处理,能使精度快速提高。教师评语