何为自适应Simpson法

自适应辛普森算法(Adaptive Simpson′s rule)是一类近似算法(Approximation algorithm),主要用于在信息计算时求较难反导的函数的定积分。其思想是利用二次函数曲线来不断**拟合(Overfitting)所求曲线(显然这传统的直接用矩形或直边梯形作为微元更精准),而所谓的Adapative(自适应)**则是用于优化时间复杂度的方法。 ----wikipedia

在计算几何里,显然可在特殊情况下利用自适应Simpson法求图形的面积。

Simpon公式及推导

Simpson公式

​ ∫abf(x)dx≈(b−a)(f(a)+f(b)+4f(a+b2))6\int_a^bf(x)dx\approx\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6}∫ab​f(x)dx≈6(b−a)(f(a)+f(b)+4f(2a+b​))​

推导

设f(x)f(x)f(x)为被积函数,g(x)=Ax2+Bx+Cg(x)=Ax^2+Bx+Cg(x)=Ax2+Bx+C为用于拟合f(x)f(x)f(x)的函数,即g(x)≈f(x)g(x)\approx f(x)g(x)≈f(x),则有:

∫abf(x)dx≈∫abg(x)dx=∫ab(Ax2+Bx+C)dx=A3(b3−a3)+B2(b2−a2)+C(b−a)\int_{a}^{b}f(x)dx\approx \int_{a}^{b}g(x)dx=\int_{a}^{b}(Ax^2+Bx+C)dx=\frac{A}{3}(b^3-a^3)+\frac{B}{2}(b^2-a^2)+C(b-a)∫ab​f(x)dx≈∫ab​g(x)dx=∫ab​(Ax2+Bx+C)dx=3A​(b3−a3)+2B​(b2−a2)+C(b−a)

=A3(b−a)(b2+ab+a2)+B2(b−a)(b+a)+C(b−a)=(b−a)[A3(b2+ab+a2)+B2(b+a)+C]=\frac{A}{3}(b-a)(b^2+ab+a^2)+\frac{B}{2}(b-a)(b+a)+C(b-a)=(b-a)[\frac{A}{3}(b^2+ab+a^2)+\frac{B}{2}(b+a)+C]=3A​(b−a)(b2+ab+a2)+2B​(b−a)(b+a)+C(b−a)=(b−a)[3A​(b2+ab+a2)+2B​(b+a)+C]

=(b−a)6[2A(b2+ab+a2)+3B(b+a)+6C]=\frac{(b-a)}{6}[2A(b^2+ab+a^2)+3B(b+a)+6C]=6(b−a)​[2A(b2+ab+a2)+3B(b+a)+6C]

=(b−a)6[Aa2+Ba+C+Ab2+Bb+C+Aa2+Ab2+2Aab+2Ba+2Bb+4C]=\frac{(b-a)}{6}[Aa^2+Ba+C+Ab^2+Bb+C+Aa^2+Ab^2+2Aab+2Ba+2Bb+4C]=6(b−a)​[Aa2+Ba+C+Ab2+Bb+C+Aa2+Ab2+2Aab+2Ba+2Bb+4C]

=(b−a)6[f(a)+f(b)+A(a+b)2+2B(a+b)+4C]=\frac{(b-a)}{6}[f(a)+f(b)+A(a+b)^2+2B(a+b)+4C]=6(b−a)​[f(a)+f(b)+A(a+b)2+2B(a+b)+4C]

=(b−a)6[f(a)+f(b)+4A(a+b2)2+4B(a+b2)+4C]=\frac{(b-a)}{6}[f(a)+f(b)+4A(\frac{a+b}{2})^2+4B(\frac{a+b}{2})+4C]=6(b−a)​[f(a)+f(b)+4A(2a+b​)2+4B(2a+b​)+4C]

=(b−a)(f(a)+f(b)+4f(a+b2))6=\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6}=6(b−a)(f(a)+f(b)+4f(2a+b​))​

