自适应Simpson积分模版

自适应Simpson积分模版

cpp
struct AdaptiveSimpson {
    function<double(double)> f;

    AdaptiveSimpson(function<double(double)> func) : f(func) {}

    double simpson(double l, double r) {
        double mid = (l + r) / 2;
        return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6;
    }

    // S: 区间 [l, r] 已算好的 simpson 估值,避免重复求值
    double solve(double l, double r, double eps, double S) {
        double mid = (l + r) / 2;
        double L = simpson(l, mid), R = simpson(mid, r);
        if (fabs(L + R - S) <= 15 * eps) return L + R + (L + R - S) / 15;
        return solve(l, mid, eps / 2, L) + solve(mid, r, eps / 2, R);
    }

    double integrate(double l, double r, double eps = 1e-8) {
        return solve(l, r, eps, simpson(l, r));
    }
};
PAM模版
矩阵树定理模版