这里用一个抛物线求弧长的例子给出Simpson公式的代码:
1 #include <cstdio> 2 #include <cmath> 3 const double eps = 1e-5; 4 // 被积函数F 5 double a; 6 double F(double x){ 7 return sqrt(1 + 4 * a * a * x * x); 8 } 9 // 三点Simpson法。这里要求F是一个全局函数,F也就是被积函数 10 double simpson(double a,double b){ 11 double c = a + (b - a) / 2; 12 return (F(a) + 4 * F(c) + F(b)) * (b - a) / 6; 13 } 14 // 自适应Simpson公式(递归过程)。已知整个区间[a,b]上的三点Simpson值A 15 double asr(double a,double b,double eps,double A){ 16 double c = a + (b - a) / 2; 17 double L = simpson(a,c),R = simpson(c,b); 18 if(fabs(L + R - A) <= 15 * eps) return L + R + (L + R - A) / 15.0; 19 return asr(a,c,eps / 2,L) + asr(c,b,eps / 2,R); 20 } 21 // 自适应Simpson公式(主过程) 22 double asr(double a,double b,double eps){ 23 return asr(a,b,eps,simpson(a,b)); 24 } 25 // 用自适应Simpson公式计算宽为w 26 double parabola_arc_length(double w,double h){ 27 a = 4.0 * h / (w * w); // 修改全局变量a,从而影响F的行为 28 return asr(0,w / 2,eps) * 2; 29 }