数值计算笔记之数值积分(二)龙贝格算法

article/2025/10/1 21:54:44

        龙贝格求积公式也称为逐次分半加速法。它是在梯形公式、辛普森公式和柯特斯公式之间的关系的基础上,构造出一种加速计算积分的方法。 作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。

        在等距基点的情况下,用计算机计算积分值通常都采用把区间逐次分半的方法进行。这样,前一次分割得到的函数值在分半以后仍可被利用,且易于编程。

一、变步长的梯形法

求 \int_{a}^{b}f(x)dx

<1> 首先在[a,b]上用梯形公式,得T_{1}

<2>将[a,b] 二等分,步长h=\frac{b-a}{2},用复化梯形公式,得T_{2}

<3>将[a,b]四等分,步长h=\frac{b-a}{4}  ,用复化梯形公式,得T_{4}

\cdots \cdots

<n>将将[a,b] 2n 等分,步长h=\frac{b-a}{2n}  ,用复化梯形公式,得T_{2n}

问题:

  1. 每一步是否能用到上一步得计算结果?
  2. 区间划分到什么程度,才满足精度要求?

分析:

<1>、n等分,步长 h=\frac{b-a}{n} ,T_{n}=\frac{h}{2}[f(a)+f(b)+2\sum_{k=1}^{n-1}f(x_{k})]

<2>、 2n 等分,步长 h^{'}=\frac{h}{2} ,记[x_{k},x_{k+1}] 的中点(图中红线)为 x_{k+\frac{1}{2}} 。

则积分节点为:x_{0},x_{\frac{1}{2}},x_{1},x_{\frac{3}{2}},x_{2},\cdots ,x_{n-1},x_{n-\frac{1}{2}},x_{n}       (分为原节点 和 新增节点)

T_{2n} = \frac{h^{'}}{2}[f(a)+f(b)+2\sum_{k=1}^{n-1}f(x_{k}) + 2\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})]

=\frac{1}{2}T_{n}+\frac{h}{2}\cdot \sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})     (注意:此h是计算T_{n}时的)

算法总结:

  1. 计算T_{n}=\frac{h}{2}[f(a)+f(b)+2\sum_{k=1}^{n-1}f(x_{k})]
  2. 由递推公式T_{2n}=\frac{1}{2}T_{n}+\frac{h}{2}\cdot \sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})
  3. 判断  |T_{n} - T_{2n}| < \varepsilon     (\varepsilon 为误差限),成立则返回 T_{2n}并输出。

变步长的梯形法代码(C++):


//变步长梯形积分
double T2n(double(*f)(double), double a, double b, double error) {int n = 1;   double h = (b - a) / n;double Tn = (f(a) + f(b)) * h / 2.0;  //计算 n=1 时的积分,粗略值double T2n;     //步长变为一半后的积分值bool key = false;do {    //至少循环一次double Hn = 0.0;for (int k = 0; k < n; k++) {double x = a + (k + 0.5) * h;Hn += h * f(x);}T2n = (Tn + Hn) / 2.0;//判断误差if (fabs(Tn - T2n) < error) {key = true;}else {Tn = T2n;n *= 2;h /= 2;}} while (!key);return T2n;
}

二、龙贝格算法

I - T_{2n} \approx \frac{1}{3}(T_{2n}-T_{n})       

  • I  准确值
  • T_{2n} 数值计算近似值
  • \frac{1}{3}(T_{2n}-T_{n})  为误差

1、 I \approx T_{2n}+ \frac{1}{3}(T_{2n}-T_{n})     记为 S_{n} .

=S_{n}            (simpson序列)         

还存在误差

2、simpson公式的余项,可得:

\frac{I-S_{2n}}{I-S_{n}}\approx \frac{1}{16}\Rightarrow I-S_{2n}\approx \frac{1}{15}(S_{2n}-S_{n})

\therefore C_{n} = S_{2n}+\frac{1}{15}(S_{2n}-S_{n})       (柯特斯序列)

还存在误差

3、求柯特斯公式的余项,可得:

