数值积分方法的总结(从简单梯形积分到龙贝格积分、自适应积分、高斯积分等)

article/2025/8/21 18:00:28

各种数值积分方法总结(龙贝格积分、自适应积分、高斯积分等)

  • 1 (一重积分)常用的数值积分方法
    • 1.1 牛顿-科茨(Newton-Cotes)积分公式
      • 1.1.1 梯形法则(2点积分)
      • 1.1.2-3 辛普森法则(3点积分和4点积分)
        • 1.1.2 辛普森1/3法则(3点积分)
        • 1.1.3 辛普森3/8法则(4点积分)
      • 1.1.4 布尔法则(5点积分)
      • 1.1.5牛顿-科茨积分公式总结
    • (穿插)积分改进思路1
    • 1.2 复合积分(复合梯形积分、复合辛普森积分等)
      • 1.2.1 复合梯形积分
      • 1.2.2 复合辛普森积分
    • (穿插)积分改进思路2
    • 1.3常用的高精度积分
      • 1.3.1 龙贝格积分
      • (穿插)积分改进思路3
      • 1.3.2 自适应积分
      • 1.3.3 高斯积分
        • 高斯-勒让德公式
        • 高斯积分误差:
        • 高斯-切比雪夫公式
        • 广义积分:高斯-拉盖尔公式
        • 广义积分:高斯-埃尔米特公式
  • 2 多重积分方法
    • 二重积分的辛普森公式
    • 二重积分的蒙特卡洛方法
    • 多重(高维)积分的蒙特卡洛方法

本文整理了各种类型的数值积分,从简单的梯形积分、辛普森积分到高精度的自适应积分、龙贝格积分和高斯积分;对于多重积分(高维积分),本文先简单介绍一下蒙特卡洛方法(适用于积分维数大于4的积分),后续会发帖专门针对多重积分方法做介绍。
(如有疏漏,欢迎指正,谢谢~)

1 (一重积分)常用的数值积分方法

常用积分方法包括梯形积分、辛普森积分、自适应积分、龙贝格积分和高斯积分等;其中自适应积分、龙贝格积分和高斯积分属于高精度积分。

1.1 牛顿-科茨(Newton-Cotes)积分公式

牛顿-科茨(Newton-Cotes)积分公式:
在这里插入图片描述
包含了梯形法则、辛普森法则、布尔法则等。

1.1.1 梯形法则(2点积分)

梯形法则积分计算公式:

其中,在这里插入图片描述
在这里插入图片描述
于是得:
在这里插入图片描述
梯形公式要计算两个点的函数值f(a)和f(b)。所以说是两点积分
在这里插入图片描述
梯形法则的误差为:
在这里插入图片描述

1.1.2-3 辛普森法则(3点积分和4点积分)

辛普森法则分为辛普森1/3法则和辛普森3/8法则,就是用二次/三次插值曲线来代替直线进行积分。
在这里插入图片描述

1.1.2 辛普森1/3法则(3点积分)

辛普森1/3法则法则积分计算公式:
在这里插入图片描述

1.1.3 辛普森3/8法则(4点积分)

辛普森3/8法则法则积分计算公式:
在这里插入图片描述

1.1.4 布尔法则(5点积分)

布尔法则与辛普森法则类似,只是更高阶的多项式积分,其公式为:
在这里插入图片描述

1.1.5牛顿-科茨积分公式总结

在这里插入图片描述
注意:1.对于3点积分与4点积分具有相同的误差阶;5点积分与6点积分具有相同的误差阶。对于点数更多的积分也一样。因此优先使用奇数个点的积分。
2.对于点数大于等于9的牛顿-科茨积分,求积公式的稳定性得不到保证(具体原因可以找数值积分的数看看,本文源自《现代数值积分》第5章 数值积分与数值微分),积分不能保证收敛,因此实际计算中一般不采用高阶牛顿-科茨积分公式。(处于效率考虑,一般也很少用超过5个点的牛顿-科茨积分公式)。

