积分(一)——复化梯形积分(C++)

梯形积分

设f(x)在[a,b]上连续,若要计算其积分,则
∫ a b f ( x ) d x = F ( b ) − F ( a ) \int_a^b f(x)dx = F(b) - F(a) abf(x)dx=F(b)F(a)
其中F(x)为f(x)的原函数,但是计算机直接计算出该积分函数比较困难,因此需要近似求解。梯形积分使用函数的区间边界点作梯形进行计算,即
∫ a b f ( x ) d x ≈ ( f ( a ) + f ( b ) ) ( b − a ) 2 \int_a^b f(x)dx \approx \frac{(f(a)+f(b))(b-a)}{2} abf(x)dx2(f(a)+f(b))(ba)
当[a,b]区间比较小时,这个误差就比较小,对于[a,b]区间比较大的情况,普通的梯形积分就不再适用,需要对梯形积分进行复化。

复化梯形积分

复化梯形积分就是在区间[a,b]上进行m次划分,每次划分得到n个子区间,然后计算每个子区间的梯形积分,最后将这m个梯形积分相加,得到整个区间的梯形积分。
假设[a,b]区间被划分为n个区间,h=(b-a)/n, x k = a + k h ( k = 0 , ⋯ , n ) x_k=a+kh(k=0,\cdots ,n) xk=a+kh(k=0,,n)
∫ a b f ( x ) d x ≈ ∑ k = 1 n h 2 [ f ( x k − 1 + f ( x k ) ) ] = h 2 [ f ( a ) + 2 ∑ k = 1 n − 1 f ( x k ) + f ( b ) ] \int_a^b f(x)dx \approx \sum_{k=1}^n \frac{h}{2}[f(x_{k-1}+f(x_k))]\\ =\frac{h}{2}[f(a)+2\sum_{k=1}^{n-1}f(x_k)+f(b)] abf(x)dxk=1n2h[f(xk1+f(xk))]=2h[f(a)+2k=1n1f(xk)+f(b)]

误差分析

复化梯形积分要划分为多少个区间才合适呢?显然需要做一个误差控制,但是问题就在于如何判断复化梯形积分与实际积分值的误差,使用梯形积分的原因就是因为原本的积分不容易求出来,所以直接比较是不可以的,此处需要使用到事后误差分析,即区间继续增加划分数量时,积分值变化小于某个值时即可认为此时的积分与实际的误差小于一定范围。
复化梯形积分的余项可以表示为:
R [ f ] = ∑ k = 1 n [ − h 3 12 f ′ ′ ( ξ k ) ] = − h 2 12 ( b − a ) ∑ k = 1 n f ′ ′ ( ξ k ) n = − h 2 12 ( b − a ) f ′ ′ ( ξ ) ( ξ ∈ ( a , b ) ) = − ( b − a ) 3 12 n 2 f ′ ′ ( ξ ) ( ξ ∈ [ a , b ] ) R[f]=\sum_{k=1}^n [-\frac{h^3}{12}f''(\xi_k)]\\ =-\frac{h^2}{12}(b-a)\frac{\sum_{k=1}^n f''(\xi_k)}{n}\\ =-\frac{h^2}{12}(b-a)f''(\xi)(\xi \in (a,b))\\ =-\frac{(b-a)^3}{12n^2}f''(\xi)(\xi \in [a,b]) R[f]=k=1n[12h3f′′(ξk)]=12h2(ba)nk=1nf′′(ξk)=12h2(ba)f′′(ξ)(ξ(a,b))=12n2(ba)3f′′(ξ)(ξ[a,b])
因此,要求梯形积分与实际积分值小于 ϵ \epsilon ϵ,则其余项小于 ϵ \epsilon ϵ
I ( f ) − T n ( f ) = − b − a 12 h 2 f ′ ′ ( ξ ) I ( f ) − T 2 n ( f ) = − b − a 12 ( h / 2 ) 2 f ′ ′ ( η ) I(f)-T_n(f)=-\frac{b-a}{12}h^2f''(\xi)\\ I(f)-T_{2n}(f)=-\frac{b-a}{12}(h/2)^2f''(\eta) I(f)Tn(f)=12bah2f′′(ξ)I(f)T2n(f)=12ba(h/2)2f′′(η)
两者可以近似为:
I ( f ) − T n ( f ) ≈ 4 [ I ( f ) − T 2 n ( f ) ] I(f)-T_n(f)\approx 4[I(f)-T_{2n}(f)]\\ I(f)Tn(f)4[I(f)T2n(f)]
因此若有
T 2 n ( f ) − T n ( f ) < 3 ϵ T_{2n}(f)-T_n(f)< 3\epsilon T2n(f)Tn(f)<3ϵ
即可等价为
I ( f ) − T 2 n ( f ) < ϵ I(f)-T_{2n}(f)< \epsilon I(f)T2n(f)<ϵ

代码实现

