Skip to content

自适应辛普森积分 ​

cpp
const double eps=1e-12;
double a,b,c,d,L,R;
double f(double x){
    return (c*x+d)/(a*x+b);
}
double simpson(double l,double 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){
    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);
}
void solve(){
    cin>>a>>b>>c>>d>>L>>R;
    cout<<setprecision(6)<<fixed<<asr(L,R,simpson(L,R))<<"\n";
}