R_{n}=C_{2n}+\frac{1}{63}\cdot (C_{2n}-C_{n})     (龙贝格序列)

加权平均公式:\frac{4T_{n}-T_{n}}{4-1} = S_{n}\cdots \frac{4^{2}S_{2n}-S_{n}}{4^{2}-1}=C_{n}\cdots \frac{4^{3}C_{2n}-C_{n}}{4^{3}-1}=R_{n}

三、代码实现

  • T_{n}=\frac{h}{2}[f(a)+f(b)+2\sum_{k=1}^{n-1}f(x_{k})]
  • S_{n}=T_{2n}+ \frac{1}{3}(T_{2n}-T_{n}) = \frac{4}{3}T_{2n}-\frac{1}{3}T_{n}
  • C_{n} = S_{2n}+\frac{1}{15}(S_{2n}-S_{n}) = \frac{16}{15}S_{2n}-\frac{1}{15}S_{n}
  • R_{n}=C_{2n}+\frac{1}{63}\cdot (C_{2n}-C_{n}) = \frac{64}{63}C_{2n}-\frac{1}{63}C_{n} 

例: f(x) = \int_{1}^{2}\frac{log(1+x^{2})}{1+x^{2}}      ,程序结果为: 

具体代码为(没有安装armadillo矩阵计算库的点这里):

//#include<iostream>
//#include<armadillo>
//#include<iomanip>#include"romberg.h"using namespace std;
using namespace arma;int main()
{const double eps = 1e-6;int size = 50;Romberg.zeros(size, 4);Coefficient << 4 / 3.0 << 1 / 3.0 << endr<< 16 / 15.0 << 1 / 15.0 << endr<< 64 / 63.0 << 1 / 63.0 << endr;double a =1, b=2;cout << "请输入积分下限, a = ";cin >> a;cout  << "请输入积分上限, b = ";cin >> b;cout << endl;double result = getSn(a, b, eps);cout << "积分结果为:" << setprecision(8) << result << endl;
}

头文件为:

#pragma once
#include<iostream>
#include<math.h>
#include<armadillo>
#include<iomanip>
#include<vector>using namespace std;
using namespace arma;mat Romberg;                            //用于存放T、S、 C、R
mat Coefficient;                        //存放 计算系数
// 记录坐标值
vector<double> x_vec;
vector<double> y_vec;// 积分函数
double fun(double x) {double y = log(1 + pow(x, 2)) / (1 + pow(x, 2));return y;
}//存储对应坐标
void GreatXY(double a, double b, int n) {x_vec.clear();y_vec.clear();double h = (b - a) / n;for (int k = 0; k <= n; k++) {double x = a + h * k;double y = fun(x);x_vec.push_back(x);y_vec.push_back(y);}
}/*变步梯形积分a:积分下限b:积分上限n:节点数*/
double getTn(double a, double b, int n)
{GreatXY(a, b, n);double h = (b - a) / n;double Tn = h / 2.0 * (fun(a) + fun(b));for (int k = 1; k < n; k++) {double x = a + k * h;Tn += h * fun(x);}return Tn;
}void FillMatrix(double &a, double &b) {//填充Tnfor (int k = 0; k <= 4; k++) { //先计算k =0,1,2,3,4的情况,即将S1、S2计算出来,在|S1-S2|不符合误差情况时在更新矩阵。Romberg(k, 0) = getTn(a, b, pow(2, k));}//填充Sn(i=1)、Cn(i=2)、Rn(i=3)       //编程思想的行列,从零开始for (int i = 1; i <= 3; i++) {       //列for (int j = i; j <= 4; j++) {    //行Romberg(j, i) = Romberg(j, i - 1)*Coefficient(i - 1, 0) - Romberg(j - 1, i - 1)*Coefficient(i - 1, 1);}}
}double getSn(double a, double b,double eps){FillMatrix(a, b);//判断误差if (fabs(Romberg(4, 3) - Romberg(3, 3)) < eps) {return Romberg(4, 3);}else {for (int k = 5;; k++) {Romberg(k, 0) = getTn(a, b, pow(2, k));     //TRomberg(k, 1) = 4 / 3.0 *Romberg(k, 0) - 1 / 3.0*Romberg(k - 1, 0);           //SRomberg(k, 2) = 16 / 15.0*Romberg(k, 1) - 1 / 15.0*Romberg(k - 1, 1);      //CRomberg(k, 3) = 64 / 63.0 *Romberg(k, 2) - 1 / 63.0*Romberg(k - 1, 2);     //R//再次比较if (fabs(Romberg(k, 3) - Romberg(k-1, 3)) < eps) {return Romberg(k, 3);break;}if (k >= 50) {cout << "循环次数太多,请更换程序算法";return -1;break;}}}
}

 


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

