zoukankan      html  css  js  c++  java
  • 辛普森积分法

    /*
     * 辛普森积分公式:sum(l,r)=( f(l)+f(r)+4*f((l+r)/2) ) * (r-l) / 6
     * 解: 对 f 函数在 (l,r) 的积分可以用 以上函数拟合
     *
     * 欲对 (l,r) 的一段函数积分并给出了精度要求
     * 可以对此段区间,递归使用上述公式(以设置的精度作为递归终点)即可以得到满足精度要求的答案。
     *
     */
    
    
    #include<bits/stdc++.h>
    using namespace std;
    
    //读入优化
    void in(int &x){
        x=0;char c=getchar();
        int y=1;
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
        x*=y;
    }
    void o(int x){
        if(x<0){x=-x;putchar('-');}
        if(x>9)o(x/10);
        putchar(x%10+'0');
    }
    
    //设置需要控制的精度
    const double eps=1e-7;
    
    double a;//一个变量
    
    //需要积分的函数   例: a^(a/x-x)
    double F(double x){
        return pow(x,a/x-x);
    }
    
    
    double simpson(double l,double r){ //辛普森拟合积分计算函数
        return ( F(l)+F(r)+4.0*F((l+r)/2.0) ) * (r-l) / 6;
    }
    
    
    double simpson(double l, double r, double exps, double val) {//递归积分函数
        double mid = (l + r) / 2; // 中点
        double lval = simpson(l, mid), rval = simpson(mid, r);//lval: 左半部分的辛普森积分 , rval 右半部分的辛普森积分
        if (fabs(lval + rval - val) <= 15 * exps)//val:本段区间的积分  if(精度满足要求)
            return lval + rval + (lval + rval - val) / 15;//返回答案
        return simpson(l, mid, exps / 2, lval) + simpson(mid, r, exps / 2, rval);
    }
    
    double simpson(double l, double r, double exps) {
        return simpson(l, r, exps, simpson(l, r));//调用
    }
    
    signed main() {
        scanf("%lf", &a);//
        printf("%.5lf", simpson(1e-11, 30.0, eps));//eps初始化为-e7;
        return 0;
    }
    
  • 相关阅读:
    诗人就是“情场浪子”的代名词?
    微博营销,开启营销的新时代
    网店成功之道:卖家应有4种心态(实战交流)
    一枚钉子前进
    推动中国文学的发展,我义不容辞
    微博营销,再次引爆网络江湖
    微博营销,不仅仅是粉丝
    邮件群发软件版本升级公告
    如何让自己在浩瀚的网海中脱颖而出
    如何定时关机【windows/linux】
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/14279429.html
Copyright © 2011-2022 走看看