上述推导过程除了求了个一元二次多项式的积分外,运用的都是初等数学的知识。

除此推导方法之外,此公式还有一种更常规的推导方法,那就是利用牛顿-柯特斯求积公式。有篇相关文章写的不错,链接如下:

https://blog.csdn.net/qq_43069547/article/details/83153673

代码实现—自适应

如果想要利用Simpson公式求定积分,显然我们要把积分区间分成多个足够小的区间,但问题就在于如何去划分才能既精确效率又高。

其实,Simpson法的程序实现很简单,就是二分递归的过程,但关键在于“自适应”。所谓自适应,说的直白点,无非就是需要多分治几次的地方,多分治几次;不需要的则可以少分治几次

那么,我们可以得出自适应Simpson法的核心实现过程:在二分递归划分区间的过程中,如果满足了精度需要,则可以终止当前递归,而这就是自适应辛普森法能够自动控制区间分割大小的手段。

inline double queryans(double l,double r,double eps,double ans)//ans:利用Simpson法得到的以[l,r]为积分区间的f(x)的定积分; eps:精度
{register double mid=(l+r)/2.0;register double ansl=Simpson(l,mid),ansr=Simpson(mid,r);if(fabs(ansl+ansr-ans)<=15.0*eps)//Problem 1    return ansl+ansr+(ansl+ansr-ans)/15.0; return queryans(l,mid,eps/2.0,ansl)+queryans(mid,r,eps/2.0,ansr);//Problem 2
}

上述代码有两点需要说明的地方:

Problem 1:为什么判断是否还需要对当前区间继续划分拟合时的判断条件是误差≤15\le15≤15倍的精度值?

答:据下面链接的文章说,wekipedia里有相关证明,同时贴了张图:


Problem 2:为什么递归求折半积分区间的积分时精度?

如果要求当前区间UUU计算的返回值误差eps(U)<keps(U)<keps(U)<k的话,显然其折半区间L,RL,RL,R的返回值的误差应有eps(L)≤k2,eps(R)≤k2eps(L)\le \frac{k}{2},eps(R)\le \frac{k}{2}eps(L)≤2k​,eps(R)≤2k​这些不等关系,只有这样才能保证eps(U)=eps(L)+eps(R)≤k2+k2=keps(U)=eps(L)+eps(R)\le \frac{k}{2}+\frac{k}{2}=keps(U)=eps(L)+eps(R)≤2k​+2k​=k。

最后,需要说明的是,本文大部分内容学习或借鉴自https://www.cnblogs.com/pks-t/p/10277958.html,这篇文章讲的确实不错,许多其他相关文章都没提到的令人疑惑的地方点的较到位。

Code

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;double A,B,C,D,L,R;inline double f(double x) { return (C*x+D)/(A*x+B); }
inline double Simpson(double a,double b) { return (f(a)+4*f((a+b)/2.0)+f(b))*(b-a)/6.0; }inline double queryans(double l,double r,double eps,double ans)
{register double mid=(l+r)/2.0;register double ansl=Simpson(l,mid),ansr=Simpson(mid,r);if(fabs(ansl+ansr-ans)<=15.0*eps)   return ansl+ansr+(ansl+ansr-ans)/15.0;//15.0是科学推算得 return queryans(l,mid,eps/2.0,ansl)+queryans(mid,r,eps/2.0,ansr);//精度别忘除以2(列式等价得)
}int main()
{scanf("%lf%lf%lf%lf%lf%lf",&A,&B,&C,&D,&L,&R);printf("%.6lf",queryans(L,R,1e-6,Simpson(L,R)));return 0;
}

