zoukankan      html  css  js  c++  java
  • 【Learning】辛普森积分

    辛普森积分

      
      这种积分法很暴力:只要求你实现出函数求值(f(x))
      
      使用辛普森积分,我们可以求出函数一段区间([l,r])的近似积分。记(mid=frac{l+r}2),有:

    [int_l^rf(x);dxapprox simpson(l,r)=frac{f(l)+4f(mid)+f(r)}6*(r-l) ]

      
      
      其中1,4,1称作科特斯系数。
      
    ​  如果

    [simpson(l,r)approx simpson(l,mid)+simpson(mid,r) ]

      那么我们认为函数在([l,r])的近似积分已经足够精确,可以直接返回(simpson(l,r))
      
      否则,我们需要递归计算([l,mid])([mid,r])的积分,相加并返回。
      
      伪代码如下:
      

    double simpson(double l,double r){
        double mid=(l+r)*0.5;
        return (f(l)+4*f(mid)+f(r))*(r-l)/6;
    }
    double solve(double l,double r){
        double mid=(l+r)*0.5,midl=(l+mid)*0.5,midr=(mid+r)*0.5;
        if(fabs(simpson(l,r)-simpson(l,mid)+simpson(mid,r))<EPS) 
            return simpson(l,r);
        return solve(l,mid)+solve(mid+1,r);
    }
    

      
      整体算法的耗时,一在于(f(x))的求值,应实现得尽量够快;二在于(EPS)的设置,这决定了程序递归的深度,因为(EPS)是程序判断当前计算精度是否足够高的决策标准。(EPS)越小,精度越大,但耗时也相应越高。
      
      总体的时间复杂度是非常玄学。辛普森积分在应用到某一些十分平滑的函数上时效率一般非常高,可是不排除有丧心病狂出题人专门卡哦。

  • 相关阅读:
    Gulp实现web服务器
    移动端事件介绍
    Javascript设计模式详解
    H5移动端知识点总结
    【干货理解】理解javascript中实现MVC的原理
    [干货]数据交互与本地存储
    深入理解Javascript面向对象编程
    javascript数组的知识点讲解
    javascript函数式编程要掌握的知识点讲解
    深入浅出的javascript的正则表达式学习教程
  • 原文地址:https://www.cnblogs.com/RogerDTZ/p/9219894.html
Copyright © 2011-2022 走看看