(穿插)积分改进思路1

牛顿-科茨积分公式思想:根据积分点构造近似的插值多项式,进而利用多项式积分表示原积分。
对于高次的多项式插值,会出现龙格现象(对于高次的多项式插值,插值多项式会出现不收敛的现象,成为龙格现象,想深入了解可以去查询相关资料。并且次数越高,越容易出现不收敛现象)。

针对龙格现象,更好的选择切比雪夫节点来进行插值(想深入了解可以去查询相关资料,本文部分源自《现代数值积分》第3章 多项式插值与样条插值)。

在这里插入图片描述
由于切比雪夫节点的特殊性,对于高阶插值的可以收到较好的效果,因此,对于“牛顿-科茨积分公式总结”中提到的点数大于等于9的牛顿-科茨积分,可以采用切比雪夫计算节点,然后构造插值多项式,再计算积分(此方法实现和推广比较麻烦,此处不做扩展,感兴趣的可以自己下去推导实现)。

1.2 复合积分(复合梯形积分、复合辛普森积分等)

上述主要介绍的是单个区间的积分。为了计算更准确,我们可以将区间划分为若干个小的区间,然后对每个小区间进行积分,然后对各个小区间的积分求和。由于对于单个小区间的积分可分为梯形法则,辛普森法则,和布尔法则,因此复合积分的每个小区间的积分可以是这些方法中的任意一种。
下面主要讲一下 复合梯形积分和复合辛普森积分。

1.2.1 复合梯形积分

小区间的划分又分为等长区间和不等长区间两种划分方法。
不等长区间,复合梯形积分计算公式:
在这里插入图片描述
区间不等长情况应用场景很有限。

等长区间,复合梯形积分计算公式:
在这里插入图片描述
等长区间,复合梯形积分计算误差:
在这里插入图片描述

1.2.2 复合辛普森积分

同样的,复合辛普森积分区间的划分也可以分为等长区间和不等长区间两种划分方法。
由于不等长区间应用很少,因此直接介绍等长区间,复合辛普森1/3积分计算公式:

在这里插入图片描述
等长区间,复合辛普森1/3积分计算误差:
在这里插入图片描述

由于3点积分(辛普森1/3积分)与4点积分(辛普森3/8积分)具有相同的误差阶,因此一般优先使用复合辛普森1/3积分,复合辛普森3/8积分应用极少,因此本文不做介绍。感兴趣的同学可以下去自己推一下复合辛普森3/8积分计算公式,应该也很简单。

(穿插)积分改进思路2

可以看出,将区间划分为更小的区间可以有效的提高积分计算的精度。那么我们是不是可以将积分区间不断地细分,从而来得到更精确的积分结果?理论上是可以的!!

方法1:(区间折半法)
a.计算2个区间的积分,用复合辛普森1/3法则(当然,也可以用梯形法则或者布尔法则等都可以,但是推荐复合辛普森1/3法则);
b.将两个区间等分为4个区间,用复合辛普森1/3法则计算四个子区间的积分和;
c.比较a和b两步计算的结果相对误差是否接近一个很小的数:(Ia - Ib)/Ib<e。如果相对误差满足要求,则结束,否则继续细分区间,用复合辛普森1/3法则计算积分,直到满足要求为止。

方法2:改进方法1
a.对每个子区间一分为二后,比较两个区间的积分值与一个区间的积分值是否相近;
b.如果相近则返回该值;否则对每个子区间执行a。(递归实现)

上面说,理论上是可以的!!理论上是可以的!!但是实际不行!!!
因为计算机浮点数运算是存在误差的。当区间数量很大的时候,浮点数计算的舍入误差(不理解的可以自行去学习了解一下)变得很大,会限制积分的提高。下面就是一个很好的例子。
在这里插入图片描述

1.3常用的高精度积分

上述区间二分的思想是很有用的。在龙贝格积分和自适应积分中都会找到它的影子。