自适应Simpson法P4525 【模板】自适应辛普森法1相关推荐

  1. 【算法讲10:自适应辛普森法】求平滑曲线积分近似 | 洛谷 P4526 | HDU1724 | QLU Youmu with Master spark

    自适应辛普森法 参考 引入 ⌈ \lceil ⌈辛普森法求积分 ⌋ \rfloor ⌋ 原理 思考 ⌈ \lceil ⌈自适应辛普森法求积分 ⌋ \rfloor ⌋ 原理 优点 缺点 代码 例题 模板 ...

  2. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  3. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1017  Solved: 562 [Submit][Statu ...

  4. CSU 1806 Toll 自适应simpson积分+最短路

    分析:根据这个题学了一发自适应simpson积分(原来积分还可以这么求),然后就是套模板了 学习自适应simpson积分:http://blog.csdn.net/greatwall1995/arti ...

  5. 计算方法之数值积分方法——复化梯形法,复化辛普森法,龙贝格法,三点高斯公式 附matlap程序下载

    数值积分 复化求积法就是将求积区间[a,b]划分为n等份,步长h=(b-a)/n,等分点为xi=a+ih,i=0,1,2,-,n.然后用低阶求积公式求的每个字段[xi,xi+1]上的积分值I,然后再将 ...

  6. Java反梯形图案_梯形法求定积分(一)设计梯形法求积分的类模板,梯形法

    /*设计梯形法求积分的类模板,梯形法求积分的函数被定义为成员函数,可以求任意函数的定积分,用积分类的模板参数T引入被积函数*/ #include #include #include using nam ...

  7. 苹果cms v8 漫漫看电影模板 自适应手机移动端

    简介: 苹果cms v8 漫漫看电影模板 自适应手机移动端 网盘下载地址: http://kekewl.cc/dG6LC2i1VpA0 图片:

  8. HTML5期末大作业:茶页文化网站设计——气高端企业自适应响应式网站模板(6个页面) HTML+CSS+JavaScript

    HTML5期末大作业:茶页文化网站设计--气高端企业自适应响应式网站模板(6个页面) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 ...

  9. 苹果cmsV10韩剧TV简约影视网站源码电脑和手机模板自适应

    苹果cmsV10韩剧TV简约影视网站源码电脑和手机模板自适应 原创带后台设置多功能苹果CMSv10自适应seo高权重大屏模板 苹果cms10好看的模板自适应_苹果cmsv10高端模板_苹果cmsv10 ...

  10. 2022新版苹果cmsV10 MXProV4.0自适应影视站主题模板

    MXPro 模板主题(又名:mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频,不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气 ...

最新文章

  1. 解题报告(十三)中国剩余定理(ACM / OI)
  2. Server 2012 Hyper-v新功能之一:客户端 Hyper-V
  3. 使用javamail进行邮件发送
  4. PHP session的工作原理
  5. 2021巨量引擎母婴行业白皮书
  6. 为什么程序要从0开始计数
  7. C# 判断程序是否已经在运行
  8. SpringBoot 的事务管理
  9. 用户自定义控件(UserControl)用法大全
  10. CSI Report中关于codebook/PMI的理解(2)
  11. python中linspace函数_Python numpy.linspace函数方法的使用
  12. 【AutoSAR】【MCAL】MCU模块
  13. 计算机英语反义词,计算机计算是什么意思
  14. 服务器安全-Dos-Deflate
  15. 8421 5421 2421 余3码
  16. 微信支付和分享到朋友圈-struts版本
  17. Mac电脑chrome打不开脸书,但是saf可以,请教是因为什么
  18. 1.Unity之Shader新手入门
  19. 苹果VS谷歌,开战了?
  20. WWDC15 iOS游戏开发3个新框架全解

热门文章

  1. Android 手表WearOs 禁止滑动返回、监听滑动事件分发
  2. 11.2 注解的使用示例1 select insert update和delete操作
  3. 好消息!iPhone 4, 3GS, 3G 基带 5.14.02 和 2.10.4 已经软解
  4. TortoiseSVN 帮助教程(一)—— 建立版本库
  5. B2065 鸡尾酒疗法
  6. 最新kali之medusa
  7. 信用卡欺诈检测数据集
  8. android中Uri.parse()用法,调用电话短信浏览器等
  9. INT32_MIN溢出
  10. 运筹帷幄DB2——从Oracle运维转型