自适应辛普森积分问题
解题思路:
本题要求一个函数的积分,是一个自适应辛普森积分的模板题。
可参考 自适应辛普森积分的相关概念
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps = 1e-12;
double f(double x) //求函数 f(x)
{
return sin(x) / x;
}
double simpson(double l, double r) //求 [l, r] 区间内函数的近似面积
{
double mid = (l + r) / 2;
return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6;
}
double asr(double l, double r, double s) //自适应辛普森积分,s 表示 [l, r] 区间内函数的近似面积
{
double mid = (l + r) / 2;
double left = simpson(l, mid), right = simpson(mid, r); //计算左、右区间的近似面积
if(fabs(left + right - s) < eps) return left + right; //如果误差足够小,直接返回近似面积
return asr(l, mid, left) + asr(mid, r, right); //否则进一步递归
}
int main()
{
double l, r;
scanf("%lf%lf", &l, &r);
printf("%lf\n", asr(l, r, simpson(l, r))); //自适应辛普森积分
return 0;
}