1.3.1 龙贝格积分

龙贝格积分的思想,及推导过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
类推:联合两个误差为O(h^4)的积分,改进后可以得到一个误差为O(h ^ 6)的积分:
在这里插入图片描述
由此产生龙贝格积分:
在这里插入图片描述
在这里插入图片描述

(穿插)积分改进思路3

龙贝格积分是用梯形公式推导得到的,那么我们是不是可以用辛普森公式做类似的推导,也能到达一套新的公式呢?答案是:理论上是可以的!!

由辛普森1/3公式推导出来的加入误差修正的积分计算式:
在这里插入图片描述
那么问题就来了。
我们的计算机表达的double值是有范围的,而对于辛普森外,采用递归,递归8次就是16^8 = 2 ^ 32。计算机递归计算的结果很容易就产生溢出了。除非采用多精度浮点数计算才行,而采用多精度浮点数可能存在一些计算效率的问题。。。更深入的问题我就不继续深入探讨了(有兴趣的可以试试)。。。好了,总之来说,用辛普森推导出来的方法不是很实用。还是梯形龙贝格积分经典好使。

1.3.2 自适应积分

龙贝格积分中有两点:
a。每次都会将所有的步长折半;(那么我们能不能只对计算误差较大的那个区间进行折半成两个子区间再积分呢?)
b。辛普森公式推导的方法,由于计算机double表示范围有限没用上。

下面都会在自适应积分中派上用场。自适应积分思想:(递归方法)
step1.辛普森1/3法则计算区间[a,b]的积分;
step2.区间步长折半,复合辛普森1/3法则计算区间[a,b]的积分;
如果两次误差小于给定的误差限,停止执行,返回计算结果
在这里插入图片描述
如果两次误差大于给定的误差限,对两个子区间分别执行step1和step2。

伪代码:
在这里插入图片描述

1.3.3 高斯积分

高斯积分应用比较广泛的是高斯-勒让德公式,此外还有高斯-切比雪夫公式;以及区间【0,正无穷】的广义积分 高斯-拉盖尔公式;以及区间【负无穷,正无穷】的广义积分 高斯-埃尔米特公式。

高斯-勒让德公式

介绍高斯积分的文档就很多了,本文不细讲推导的过程,给出计算方法:
高斯-勒让德
多点高斯-勒让德公式:
在这里插入图片描述
在这里插入图片描述
高斯勒让德公式的区间为【-1,1】.对于任意区间为【a,b】;需要做一下简单的变量代换,
在这里插入图片描述

高斯积分误差:

高斯勒让德公式的区间为【-1,1】,误差:
在这里插入图片描述
对于任意区间为【a,b】,误差:
在这里插入图片描述
在这里插入图片描述
由上式继续往下推导,可以得出,当区间长度【b-a】> 2(n+1)时,误差会发散。因此对于高斯点为n的高斯积分,积分区间长度不要大于2(n+1),否则积分结果很可能会不准确。
此外,高斯积分的误差还与被积函数的光顺性有关,被积函数光顺性越差,误差越大。详细可参考《现代数值计算》第5章 数值积分与数值微分,P139页)。

高斯积分的优点:高斯积分时给定节点数下代数精度最高的求积公式。

高斯积分的不足:高斯积分每次改变积分点的个数,所以的积分点的函数值都需要重新计算。

高斯-切比雪夫公式

高斯点为切比雪夫节点。

(未完待续。。。)

广义积分:高斯-拉盖尔公式

广义积分:高斯-埃尔米特公式

2 多重积分方法

二重积分的辛普森公式

二重积分的蒙特卡洛方法

多重(高维)积分的蒙特卡洛方法


http://chatgpt.dhexx.cn/article/HtkDZ2Z4.shtml

相关文章

matlab中几种求积分的方法

