zoukankan      html  css  js  c++  java
  • 自适应辛普森法

    ## Simpson公式

    (f(x))为原函数,$g(x)=Ax2+Bx+C $ 为拟合后的函数,则有:

    [int_{a}^{b}f(x)dx approx int_{a}^{b}Ax^2+Bx+C = frac{A}{3}(b^3-a^3)+frac{B}{2}(b^2-a^2)+C(a-b) =frac{(b-a)}{6}(f(a)+f(b)+4f(frac{a+b}{2})) ]

    然后就得到了Simpson公式

    [int_{a}^{b}f(x)dx approx frac{(b-a)}{6}(f(a)+f(b)+4f(frac{a+b}{2})) ]

    所以

    inline double simpson(double l,double r)
    {
        double mid=(l+r)/2.;
        return (r-l)*(f(l)+f(r)+4.*f(mid))/6.;
    }
    

    洛谷P4525 【模板】自适应辛普森法1

    传送门

    Solution

    考虑二分区间,当精度满足时,终止递归


    Code 

    #include<bits/stdc++.h>
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define db double
    db a,b,c,d;
    inline db f(db x){return (c*x+d)/(a*x+b);}
    inline db simpson(db l,db r){return (f(l)+4.*f((l+r)/2.)+f(r))*(r-l)/6.;}
    inline db asr(db l,db r,db ans,db eps)
    {
        db mid=(l+r)/2,L=simpson(l,mid),R=simpson(mid,r);
        if(std::fabs(L+R-ans)<=14*eps) return L+R+(L+R-ans)/14;
        return asr(l,mid,L,eps/2)+asr(mid,r,R,eps/2);
    }
    int main()
    {
        db L,R;
        scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R);
        printf("%.6lf",asr(L,R,simpson(L,R),1e-6));
        return 0;
    }
    

    洛谷P4526 【模板】自适应辛普森法2

    传送门

    Solution

    • (a<0)时原积分发散

    [f(x)=x^{frac{a-x^2}{x}}=frac{1}{x^{frac{x^2-a}{x}}} ]

    (x)趋近于0时,(frac{x^2-a}{x}) 趋近于(infty),(f(x))趋近于(infty)

    • (a>0)时原积分收敛

    不再赘述。。。

    然后我们假装是(( eps , 20 ))的定积分


    Code 

    #include<bits/stdc++.h>
    #define db double
    db a;
    inline db f(db x){return pow(x,a/x-x);}
    inline db simpson(db l,db r){return (f(l)+f(r)+4.0*f((l+r)/2.))*(r-l)/6.0;}
    inline db asr(db l,db r,db eps,db ans)
    {
        db mid=(l+r)/2.0,left=simpson(l,mid),right=simpson(mid,r);
        if(std::fabs(left+right-ans)<eps*15)return (left+right+(left+right-ans)/15.0);
        else return asr(l,mid,eps/2,left)+asr(mid,r,eps/2,right);
    }
    int main()
    {
        scanf("%lf",&a);
        if(a<0)puts("orz");
        else printf("%.5lf
    ",asr(1e-8,20,1e-8,simpson(1e-8,20)));
        return 0;
    } 
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    sql server 2008收缩数据库日志
    小题大做之MySQL 5.0存储过程编程入门(收藏)
    精进不休 .NET 4.0 (5) C# 4.0 新特性之并行运算(Parallel) (收藏)
    GridView 格式化<收藏>
    MySql捕获sql语句异常的方法
    Windows7发生VS2005无法调试Web项目
    mysql 5.0存储过程学习总结《转载》
    HashMap和Hashtable及HashSet的区别
    iphone 界面实现下拉列表
    Java中堆和栈的区别
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/10201156.html
Copyright © 2011-2022 走看看