自适应辛普森积分

学习博客:https://www.cnblogs.com/Miracevin/p/10774831.html

#include<bits/stdc++.h>

typedef double db;
// https://www.luogu.com.cn/problem/P4525 
db a,b,c,d,l,r;

inline db readb()
{   
    int f=1;db x=0;char s=getchar();
    for( ;!isdigit(s);s=='-' && (f=-1),s=getchar());
    for( ;isdigit(s);x=x*10+s-48,s=getchar());
    if( s=='.' ) for( db l=0.1,s=getchar();isdigit(s);x=x+(s-48)*l,l/=10,s=getchar() );
    return x*f;
}

inline db f( db x ) // 在[l,r] 定积分收敛的函数 
{
    return (c*x+d)/(a*x+b); // 函数  注意运算出现 0^5--- nan 
}

inline db simpson( db l,db r ) //Simpson公式
{
    db mid=(l+r)/2;
    return ( f(l)+4*f(mid)+f(r) )*(r-l)/6;
}

db asr( db l, db r,db eps ,db ans )
{
    db mid=(l+r)/2;
    db ls=simpson(l,mid),rs=simpson(mid,r);
    if( fabs(ls+rs-ans)<=15*eps ) return ls+rs+(ls+rs-ans)/15; //确认精度
    return asr(l,mid,eps/2,ls)+asr(mid,r,eps/2,rs);   //精度不够则递归调用
}

inline db asr( db l,db r,db eps ) { return asr(l,r,eps,simpson(l,r)) ; }

int main()
{
    a=readb(),b=readb(),c=readb(),d=readb();
    l=readb(),r=readb();

    db ans=asr(l,r,1e-6); 
    printf("%.6lf\n",ans);
}
全部评论

相关推荐

点赞 评论 收藏
分享
群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
后来123321:大二两段实习太厉害了,我现在大二连面试都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务