matlab中几种求积分的方法 举例图形Midpoint RuleTrapezoid Rule13 Simpsons利用integral结果显示 matlab中几种求积分的方法 最近看了几天matlab的基础知识&#xff0c;总结一下求简单积分的方法 举例图形 x linspace(0, 2*pi, 100); y sin(x) cos(x); plot(x, y);line…

python怎么算积分_蒙特卡洛方法求定积分及python实现(转)

用蒙特卡洛方法计算定积分 1.原理 计算定积分 利用蒙特卡洛计算方法,核心步骤是求取随机的 g(X1),………,g(Xn),n∈[a,b],由数学期望和大数定理可以近似计算定积分,公式为 2.测试用例 原函数: 导函数: 计算导函数在[10,15]上的定积分; 3.测试语言 Python 4.测试代码 …

蒙特卡洛方法及其求积分应用

本文发自&#xff1a;http://www.haopeng233.top/2018/06/16/math-probability-MC/ 欢迎大家访问&#xff1a;&#xff09; 前言 最初听到蒙特卡洛方法&#xff08;Monte Carlo&#xff0c;下文用MC代替&#xff09;是在本科的工程经济学课堂上&#xff0c;当时汪帅&#xf…

蒙特卡洛法求积分

问题一&#xff1a;我们如何用蒙特卡洛方法求积分&#xff1f;问题二&#xff1a;如何近似求一个随机变量的数学期望&#xff1f;问题三&#xff1a;估计的误差是多少&#xff1f;问题四&#xff1a;如何从理论上对蒙特卡洛估计做分析&#xff1f;结论 import numpy as np impo…

蒙特卡洛方法求定积分

用蒙特卡洛方法计算定积分 1.原理 计算定积分 利用蒙特卡洛计算方法,核心步骤是求取随机的 g(X1),………,g(Xn),n∈[a,b],由数学期望和大数定理可以近似计算定积分,公式为 2.测试用例 原函数: 导函数:

python 二重积分_python中求二维积分的方法

python中一般求解微积分可以使符号积分求出解析解&#xff0c;使用数值积分求出数值解。在计算机的处理当中&#xff0c;数值解往往更有意义。本文介绍python中利用数值积分例程和微分方程求解器scipy.integration中的dblquad方法求取二维积分的介绍。 1、引入scipy.integratio…

R语言:蒙特卡洛方法求积分

蒙特卡洛方法&#xff08;MC&#xff09; 一、蒙特卡洛方法简介二、利用蒙特卡罗方法计算圆周率三、利用蒙特卡洛方法求定积分例1例2例3 总结: 一、蒙特卡洛方法简介 蒙特卡洛方法得名于摩纳哥的蒙特卡洛赌场&#xff0c;是大数定律的经典应用&#xff0c;即用大样本数据计算出…

计算方法(一)——计算机求积分方法,机械求积法

机械求积法 转载请注明出处! 一、引言 随着人工智能的兴起,在计算机领域又一次掀起了数学热,不管是传统的机器学习,还是现在的深度学习,都离不开积分的支撑,那计算机在底层到底是怎样求积分的呢?小编同大家一起探讨。 二、理论推导 我们知道,在我们所学的微积分中我们是…

C++实现龙贝格求积分算法

1. 算法原理简介 T(0)(b-a)(f(a)f(b))/2&#xff1b; H(0)(b-a)f( (ab)/2 )&#xff1b; T(i)(T(i-1)H(i-1))/2。 T(i) 的语义是将积分区间做 2i 等分时复化梯形求积分公式算出的近似值。 H(i) 的语义是将积分区间做 2i 等分时&#xff0c;将每个小区间的长度乘该小区间中点处…

c#求定积分

步骤&#xff1a; 1 安装和使用NuGet插件 教程链接&#xff1a;https://blog.csdn.net/qq_36456952/article/details/55252913 2 安装 C# 科学计算库 Math.NET Numerics 教程链接: https://blog.csdn.net/heray1990/article/details/72467304 注意&#xff1a;在安装 C#…

人工智能数学基础---不定积分4:有理函数求积分的方法

