题解 P4525 【【模板】自适应辛普森法1】
Smallbasic · · 题解
自适应辛普森法的模板。
积分的朴素求法就是用很多个小矩形来近似,但这样精度和时间都不高,考虑用其它的方法。
自适应辛普森发就是用二次函数来近似的积分。
假设用来近似的二次函数为
那么函数
由定义得,只需证明如下式子:
因为有公式:
所以:
那么我们就可以得到:
所以,由牛顿-莱布尼茨公式可以得到:
胡乱化简,最后得到:
这样我们就得到自适应辛普森法的公式啦!
对于这道题,直接套公式即可。
但是这样精度可能会不够,我们就二分区间,直到达到精度就返回,详见代码吧:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
double a, b, c, d, L, R;
inline double f(double x) {
return (c * x + d) / (a * x + b);
}
inline double simpson(double l, double r) {
return (f(r) + f(l) + 4 * f((l + r) / 2)) * (r - l) / 6;
}
inline double getans(double l, double r) {
double mid = (l + r) / 2;
if (fabs(r - l) <= 1e-5) return simpson(l, r);
return getans(l, mid) + getans(mid, r);
}
int main() {
scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &L, &R);
printf("%.6lf", getans(L, R));
return 0;
}