数值计算方法上学到了辛普森积分,但是都是在讲非自适应的,包括实验做的龙贝格方法。ACM上用来求一段图形面积则是用自适应辛普森积分来求。找了一道模板题过过瘾。
选用了kuangbin的模版自适应simpson积分。
代码如下:
#include<bits/stdc++.h>
using namespace std;
double s, e;
double F(double x){ //这里自定义函数
return sqrt((1 - x * x / s / s) * e * e);
}
double simpson(double a,double b){ //返回区间[a,b]的三点辛普森值
double c = a + (b - a) / 2.0;
return (F(a) + 4 * F(c) + F(b)) * (b - a) / 6.0;
}
double asr(double a,double b,double eps,double A){ //自适应辛普森递归过程
double c = a + (b - a) / 2.0; //A为区间[a,b]的三点辛普森值
double L = simpson(a,c), R = simpson(c,b);
if(fabs(L + R - A) <= 15 * eps) return L + R + (L + R - A) / 15.0;
return asr(a,c,eps/2.0,L) + asr(c,b,eps/2.0,R);
}
double asr(double a,double b,double eps){ //自适应辛普森主过程
return asr(a,b,eps,simpson(a,b));
}
int main(){
int N;
double l, r;
cin >> N;
while(N--){
cin >> s >> e >> l >> r;
printf("%.3lf\n", 2.0 * asr(l, r, 1e-6));
}
return 0;
}