#include<iostream>
#include<cmath>
#include<iomanip>//这个头文件仅仅是用来设置cout的输出精度
#define abs(x) (x>0?x:-x)
using namespace std;
//梯形积分,传入参数为分段的n,积分下限a,积分上限b,对应的积分函数
double trapezium(int n,double a,double b,float(*f)(float x))
{double f_x=0.0f;double h=(b-a)/n;for (int i = 1; i < n; i++){f_x+=f(a+i*h);//梯形公式的f(x_k)的累加和}f_x*=h;f_x+=(f(a)+f(b))*h/2;//根据n算出对应的复化梯形积分return f_x;
}
//直接在这里换函数,函数为sin(x)/x
float fx(float x)
{float result;float x_temp=((x==0)?1e-15:x);result=sin(x_temp)/x_temp;return result;
}
int main()
{double error=1e-6;//表示误差小于10^-6次方double a=0.0,b=2.0;//积分上下限int n=1;double f_x_n=(fx(a)+fx(b))*(b-a)/2;double f_x_2n;//可以在此处添加循环次数控制,防止误差无法缩小的情况出现while(true){f_x_2n=trapezium(n*2,a,b,fx);//算T2nif(fabs(f_x_n-f_x_2n)<(error*3)){//cout<<n<<":trapezium error="<<fabs(f_x_n-f_x_2n)<<endl;cout << "梯形积分的误差为:" << fabs(f_x_n - f_x_2n) << endl;n*=2;break;}n+=1;f_x_n=trapezium(n,a,b,fx);//算Tn}cout<<"区间划分数量:n="<<n<<",积分值为:"<<std::setprecision(10)<<f_x_2n<<endl;return 0;
}

结果分析

运行程序后,被积函数为sin(x)/x,积分区间为[0,2],为了达到 I ( f ) − T 2 n ( f ) < 1 0 − 6 I(f)-T_{2n}(f)< 10^{-6} I(f)T2n(f)<106,需要将区间划分为382个小区间,此时采用事后误差估计法求得的 T 2 n ( f ) − T n ( f ) = 2.98242 × 1 0 − 6 T_{2n}(f)-T_n(f)=2.98242\times 10^{-6} T2n(f)Tn(f)=2.98242×106
在这里插入图片描述
为了验证事后误差估计法,采用Matlab进行计算, I ( f ) I(f) I(f)如下:
在这里插入图片描述

计算 T 2 n ( f ) − I ( f ) T_{2n}(f)-I(f) T2n(f)I(f)如下:
在这里插入图片描述
可以看出事后误差估计得到的结果符合期望。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SolidWorks学习笔记——草图绘制的基本命令

目录 一、进入草图绘制 二、直线命令与删除命令 三、圆弧命令与矩形命令 四、槽口命令以及多边形命令 五、椭圆以及倒角命令 六、草图绘制中的剪裁命令 七、草图中的几何关系 八、草图绘制中的智能尺寸 九、从外部粘贴草图&#xff08;CAD&#xff09; 一、进入草图绘…

【蓝桥杯省赛真题23】python水仙花数 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python水仙花数 一、题目要求 1、编程实现 2、输入输出

AJAX——AJAX入门

1 什么是AJAX&#xff1f; Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于在Web应用程序中实现异步通信的技术。 简单点说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON、XML、HTML和test文本等格式发送和接收数据。 AJAX最吸…

隐函数的求导【高数笔记】

1. 什么是隐函数&#xff1f; 2. 隐函数的做题步骤&#xff1f; 3. 隐函数中的复合函数求解法&#xff0c;与求导中复合函数求解法有什么不同&#xff1f; 4. 隐函数求导的过程中需要注意什么&#xff1f;

java8默认方法

口什么是默认方法 口如何以一种兼容的方式改进API 口默认方法的使用模式 口 解析规则 传统上&#xff0c;Java程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供一个实现&#xff0c;或者从父类中继承它的实现。但是&#xff0c;一…

《苍穹外卖》知识梳理6-缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品&#xff0c;购物车功能 一.缓存菜品 可以使用redis进行缓存&#xff1b;另外&#xff0c;在实现缓存套餐时可以使用spring cache提高开发效率&#xff1b;   通过缓存数据&#xff0c;降低访问数据库的次数&#xff1b; 使用的缓存逻辑&#…

【C语言】Linux内核accept 系统调用代码

一、Linux 4.19内核accept 系统调用代码中文注释 /** 在使用accept时&#xff0c;我们尝试创建一个新的socket&#xff0c;与客户端建立连接&#xff0c;* 唤醒客户端&#xff0c;然后返回新的连接文件描述符&#xff08;fd&#xff09;。我们在内核空间收集* 连接方的地址&am…

laravel_框架结构和文件夹_简单分析

文章目录 简单看一下laravel框架的目录结构illuminate_一柳梅内特的含义illuminate下面有多少文件夹的&#xff1f;介绍一下illuminate下面的文件夹功能我的分类 简单看一下laravel框架的目录结构 illuminate_一柳梅内特的含义 作为及物动词&#xff0c;它的意思是“阐明&…

leetcode hot 100最小花费爬楼梯

本题和之前的爬楼梯类似&#xff0c;但是需要考虑到花费的问题&#xff01;**注意&#xff0c;只有在爬的时候&#xff0c;才花费体力&#xff01;**那么&#xff0c;我们还是按照动态规划的五部曲来思考。 首先我们要确定dp数组的含义&#xff0c;那么就是我们爬到第i层所花费…

【机器学习案例5】语言建模 - 最常见的预训练任务一览表

自监督学习 (SSL) 是基于 Transformer 的预训练语言模型的支柱,该范例涉及解决有助于建模自然语言的预训练任务 (PT)。本文将所有流行的预训练任务放在一起,以便我们一目了然地评估它们。 SSL 中的损失函数 这里的损失函数只是模型训练的各个预训练任务损失的加权和。 以BE…

计算组合数C(n,k)即从n个不同元素中选取k个元素的方法数binom()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算组合数C(n,k) 即从n个不同元素中 选取k个元素的方法数 binom() [太阳]选择题 以下代码的输出结果中正确的是? from scipy.special import binom print("【执行】binom(3, 2)"…

LabVIEW虚拟测试与分析仪

LabVIEW虚拟测试与分析仪 在现代工程技术领域&#xff0c;虚拟仪器的开发和应用已成为一种趋势。利用LabVIEW软件平台开发的虚拟测试与分析仪器进行展开&#xff0c;实现工程测试和分析中的实际需求。通过结合LabVIEW的强大功能和灵活性&#xff0c;成功实现了一套高效、精确的…