相关文章

高斯-勒让德积分学习

高斯-勒让德积分求解函数积分 前言高斯-勒让德积分一般积分区间的归一化Exponential Integral实验参考 前言 梯度和辛普森是经典的几何求积分方法&#xff0c;简单易懂&#xff0c;那如果要更加高档&#xff08;复杂难懂&#xff09;的求积分方法找哪家了&#xff1f;高斯-勒让…

数值积分公式及龙贝格(Romberg)算法实现matlab

一、数值积分方法得基本思想 二、复化求积公式 三、基于复化梯形求积公式的高精度求积算法——Richardson外推法和Romberg算法 四、Romberg算法的matlab程序&#xff1a; function Romberg % 龙贝格(Romberg数值求解公式) % inputs: % -fun&#xff1a;积分函数句柄 % -a/…

数值积分:龙贝格求积

一、数学原理 在变步长的复化梯形计算过程中运用&#xff1a; 就能将粗糙的梯形值Tn逐步加工成精度较高的辛普森值Sn、柯特斯值Cn和龙贝格值Rn。或者说&#xff0c;将收敛缓慢的梯形值序列Tn加工成收敛迅速的龙贝格值序列Rn&#xff0c;这种线性外推的加速方法称为龙贝格算法&…

数值积分之龙贝格积分

除了复化求积外&#xff0c;这里用龙贝格积分法进行近似求积&#xff0c;其原理与埃特金插值有些类似&#xff0c;进行线性整合后使结果具有高精度的求积效果。在实际过程中&#xff0c;由于对于评判合理步长的困难&#xff0c;我们常采取变步长的办法进行计算&#xff0c;使结…

积分极限定理+勒贝格控制收敛定理+高数

在处理积分与极限的交换顺序问题上&#xff0c;勒贝格积分比黎曼积分要求的条件要弱的多&#xff08;并且条件更易于验证&#xff09; 积分与极限交换顺序的定理&#xff1a; 控制收敛定理 { f n ( x ) } 为 E 上 的 一 列 可 测 函 数 \{ f_n(x)\}为E上的一列可测函数 {fn​(…

[转]勒贝格积分的框架与通俗理解

为什么会出现勒贝格积分 这个问题等价于勒贝格积分和黎曼积分有什么区别。其实这个区别没有那么玄&#xff0c;反而很好解释。问题的根源在于黎曼积分的定义上。黎曼积分&#xff1a;.黎曼积分是在轴上做的分割&#xff0c;虽然可以分割得很细&#xff0c;但只要被积函数在这个…

实变函数自制笔记9:勒贝格积分的极限定理

1、非负可测函数积分的极限&#xff1a; 背景&#xff1a;在数学分析里&#xff0c;函数列极限函数黎曼可积性有这样的表述&#xff1a;&#xff0c;且每个均在上可积函数列的极限函数也在上可积&#xff1b;从而有这样的公式&#xff1a;&#xff1b;那我们会想&#xff0c;勒…

实变函数自制笔记8:初识勒贝格积分

1、勒贝格&#xff08;Lebesgue&#xff09;积分&#xff1a; 背景&#xff1a;勒贝格积分是在勒贝格测度论的基础上建立起来的&#xff0c;这一理论可以统一处理函数有界、无界的情形&#xff0c;且函数也可以定义在更一般的点集&#xff08;不一定是&#xff09;上&#xff…

