【洛谷 P4525】 【模板】自適應辛普森法 1

自適應辛普森法,用於求定積分。
原理是不斷二分區間直到區間的積分和二次函數的積分擬合程度足夠高,然後用二次函數的積分值來代替原積分值。

#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define pb push_back
#define rep(i, m, n) for(int i = (m); i <= (n); ++i)
#define dop(i, m, n) for(int i = (m); i >= (n); --i)
#define all(x) x.begin(), x.end()
#define Open(s) freopen(s,"r",stdin);
#define Write(s) freopen(s,"w",stdout);
using namespace std;
typedef long long ll;
template <class T> void chkmin(T &a, T b){ if(a > b) a = b; }
template <class T> void chkmax(T &a, T b){ if(a < b) a = b; }
template <class T> T aabs(T a){ return a > 0 ? a : -a; }
const int N = 200010;
double a, b, c, d, L, R;
double f(double x){
	return (c*x + d) / (a*x + b);
}
double simpson(double l, double r){
	double mid = (l + r) / 2;
	return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6;
}
double asr(double l, double r, double eps, double ans){
	double mid = (l + r) / 2;
	double fl = simpson(l, mid), fr = simpson(mid, r);
	if(fabs(fl + fr - ans) <= 15 * eps) return fl + fr + (fl + fr - ans) / 15;
	return asr(l, mid, eps/2, fl) + asr(mid, r, eps/2, fr);
}
int main(){
	cin >> a >> b >> c >> d >> L >> R;
	cout << setprecision(6) << fixed << asr(L, R, 1e-6, simpson(L, R)) << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章