数值积分 模板

什么是数值积分

  数值积分可以用来求定积分的近似值。对于很多函数来说,我们是可以使用初等函数来表示出其积分的,对于这种函数,只需要求出不定积分然后代入值就能得到定积分了。

  可是除此之外还有许多难求的函数和没法使用初等函数表示的函数。当我们想要求出它们的定积分的时候,需要使用数值积分来求解。

  在ACM中一些题目需要使用数值积分来求解,以下列出一些求数值积分的方法,由简单到难,而对ACMer来说最重要的是复合Simpson,其精度较高,且可调精度,是乱搞积分几何的利器。

  我从这学的:网易公开课 MIT 数值积分

法一·黎曼和

黎曼和是用将区间等长分为n段,然后用矩形去逼近函数,每段的长为Δx。

可以选择每段左侧的函数值作为矩形的高,也可以选择每段右侧的函数值作为矩形的高。

若设n+1个函数值从左至右为x0,x1?xn,可得如下公式:

Left Hand Riemann=Right Hand Riemann=Δxf(x0)+Δxf(x1)+?+Δxf(xn?1)=Δx∑i=0n?1f(xi)Δxf(x1)+Δxf(x2)+?+Δxf(xn)=Δx∑i=1nf(xi)

这种逼近比较粗糙,不过能比较好地传达数值积分的概念。

法二·梯形法

黎曼和虽然简单,但是精度堪忧,没法很好地模拟逼近函数,接下来介绍第二种方法。

可以看出用矩形逼近的时候有很多空缺,使用梯形去逼近,就能大大提高精度了,看上去很像了。 
 
沿用之前的xi,由梯形公式我们可以得到如下公式:

Trapezoid=Δx(f(x0)+f(x1))2+Δx(f(x1)+f(x2))2+?+Δx(f(xn?1)+f(xn))2=Δx(f(x0)2+f(x1)+?+f(xn?1)+f(xn)2)=Left Hand Riemann+Right Hand Riemann2

可以看出梯形法求出的就是左右黎曼和的平均值。

公式中第一个和最后一个需要除以2其他都能合出来1个。

法三·Simpson公式

前两种都比较简单,但是精度比较差,第三种方法是用抛物线去逼近。

使用Simpson公式首先需要n为偶数。

将整个区间分为n2段,每段的底为2Δx,高比较难搞,但是是有公式的:Simpson height=f(xl)+4f(xm)+f(xr)6

于是有公式:

Simpson=Δx3(f(x0)+4f(x1)+2f(x2)+?+2f(xn?2)+4f(xn?1)+f(xn))

法四·复合Simpson

Simpson公式的精度其实已经相当不错了,可是相对于ACM中所需的精度仍然有差距。

为了提高精度,我们需要多次重复利用Simpson公式。

我们先定义被积函数为f(x),定义Simpson(l,r)=(r?l)f(l)+4f(l+r2)+f(r)6

这也就是常规的Simpson公式,再定义函数RSimpson为复合Simpson。

当我们要求RSimpson(l,r),先令m=l+r2

当Simpson(l,r)≈Simpson(l,m)+Simpson(m,r)时我们就认为精度够了返回其中一个。

当不满足的时候我们就再分段去求RSimpson(l,m)+RSimpson(m,r)

这样得到的精度就比较高了,而且通过定义≈的范围可以调整精度。

总结公式如下:

RSimpson(l,r)=    Simpson(l,r)                                  approximate

RSimpson(l,m)+RSimpson(m,r)      else

复合Simpson的实现

 1 inline double getAppr(double fl, double fm, double fr, double l, double r) {
 2     return (fl+4*fm+fr)*(r-l)/6.0;
 3 }
 4
 5 double Simpson(double l, double r, double fl, double fr) {
 6     double m = (l+r)/2, lm = (l+m)/2, rm = (r+m)/2;
 7     double fm = f(m), flm = f(lm), frm = f(rm);
 8     double vlr = getAppr(fl, fm, fr, l, r);
 9     double vlm = getAppr(fl, flm, fm, l, m);
10     double vrm = getAppr(fm, frm, fr, m, r);
11     return fabs(vlr-vlm-vrm) < EPS ? vlr : Simpson(l, m, fl, fm)+Simpson(m, r, fm, fr);
12 }  

