Simpson公式的话是一个对于三次及以下函数成立的连续区间求定积分的公式.(好像还有许多其他的公式……)
虽然他是一个普通的定积分公式,但是他不仅可以用来求不规则函数的定积分还可以用来瞎搞求面积,你可以把用这个式子求面积看成是对于定积分本质的运用,也可以直接把图像看成函数,我习惯于按照后者来理解.
http://blog.csdn.net/greatwall1995/article/details/8639135
上面那个博客已经把Simpson积分说的已经比较明白了.
http://blog.csdn.net/xl2015190026/article/details/53518077
上面这个博客里提到了对于Simpson积分的修正——I.乘15 II.把精度劈半
但是据我的经验,不修正才稳啊.
对于自适应Simpson积分的代码实现,在递归的过程中,除了左右端点以外,其他的参量可以根据个人喜好与具体情况选择性地传入.
hdu1724:Ellipse *真尼玛裸
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> typedef double db; const db eps=1e-4; db K,B; inline db f(db x){ return std::sqrt(K*x*x+B); } inline db calc(db l,db r){ return (f(l)+4*f((l+r)*0.5)+f(r))*(r-l)/6; } inline db simpson(db l,db r){ db mid=(l+r)*0.5; if(std::fabs(calc(l,mid)+calc(mid,r)-calc(l,r))<eps)return calc(l,r); return simpson(l,mid)+simpson(mid,r); } int main(){ int T,a,b,l,r;scanf("%d",&T); while(T--){ scanf("%d%d%d%d",&a,&b,&l,&r); K=-(db)(b*b)/(a*a),B=b*b; printf("%.3f\n",simpson(l,r)*2); } }