自适应Simpson积分
简介:
Simpson积分是解决一重积分问题的强大公式
由公式可以看出,我们可以通过积分上下界来近似逼近积分的值。
但具体如何实现呢?
我们可以二分区间然后递归的方法来求积分。
由积分的可叠加性:
∫ a b f ( x ) d x = ∫ a c f ( x ) d x + ∫ c b f ( x ) d x \int^b_af(x)dx= \int^c_af(x)dx + \int^b_cf(x)dx ∫abf(x)dx=∫acf(x)dx+∫cbf(x)dx
所以当我们可以将一个误差较大的区间拆成几个小区间,最后再叠加起来求解即可。
具体细节可以参见下面的例题。
例题
HDU1724
裸的Simpson积分,直接套模板即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define MP make_pair
const int INF = 1e9 + 7;
const int N = 100000 + 10;
const int M = 10000 + 10;
const int Q = 1000 + 10;
const int A = 1000 + 10;
const double esp = 1e-10;
ll a,b;
double f(double x){
return b * sqrt(1.0 - (x*x)/(a*a));
}
double Simpson(double l,double r){
return (f(l) + 4*f((l+r)/2.0) + f(r)) * (r - l) / 6.0;
}
double solve(double l,double r){
double mid = (l + r) / 2;
double res = Simpson(l,r);
if(fabs(res - Simpson(l,mid) - Simpson(mid,r)) < esp) return res;
else return solve(l,mid) + solve(mid,r);
}
int main(){
int T;
cin >> T;
while(T--){
double l,r;
cin >> a >> b >> l >> r;
printf("%.3f\n",2 * solve(l,r));
}
return 0;
}