复合Simpson的实现2(Natureal的代码)

 1 inline double getAppr(double l,double r){
 2     return (f(l) + 4.0*f((l+r)/2) + f(r)) * (r - l) / 6.0;
 3 }
 4
 5 double Simpson(double l,double r){
 6     double sum = getAppr(l,r);
 7     double mid = (l+r)/2;
 8     double suml = getAppr(l,mid);
 9     double sumr = getAppr(mid,r);
10     return (fabs(sum - suml - sumr) < EPS) ? sum : Simpson(l, mid) + Simpson(mid, r);
11 }  
时间: 2024-10-06 05:38:29

数值积分 模板的相关文章

Vue.js项目模板搭建

前言 从今年(2017年)年初起,我们团队开始引入「Vue.js」开发移动端的产品.作为团队的领头人,我的首要任务就是设计 整体的架构 .一个良好的架构必定是具备丰富的开发经验后才能搭建出来的.虽然我有多年的前端开发经验,但就「Vue.js」来说,仍然是个新手.所幸「Vue.js」有一个配套工具「Vue-CLI」,它提供了一些比较成熟的项目模板,很大程度上降低了上手的难度.然而,很多具体的问题还是要自己思考和解决的. 项目划分 我们公司的H5产品大部分是嵌套在手机客户端里面的页面.每个项目的功能

ac自动机基础模板(hdu2222)

In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature to his image retrieval system. Every image have a long description, when users type some keywords to find the image, th

hdu 2966 In case of failure kdtree模板题

问求每个点距离平方的最小的点 kd-tree模板题…… 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int>

eclipse添加xml模板

//因为学javaee,中框架,,感觉配置文件好多, window-preferences-xml-xmlfiles-editor-templates-选中模板,-edit

POJ3528 HDU3662 三维凸包模板

POJ3528 HDU3662 第一道题 给定若干点 求凸包的表面积,第二题 给定若干点就凸包的面数. 简单说一下三维凸包的求法,首先对于4个点假设不共面,确定了唯一四面体,对于一个新的点,若它不在四面体内,为了让它进入凸包, 则对于所有凸包上的边,若边的一面是该点可以看到的而另一面看不到,则该点与该边构成的面要加入凸包. 模板代码非常清晰, #include<stdio.h> #include<algorithm> #include<string.h> #includ

zabbix用自带的模板监控mysql

先看一下zabbix自带的mysql模板监控项: #很少是吧,没事生产环境一般我们不用,下一篇将介绍生产环境用的另一种mysql监控. 配置zabbix自带的模板监控mysql数据库:

小程序砸金蛋、外卖模板上线啦,快到酷客多商户后台更新!

最近,微信小程序官方发文不断,又开放十几项接口,逐步给企业主带来跟多福利.于此同时,酷客多研发团队也保持着一贯的研发和版本迭代速度,此次版本主要新增幸运砸金蛋.外卖模板.意见反馈三个模块 1.新增幸运砸金蛋,大奖中不停 通过此功能可增加平台趣味性,增强用户粘性,刺激用户二次消费,是与用户互动的一大利器. 2新增外卖模板,外卖送起来 此模板是餐饮企业的福利,可在注册或者酷客多商户管理后台直接选择此模板,瞬间让您的小程序首页变的高大上,从此再也不用担心第三方外卖平台高额的佣金和账期了,因为酷客多只提

C++学习笔记50:队列类模板

队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h #ifndef QUEUE_H #define QUEUE_H #include <cassert> //类模板的定义 template <class T, int SIZE = 50> class Queue { private: int front, rear, count; T

ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例

工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说,我这个工程十分便捷,对于初学者来说,可能包含到以下的一些知识点: 一.React-Router的使用 Router是为了方便管理组件的路径,它使用比较简单,一般定义如下就行,需要注意的是,react-router的版本有1.0-3.0,各个版本对应的API大致相似,但也有不同,我使用的是2.X的,