辛普森积分(自适应辛普森公式求积分)

原创 2017年09月11日 20:39:23

自适应辛普森公式求积分

第一回接触辛普森积分,至于这个辛普森是干嘛的呢,在这里就有必要好好地讲一讲了。

来源:辛普森(Simpson)公式是牛顿-科特斯公式当n=2时的情形,也称为三点公式。利用区间二等分的三个点来进行积分插值。其科特斯系数分别为1/6,4/6,1/6。

应用:立体几何中用来求拟柱体体积的公式。

这里就不详细说辛普森公式了,有需要的朋友可以看这里https://baike.baidu.com/item/%E8%BE%9B%E6%99%AE%E6%A3%AE%E5%85%AC%E5%BC%8F/9255085?fr=aladdin

接下来我们好好的说说自适应辛普森公式求积分自适应辛普森公式求积分是很重要的一个知识点,弄懂了自适应辛普森公式求积分就能明白辛普森积分是干嘛的了,

下面的内容是重点!!!:

假设我们求以下积分:

这里写图片描述

比较特殊的情况,就是可以推导出来最后的形式。但是比较一般的情况是,我们只能大致得到一个XY坐标系里的曲线,我们求的就是曲线和X轴所围成的面积。

因此我们有自适应辛普森公式,他会根据实际情况来自动的调整精度。

它的大致过程就是,给定一个要求达到的精度eps,算法就会根据实际情况递归的划分区间。容易近似的地方少划分,不容易近似的地方多划分几份。

具体来讲,我们在以下情况下直接返回结果,否则递归划分区间:

这里写图片描述

具体参考博客:http://blog.csdn.net/frosero/article/details/45799135

下面举个例题:hdu-1724

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1724

题目大意:题目就是求两条线所夹的椭圆的面积。这是个标准的椭圆,其中心在原点。我好像看到了题目连椭圆面积公式都给了,然而并没有任何用,直接上辛普森!

根据椭圆的对称性,我们求x轴上方的面积然后乘以2就是答案。根据椭圆方程x2a2+y2b2=1,构造函数y=。。。其中y>0,然后对此函数进行自适应辛普森积分就可以了。

写完程序过了样例后立马交,TLE,1000ms。结果发现是Eps取的太小了,取了1e-10,随着递归下去,Eps不断除以2,导致不断递归划分,做的次数很多就超时了。这题只要求保留3位小数,所以精度没有太大问题,将Eps改为1e-5立马就AC了,109ms。

ac代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#define ri(n) scanf("%d",&n)
#define oi(n) printf("%d\n",n)
#define rl(n) scanf("%lld",&n)
#define ol(n) printf("%lld\n",n)
#define rep(i,l,r) for(i=l;i<=r;i++)
#define rep1(i,l,r) for(i=l;i<r;i++)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const double eps=1e-5;//这里的eps是整个辛普森应用的关键,至于取多大,得依题目而定
double a,b,l,r;
double f(double x)//这里的f函数是自己根据题目推导出来的,主要还是x有关y的函数
{
    double y=b*sqrt(1.0-(x*x)/(a*a));
    return y;
}
double simpson(double a,double b)//这里是辛普森公式
{
    double c=(a+b)/2.0;
    return (f(a)+f(b)+4.0*f(c))*(b-a)/6.0;
}
double ars(double a,double b,double eps)//这里就是递归求辛普森最重要的一段函数了,
{
    double c=(a+b)/2.0;
    double mid=simpson(a,b),l=simpson(a,c),r=simpson(c,b);
    if(fabs(l+r-mid)<=15*eps)
        return l+r+(l+r-mid)/15.0;
    return ars(a,c,eps/2.0)+ars(c,b,eps/2.0);
}
int main()
{
    int t;
    ri(t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&a,&b,&l,&r);
        printf("%.3lf\n",2.0*ars(l,r,eps));//递归求辛普森
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

哈夫曼树

一、哈夫曼树的概念和定义   什么是哈夫曼树? 让我们先举一个例子。 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例...

“一个程序员的成长史”系列答读者问(2)

“一个程序员的成长史”系列答读者问第二篇。

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

AI大行其道,你准备好了吗?—谨送给徘徊于转行AI的程序员

前言  近年来,随着 Google 的 AlphaGo 打败韩国围棋棋手李世乭之后,机器学习尤其是深度学习的热潮席卷了整个IT界。所有的互联网公司,尤其是 Google 微软,百度,腾讯等巨头,无不在...

xamarin android异步更新UI线程

UI线程简单了解 一些从事web开发的同学,可能对UI线程没有这个概念,没办法,毕竟“UI线程”这个概念只存在一些客户端(window客户端软件、app等)。其实android在子线程中更新UI线程,...

欢迎使用CSDN-markdown编辑器

【bug记录】radio在ie下无法打印选中状态这个bug是这样的,网站上有些报表是需要用户去填写,并提供打印功能的,但是在ie浏览器下,raido标签的选中状态就是打印不出来。 采用的打印插件为:...

Android触摸事件传递机制实践——可拖动、大小切换的SizeSwitchView

出处: 炎之铠邮箱:yanzhikai_yjk@qq.com 博客地址:http://blog.csdn.net/totond 本文原创,转载请注明本出处! 本项目GitHub...
  • totond
  • totond
  • 2017-08-28 15:20
  • 1926

Android热修复技术总结

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化。本篇重点讲解热修复,并对当前流行的热修复技...

如何在eclipse上部署tomcat服务器

如何在eclipse上配置tomcat一、下载tomcat1、 首先你得先安装并配置好了eclipse2、 在这个地址https://tomcat.apache.org/download-80.cgi...

Redis源码剖析和注释(十三)--- 有序集合类型键实现(t_zset)

有序集合类型键实现1. 有序集合命令Redis有序集合命令如下表所示:Redis 有序集合命令详解 序号 命令及描述 1 ZADD key score1 member1 [score2 ...

Redis 有序集合

简介有序集合是给每个元素设置一个分数(score)作为排序的依据这一概念的集合,其也是不能有重复元素的。有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能。 数据结构 是否允许重复元...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)