自适应辛普森算法

发布时间 2023-04-09 20:30:00作者: 青阳buleeyes

名字很高大上,事实上是计算机与数学深度结合后诞生的一种算法。

求积分,我们知道一定存在一个函数,保证

事实上,我们并不需要其中微不足道的那部分,只需保证我们所需的精度即可

 

 

 

 

 

 

 

 

#include<bits/stdc++.h>
#define int long double
using namespace std;
const int N=1e6+10;
int a,b,c,d,l,r;
int f(int x){
    return (c*x+d)/(a*x+b);
}
int simpson(int l,int r){
    int mid=(l+r)/2;
    return (r-l)*(f(l)+f(r)+4*f(mid))/6;
}
int adaptiveSimpson(int l,int r,int eps,int res,int dep){
    double mid=(l+r)/2,L=simpson(l,mid),R=simpson(mid,r);
    if(abs(L+R-res)<=15*eps&&dep<0)
        return L+R+(L+R-res)/15;
    return adaptiveSimpson(l,mid,eps/2,L,dep-1)+
        adaptiveSimpson(mid,r,eps/2,R,dep-1);
}
int calc(int l,int r,int eps){
    return adaptiveSimpson(l,r,eps,simpson(l,r),12);
}
signed main(){
    cin>>a>>b>>c>>d>>l>>r;
    printf("%.6Lf",calc(l,r,1e-6));
    return 0;
}