辛普森公式

这里用一个抛物线求弧长的例子给出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 }
复制代码

 

posted @   Yan_Bin  阅读(1149)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示