100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 使用 Trapezoidal Rule(梯形法则)求积分

使用 Trapezoidal Rule(梯形法则)求积分

时间:2023-06-23 08:01:00

相关推荐

使用 Trapezoidal Rule(梯形法则)求积分

Trapezoidal Rule

思想原理

为了求解积分值,人们想到一种近似方法。假设要求 f(x)f(x)f(x) 在 [a,b][a,b][a,b] 上的积分,将积分区间等长分成 nnn 段,则每两个分段点之间的距离 h=b−anh=\frac{b−a}{n}h=nb−a​,然后如下图进行近似

则该区间上的积分值就近似等同于每个小梯形的面积之和。

推导过程

如上图所示,∫abf(x)\int_{a}^{b}f(x)∫ab​f(x) 的结果,就是上图中所有梯形面积总和。

梯形面积

第一个梯形(最左边)的上底 f(x0)f(x_0)f(x0​),下底 f(x1)f(x_1)f(x1​),高为 h=b−anh=\frac{b-a}{n}h=nb−a​,因此对应的面积为 S1=(f(x0)+f(x1))∗h/2=(f(x0)+f(x1))∗h2S_1=(f(x_0)+f(x_1))*h/2=\frac{(f(x_0)+f(x_1))*h}{2}S1​=(f(x0​)+f(x1​))∗h/2=2(f(x0​)+f(x1​))∗h​。

以此类推,最后一个(最右边)的上上底 f(xn−1)f(x_{n-1})f(xn−1​),下底 f(xn)f(x_n)f(xn​),高为 h=b−anh=\frac{b-a}{n}h=nb−a​,因此对应的面积为 Sn=(f(xn−1)+f(xn))∗h/2=(f(xn−1)+f(xn))∗h2S_n=(f(x_{n-1})+f(x_n))*h/2=\frac{(f(x_{n-1})+f(x_n))*h}{2}Sn​=(f(xn−1​)+f(xn​))∗h/2=2(f(xn−1​)+f(xn​))∗h​。

因此,所有梯形的总面积为

∫abf(x)≈∑i=1n(Si)=S0+...+Sn=h2[f(x0)+f(x1)+f(x1)+f(x2)+⋯+f(xn−2)+f(xn−1)+f(xn−1)+f(xn)]=(b−a)2∗n[f(x0)+2∑i=1nf(xi)+f(xn)]\int_{a}^{b}f(x) \approx \sum_{i=1}^{n}(S_i)=S_0+...+S_n\\ =\frac{h}{2}[f(x_0)+f(x_1)+f(x_1)+f(x_2)+\cdots + f(x_{n-2})+ f(x_{n-1})+ f(x_{n-1})+ f(x_{n})]\\ =\frac{(b-a)}{2*n}[f(x_0)+2\sum_{i=1}^{n}f(x_i)+f(x_n)]∫ab​f(x)≈i=1∑n​(Si​)=S0​+...+Sn​=2h​[f(x0​)+f(x1​)+f(x1​)+f(x2​)+⋯+f(xn−2​)+f(xn−1​)+f(xn−1​)+f(xn​)]=2∗n(b−a)​[f(x0​)+2i=1∑n​f(xi​)+f(xn​)]

C++ implement

输入

根据上面的公式,我们可以总结出,输入包括以下几个:

1、f(x)f(x)f(x)。即需要积分的函数。

2、x0x_0x0​。即积分开始点。

3、xnx_nxn​。即积分结束点。

4、nnn。即毕竟的次数。

f(x)f(x)f(x) 函数

和前面的设计一样,使用外部函数实现。对应的函数原型如下:

//输入x,计算对应的y值。double f(double x);

主框架

类似前面的计算,主要用于输入数据。

#include <iostream>using namespace std;//输入x,计算对应的y值。double f(double x);int main() {//变量定义double lower;//起点坐标double upper;//终点坐标int step;//迭代次数cout<<"Enter lower limit of integration:";cin>>lower;cout<<"Enter upper limit of integration:";cin>>upper;cout<<"Enter number of sub intervals:";cin>>step;//计算 hdouble h=(upper-lower)/step;//计算f(x0)+f(xn)double ans=f(lower)+f(upper);//开始迭代double x=lower;for (int i=1; i<step; i++) {x += h;ans += 2*f(x);}ans = ans*h/2;//结果输出cout<<"Required value of integration is: "<<ans<<"\n";return 0;}

测试

样例 1

我们计算 ∫0611+x2\int_0^6\frac{1}{1+x^2}∫06​1+x21​,迭代次数为 666 次。

f(x)f(x)f(x) 函数实现

#include <cmath>//输入x,计算对应的y值。double f(double x) {return 1.0/(1+pow(x,2));}

编译

测试环境为 Win10+MinGW,使用 g++ 编译器。

g++ -g -o TR.exe main.cpp f.cpp

运行结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。