P4525 【模板】自适应辛普森法 1
\(\text{Solution}\)
\(\text{Simpson}\) 公式:
\[\int_l^r f(x) {\mathrm d}x = \frac{(r-l)(f(l)+f(r)+4f(\frac{l+r}2))} 6
\]
然后就是自适应的过程
\(\text{Code}\)
#include <cstdio>
#include <cmath>
#define IN inline
using namespace std;
double a, b, c, d, L, R;
IN double F(double x) {return (c * x + d) / (a * x + b);}
IN double Simpson(double l, double r) {return (r - l) * (F(l) + F(r) + F((l + r) / 2) * 4) / 6;}
IN double ASR(double l, double r, double eps, double ans) {
double mid = (l + r) / 2, sl = Simpson(l, mid), sr = Simpson(mid, r);
if (fabs(sl + sr - ans) < eps) return sl + sr;
return ASR(l, mid, eps / 2, sl) + ASR(mid, r, eps / 2, sr);
}
int main() {
scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &L, &R);
printf("%.6lf\n", ASR(L, R, 1e-7, Simpson(L, R)));
}