一、实验目的
1、理解复合辛普森公式的方法原理; 2、利用复合辛普森公式计算积分。
二、实验步骤
1.算法原理 复合辛普森原理:
将区间[a,b]划分为n等分,在每个子区间xk,xk1上采用辛普森公式,若记
xk12xk1h,则得 2 Ibaf(x)dxf(x)dx
k0n1hn1 [f(xk)4f(xk12)f(xk)]Rn(f).
6k0记
hn1 Sn[f(xk)4f(xk12)f(xk)]
6k0n1n1h [f(a)4f(xk12)2f(xk)f(b)],
6k0k1称为复合辛普森求积公式,其余项为
hh4n1(4)()f(k),k(xk,xk1). Rn(f)ISn1802k0于是当f(x)C[a,b]时,与复合梯形公式相似有 Rn(f)ISn44bah4(4)()f(),(a,b) 1802易知误差阶为h,收敛性是显然的,实际上,只要f(x)C[a,b]则可得到收敛性,即 limSnnbaf(x)dx
此外,由于Sn中求积公系数均为正数,故知辛普森公式计算稳定。 2.算法步骤
复合辛普森:
首先将区间[a,b]划分为n等分,在每个子区间xk,xk1上采用辛普森公式,若记
xk12xk
1h,则得 2n1n1hn1hSn[f(xk)4f(xk12)f(xk)][f(a)4f(xk12)2f(xk)f(b)]
6k06k0k1 3.程序流程图
开始 输入数据a,b,n k0,hba , xkakhn n1hn1hTn[f(xk)f(xk1)][f(a)2f(xk)f(b)]2k02k1n1n1hSn[f(a)4f(xk12)2f(xk)f(b)], 6k0k1R1ITn ,R2ISn kk1 输出R1,R2结束
三.程序代码
#include #include #define eps 0.000001 //计算精度 float func(double x) //% func-- 求积函数(函数文件) { while(x==0) return 1; double y; y=(sin(x)/x); return(y); } double bsimpson(double a,double b) //% a, b -- 求积区间 { int i,n; double h,p,e,s; double t1,t2,s1,s2,x; n=1; h=b-a; t1=h*(func(a)+func(b))/2.0; s1=t1; e=eps+1.0; while(e>=eps) { s=0.0; for(i=0;i<=n-1;i++) { x=a+(i+0.5)*h; s=s+func(x); } t2=(t1+h*s)/2.0; s2=(4*t2-t1)/3.0; e=fabs(s2-s1); t1=t2; s1=s2; n=n+n; h=h/2.0; } return(s2); } main() { double a,b,s; printf(\"input a,b=\"); scanf(\"%lf,%lf\ s=bsimpson(a,b); /*用t1代替s1*/ printf(\"s=%lf\\n\ getch(); return 0; } 四、心得体会 通过本次试验,我理解复合辛普森公式的方法原理,并且能利用复合辛普森公式计算积分,在数值分析的理论知识上又有了较大的收获,在进行编程的过程中,我已经基本熟练了数值算法的程序过程,能独立的在有限的时间内完成,这对以后的学习会有很大的帮助。 因篇幅问题不能全部显示,请点此查看更多更全内容