自适应Simpson积分
自适应Simpson积分
作用
如标题所示,这玩意就是当你不会微积分的时候来求积分的。
总所周知,积分的定义就是函数的某一段与坐标轴之间的面积。
那么,自适应Simpson积分就是一种可以再某些精度下计算出较为平滑的函数的积分的比较简单优美的算法。
(PS:这玩意的时间复杂度?大概是O(玄学)吧)
引子
积分的定义是面积,那么我们可以通过最基本的切割法来求出一定精度下面积。
(ps:就是0.0000……01那样扫过去,把这个当做宽,把函数值当做高,然后乘起来当做面积)
然而这个耗费的时间太多,而且精度也不如人意,所以就出现了Simpson积分。
正文
依旧是总所周知,一条二次函数曲线由三个点确定,那么也意味着,我们确定三个点可以确定一条二次函数曲线。
还是总所周知,二次函数的积分是好求的,也就是牛顿科特斯的公式中n=2的情况。那么我们就可以通过二分取点来吧当前区间的积分拟成一个二次函数的积分。
来写份伪代码可能会清楚一点
double get(double l,double r){
mid=(l+r)/2;
return (横坐标为l,r,mid,纵坐标为他们在要积分的函数上的值)穿过这三个点的二次函数在l到r之间的积分。这一步具体可以表现为(r-l)(f(l)+f(r)+4*f(mid))/6(这个公式据说用导数求很方便,在这里会用就好,我也并不会证明(我太弱啦))
}
double Simpson(double l,double r){
double mid=(l+r)/2;
s1=get(l,mid)+get(mid,r);
s2=get(l,r);
if(abs(s1-s2)<eps(这玩意是精度误差))return s2;
return Simpson(l,mid)+Simpson(mid,r);
}
如代码所示,自适应Simpson积分就是不停地二分区间,然后把每一段函数看成两段二次函数,然后积分,再中间取点,若这个与继续分下去的差小于精度误差,那么这个区间再分下去也不会对答案的精度范围造成什么影响,那么就直接返回这一段区间的值。
然而据大佬yww讲,这玩意是假的自适应Simpson积分,因为没有精度保障,他的都是把eps也二分传下去。这样做确实能有精度保障(然而在bzoj的某道题目,yww的真丶自适应积分爆炸了,假的自适应积分过了),所以我还是写假的自适应Simpson积分吧。
某些注意事项
有许多根本积不了分的函数也照样可以被自适应Simpson积分摁在地上日,原因很显然,就是这玩意就一逼近算法,没太多数学上的限制。当然,越平滑的函数用Simpson积分所造成的误差会越小,如果有什么七次函数八次函数什么的倒是也可以用,不过效果怎么样就不知道了。
自适应Simpson积分的更多相关文章
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- HDU 1724 Ellipse 【自适应Simpson积分】
Ellipse Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- CSU 1806 Toll 自适应simpson积分+最短路
分析:根据这个题学了一发自适应simpson积分(原来积分还可以这么求),然后就是套模板了 学习自适应simpson积分:http://blog.csdn.net/greatwall1995/arti ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- HDU 1724 Ellipse 自适应simpson积分
simpson公式是用于积分求解的比较简单的方法(有模板都简单…… 下面是simpson公式(很明显 这个公式的证明我并不会…… (盗图…… 因为一段函数基本不可能很规则 所以我们要用自适应积分的方法 ...
- bzoj 2178 自适应Simpson积分
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- [BZOJ1502]月下柠檬树(自适应辛普森积分)
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status] ...
- HDU 1724 Ellipse (自适应辛普森积分)
题目链接:HDU 1724 Problem Description Math is important!! Many students failed in 2+2's mathematical tes ...
随机推荐
- 【JS】jquery通知插件toastr
toastr是一款非常棒的基于jquery库的非阻塞通知提示插件,toastr可设定四种通知模式:成功,出错,警告,提示,而提示窗口的位置,动画效果都可以通过能数来设置,在官方站可以通过勾选参数来生成 ...
- 用py2exe将python文件转换成exe可执行程序
1.首先需要安装py2exe模块,下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 然后用pip install 命令安装py2exe模块,如果你用的py ...
- (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...
- mybatis中resultType和resultMap的联系
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 比如,我们平时使用的单表查 ...
- 用java调用oracle存储过程总结
以前一直没有动存储过程是用来干嘛的,后来请教朋友才换为自己的理解方式,用自己通俗的语言来说,就是把sql语句换为一个过程,也可以说是一个方法,每次直接给参数调用就好,使用存储过程查询速度快,系统只编译 ...
- git bash上传代码到github
今天,老爷机notebook开始卡了,我决定格盘重装系统. 顺便复习一下git本地命令的使用 1,配置 2先跳过一般的操作.介绍链接github远程库的操作 我的两个钥匙在C:\Users\bond\ ...
- nodejs之url模块
鄙人初步学习nodejs,目前在读<nodejs入门>这一本书,书很小,但是让我知道了如何用nodejs创建一个简单的小项目.例如如何创建一个服务器啦,例如http.createServe ...
- ubuntu14.04_caffe2安装
今天F8开发者大会上,Facebook正式发布Caffe2.经过一天的折腾,终于在ubuntu14.04上成功配置caffe2,现将经验分享如下: 1.ubuntu14.04系统下caffe2所需依赖 ...
- tensorflow dropout函数应用
1.dropout dropout 是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更瘦的网络,这篇博客中讲的非常详细 2.tens ...
- Jmeter编写Base64加密函数
方法一: 使用Beanshell Sampler.BSF Sampler等实现,现已Base64加密为例,脚本如下: import sun.misc.BASE64Decoder; String res ...