一、引言 在《人工智能数学基础–不定积分2&#xff1a;利用换元法求不定积分》、《人工智能数学基础—不定积分3&#xff1a;分部积分法》分别介绍了换元积分法和分步积分法。但有些函数表达式很复杂&#xff0c;如果直接用换元积分法和分步积分法不好计算积分&#xff0c;这…

求积分方法及积分知识点-----专升本

求积分 一般&#xff08;常见&#xff09;求不定积分方法 一般&#xff08;常见&#xff09;定积分方法 带三角函数的求积分 凑微分法&#xff0c;拆开&#xff0c;三角代换&#xff0c;分部积分&#xff0c;整体法&#xff0c; 倒三角变正三角&#xff0c;奇拆偶降 几分之一圆…

二维数组、指针详解

二维数组、指针详解&#xff1a; 目录 二维数组、指针详解&#xff1a; 1.研究二维数组的表示。 2.现在研究关于二维数组和指针的关系 1.研究二维数组的表示。 首先&#xff0c;用代码运行进行测试&#xff0c;验证的相关结果&#xff0c; // C.cpp : 定义控制台应用程序…

二维数组与指针

转载自&#xff1a;https://www.cnblogs.com/chenyangyao/p/5222696.html 声明&#xff1a;本文为原创博文&#xff0c;如有转载&#xff0c;请注明出处。若本文有编辑错误、概念错误或者逻辑错误&#xff0c;请予以指正&#xff0c;谢谢。 指针与数组是C/C编程中非常重要的元…

二维数组指针,指针数组与数组指针的区别,一看就懂

目录 一.二维数组基本概念 二.指针数组和数组指针的区别 1.数组指针 2.指针数组 3.总结 三.二维数组的首地址和数组名 四.二维数组如何运用指针&#xff1f; 五.代码分析,加深了解。 一.二维数组基本概念 二维数组在概念上是二维的&#xff0c;有行和列&#xff0c;但在…

二维数组与数组指针详解

二维数组 深入理解二维数组 首先定义一个二维数组 int a[2][3]{{1,2,3},{4,5,6}}; #or int a[2][2]{1,2,3,4};新的理解&#xff1a;我们可以这样认为&#xff0c;a可以看作是一个一维数组&#xff0c;包含2个元素&#xff0c;每个元素恰好是包含3个整型的元素&#xff0c;a这个…

c语言——二维指针数组

1 一维度数组与指针 1.1一维数组元素在内存分布 #include<stdio.h> #include<stdlib.h> #include<string.h>#define ARRAY_SIZE 8void main() {int data[ARRAY_SIZE]{0,1,2,3,4,5,6,7};int i;printf("data address:0x%-8x\r\n",data);for(i0; i&l…

c++二维数组指针

&#xff11;.定义指针指向二维数组 为了方便根据用户输入动态定义二维数组的行和列&#xff0c;引入变量rowsNum(行)&#xff0c;colsNum(列&#xff09;。 以定义&#xff15;行&#xff14;列的二维数组为例&#xff0c; int rowsNum 4;int colsNum 5;float** a new fl…

二维数组名是指针的指针吗?

我们知道一维数组名是常量指针&#xff0c;我们可以将一维数组名赋给一个指针类型再对一维数组进行相关的操作&#xff0c;那二维数组名又是什么&#xff1f; 我们这样初始化一个二维数组int A[3][3]{1,2,3,4,5,6,7,8}或者为int A[3][3]{ {1,2,3},{4,5,6}&#xff0c;{7,8,9}}…

c++二维数组中指针详解

二维数组 a[2][3]{{1,2,3},{4,5,6}};指针p有如下几种表达形式&#xff1a; 1 方式一&#xff1a;int (*p)[3]a (或&a[0]&#xff09;; 一定要加上括号&#xff0c;因为[]的优先级高于*&#xff1b;意思是定义一个指向3个int类型变量的指针。p代表二维数组中第一个…