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

    辛普森定理:

    对于一段函数f在[l,r]范围内的面积∫(r,l)f(x)dx,我们可以由辛普森定理得到下列式子(∫是积分的意思)。

    即:∫(r,l)f(x)dx=(r-l)/6*(f(l)+4f((l+r)/2)+f(r))。

    但问题是这样做是把f(x)在[l,r]范围内看做一个二次函数来算的,所以精度并不高。因此,我们需要一种可以在较复杂函数中正确算出面积的自适应希普森。

    自适应辛普森其实就是二分递归用辛普森定理来求面积。

    S(l,r)=S(l,m)+S(m,r)

    首先我们先算出S(l,r),S(l,m),S(m,r)

    如果|S(l-r)-S(l,m)-S(m,r)|<你需要的精度,就返回S(l,r),否则返回F(l,m)+F(m,r)。

    还蛮好理解的,下面是代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    #define il inline
    #define db double
    using namespace std;
    il db f(db x)
    {
        return (f(x));//f函数 
    }
    il db simpson(db l,db r)
    {
        db m=(l+r)/2;
        return (f(l)+f(r)+4*f(m))*(r-l)/6;//辛普森定理 
    }
    db asr(db l,db r,db eps,db sum)//eps是精度,sum是simpson(l,r) 
    {
        db m=(l+r)/2;
        db L=simpson(l,m),R=simpson(m,r);//二分的左边和右边 
        if(fabs(sum-L-R)<=15*eps)//在精度范围内 
        return L+R+(L+R-sum)/15.0;
        else
        return asr(l,m,eps/2,L)+asr(m,r,eps/2,R);
    }
    int main()
    {
        return 0;
    }
    PEACE
  • 相关阅读:
    VSTO安装部署(完美解决XP+2007)
    尝试Office 2003 VSTO的开发、部署
    数据容量大小
    Nginx 学习
    Windows环境下使用Nginx搭建负载均衡
    HTML块元素与内联元素嵌套规则
    js中try、catch、finally的执行规则
    总结下var、let 和 const 的区别
    解决window.onload延迟加载问题
    移动端meta设置大全
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/7263335.html
Copyright © 2011-2022 走看看