辛普森积分法的学习
微积分是许多学科的基础,在编程方面也有很大的作用,程序里写积分很多时候是用梯形法,今天学了一种叫辛普森积分的方法,感觉很好用只不过辛普森积分法在区间较大时误差比较大,所以一般用二分减小区间大小以获得更加精确的结果。现在以求两个圆柱体相交部分的体积为例来学习辛普森积分:给出的是两个圆柱的半径,已知两个圆柱体垂直相交。
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #define eps 1e-9 using namespace std; int r1,r2; double f(double x){ return 8.0*(sqrt(r1*r1-x*x))*(sqrt(r2*r2-x*x)); } double simpson(double x,double y){ return (y-x)*(f(x)+f(y)+4*f((x+y)/2))/6.0; } double jifen(double x,double y){ double ans=simpson(x,y);//二分区间积分减小误差 double mid=(x+y)/2.0; double left=simpson(x,mid); double right=simpson(mid,y); if(fabs(ans-(left+right))<eps)return ans; else{ return jifen(x,mid)+jifen(mid,y); } } int main() { while(~scanf("%d%d",&r1,&r2)){ if(r1<r2) swap(r1,r2); double x=1.0*r1; double y=1.0*r2; printf("%.4lf\n",jifen(0.0,y)); } return 0; }