自适应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 ...
随机推荐
- eclipse 导入git库 Android工程
1. 导入git库 1.1 从git库 clone 代码 在file->import中选中Git 目录下的Projects from Git 点击Next 选择 URL 点击Next 输入URL ...
- panic和recover的使用规则
转自个人博客 chinazt.cc 在上一节中,我们介绍了defer的使用. 这一节中,我们温习一下panic和recover的使用规则. 在golang当中不存在tye ... catch 异常处理 ...
- Dagger2学习笔记
Dagger2是第一个使用生成代码的方式实现依赖注入的框架.作为Dagger的升级版本,自然有它的优势,优先注重的是执行效率.本文着重介绍Dagger2.官方据点传送门: https://google ...
- Ubantu 16.4 samba安装配置
本文总结了Ubantu 16.04 环境下的samba安装.配置及使用.本文为原创,也是我的第一篇博客,以后会经常写博客,记录自己的学习.总结及研究,让博客见证着我成长的轨迹. 下文中的所有命令均使用 ...
- Java中引用的浅复制和深复制
Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy;// ...
- 基于REM的移动端响应式适配方案
视口 在前一段时间,我曾经写过一篇关于viewport的文章.最近由于在接触移动端开发,对viewport有了新的理解.于是,打算重新写一篇文章,介绍移动端视口的相关概念. 关于这篇文章说到的所有知识 ...
- python多线程爬虫设计及实现示例
爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...
- nyoj_323:Drainage Ditches(网络流入门)
题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...
- 学习笔记TF031:实现VGGNet
VGGNet,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发,深度卷积神经网络.VGGNet反复堆叠3x3小型卷积核和2x2最大池化层, ...
- (转)log4j(一)——为什么要用log4j?
1 试验环境 OS:win7 JDK:jdk7 Log4j:1.2.17(好尴尬,原本是想试验下log4j2的,结果阴差阳错用了这个版本,不过幸好,试验也不白试验,试验的作用是一样的) 2 先看两个简 ...