python三阶魔方_三阶魔方还原公式

1. 第二层棱块归位&#xff1a; 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位。 转动顶层(U)&#xff0c;若可以使一个棱中间块归位(如下图左&#xff0c;这里以[红-黄]块为例)&#xff0c;而其他3个都不能归位&#xff0c;则将[红-黄]所在这一…

QA和QC到底是什么区别?

QA和QC到底是什么区别? 发现迄今为止,仍然有很多工程师,甚至很多的企业对QA和QC的概念仍然非常的模糊不清.两个概念也经常性的混淆,特别是在互联网公司,那么今天小编这里就对QA和QC到底有什么区别,展开一下讨论. 在讲到软件工程体系中的时候,我们不仅要延伸到从最早通过简单…

生产追溯系统-IQC来料检验

相信大家都知道&#xff0c;任何一家工厂都有自己的仓库&#xff0c;用来存储采购回来的物料&#xff0c;那么在供应商将我们采购的物料送到工厂之后&#xff0c;我们都需要一个检验动作&#xff0c;也就是>IQC来料检验&#xff0c;这个检验动作是非常重要的一个环节&#x…

质量控制之室内质控(IQC)和室间质评(EQA)

检验医学——中华检验医学网旗下微信公众平台。您的随身微杂志。 很多人都有过这样的经历&#xff1a;拿着做过的医疗检查单换一家医院看病&#xff0c;所有的检查还得重做。对患者来说&#xff0c;过多的医疗检查也是造成看病难、看病贵的因素之一。为贯彻落实国务院办公厅《关…

ERP的IQC检验

ERP IQC检验是一种全面的物料质量控制机制&#xff0c;旨在保证入库前货物都能够符合质量要求。它涉及及时检验物料的质量以及根据检验的结果判断是否需要发货或回退。 ERP中的IQC检验内容 IQC模块使企业能够进行质量检查&#xff0c;确保产品质量&#xff0c;以满足客户的需…

工厂里常说的QC, IQC, IPQC, QA 简介

一、QC与QA QC&#xff1a;Quality Control&#xff0c;品质控制&#xff0c;产品的质量检验&#xff0c;发现质量问题后的分析、改善和不合格品控制相关人员的总称。 IQC&#xff1a;意思是来料的质量控制 IPQC&#xff1a;过程质量控制。 FQC&#xff1a;成品质量检验 O…

【spring】Spring是什么?

一.Spring的简介 Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。 然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言&#xff0c;绝大部分Java应用都可以从Spring中…

Spring是什么意思?

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序…

Java之Spring

目录 创建spring项目存储bean对象到容器&#xff08;spring&#xff09;中从spring中将bean取出更简单的读取存储对象存储bean对象前置准备添加注解存储 Bean 对象 获取bean对象 bean作用域和生命周期定义bean的6种作用域bean生命周期 IOC优点&#xff1a;实现代码的解耦&#…

Spring官方文档(中文版!!!)

https://docs.spring.io/spring/docs/5.2.5.BUILD-SNAPSHOT/spring-framework-reference/images/prototype.png本文档是对spring官方文档的解读&#xff0c;原文档参见Spring官方文档 &#xff0c;本人只是翻译和整理&#xff0c;由于水平有限&#xff0c;部分解读可能不正确&…

Spring入门第一讲——Spring框架的快速入门

Spring的概述 什么是Spring&#xff1f; 我们可以从度娘上看到这样有关Spring的介绍&#xff1a; 说得更加详细一点&#xff0c;Spring是一个开源框架&#xff0c;Spring是于2003年兴起的一个轻量级的Java开发框架&#xff0c;由Rod Johnson在其著作Expert One-On-One J2EE …

是Spring啊!

一.概念 spring概念 一个包含了众多工具方法的 IoC 容器 okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么? Ioc 2.1解释 IoC -> Inversion of Control 控制反转 -> 对象的生命周…