一、梯形法求解定积分的过程
1.求定积分值存在的问题
计算定积分是数值计算领域内的一个重要内容。对于能够得到原函数的被积函数,如:
,
其定积分可以直接计算。
但对于不易得到原函数的被积函数,可以考虑使用数值计算的方法得到近似值。如:
不易得到原函数,故其如下
的定积分也不容易求解。
2.定分积的几何意义
定积分的几何意义是被积函数和x轴以及积分上限、积分下限之间围成的图形的面积。如下图所示:
图中x轴、y=x与y=1所围三角形的面积即为
对于无法得到原函数的被积函数,其定积分也是这样的面积。如下图所示:
上图中,x轴、f(x)、a、b等所围成的阴影面积即为
的值,即以a为积分下限、b为积分上限、被积函数f(x)的积分值。
3.积分数值计算过程
图2中的阴影面积是不容易得到的。可以用近似的方法得到,即梯形近似法。如下图所示:
在f(a)、f(b)之间直接连线,则可以由x轴、a、b、以及连线形成梯形。该梯形的两个底分别为:f(a)、f(b),高为(b-a),由梯形的面积公式,可以得到上图中所围梯形的面积为:
(式1)
这个可以作为的近似值。当然其误差比较大。
如果对上图进一步分割,按下图进行拆分,
文章来源地址https://www.toymoban.com/news/detail-471427.html
设c为积分下限a、积分上限b的之间中点,则
以f(c)为线对图形进行分割,形成两个梯形,分别计算面积,再对面积求和。
梯形S1的两个底分别为f(a)、f(c),高为(c-a);梯形S2的两个底分别为f(c)、f(b),高为(b-c)。则面积:
同样,
这样,总的面积是:
(式2)
令(式1)为,(式2)为,可以得到:
(式3)
如果对上图中S1、S2再进行等分分割,可以得到如下图的S1、S2、S3、S4四个梯形。再次分别计算其面积后进行求和,可以得到更近似的面积,即定积分值。如此,不断进行将[a,b]进行二分,递推下去,得到的积分值越来越精确,可以无限逼近函数f(x)在[a,b]上的定积分。
这样可以得到递推公式。具体是:将[a,b]段分为n等分,一共有n+1个等分点,第k(k=0,1,2...n)个等分点的值为:,其中,
用表示将[a,b]n等分后梯形面积的总各,用表示将[a,b]2n等分后的梯形面积总各,得到递推公式为:
(式4)
利用上式,即可以得到定积分的近似值。设置某一个精度e,当时,即认为达到精度,迭代结束。
二、计算定积分的C++程序
1.计算函数的值
//---------------------------
double func( double x )
{
if( x != 0 )
return sin( x ) / x;
else
return 1.0;
}
//----------------------------
由于x不能为0,且,因此,设定,当x=0时,返回值为1.0。
2.迭代函数
//----------------------------
double ING( double a, double b, double e )//参数:积分下限,积分上限,精度
{
double T1 = 0.0;
double T2 = 0.0;
double S = 0.0;
double h, x;
int flag;
h = b - a;
T1 = h / 2 * ( func( a ) + func( b ) );//计算第一个面积
do {
double s = 0;
x = a + h /2;
while( x < b )//循环计算
{
s = s + func( x );
x = x + h;
}
T2 = T1 / 2 + h / 2 * s;
if( fabs( T1 - T2 ) >= e )//判断精度
{
h = h / 2;
T1 = T2;
flag = 1;//当精度不够时,标志为1
}
else flag = 0;
}
while( flag );//为1时(意味着精度不够),继续计算。
return T2;
}
//-------------------------------
3.完整程序
//-----------------------------
#include <iostream>
#include <cmath>
using namespace std;
//-----------------------------
double func( double x );
double ING( double a, double b, double e );
//-----------------------------
int main()
{
double LowLim, HighLim, Accur;
cout << "Input the low and high linitation and accuracy:" << endl;
cout << "Low limitation: ";
cin >> LowLim; //输入积分下限
cout << "High limitation:";
cin >> HighLim; //输入积分上限
cout << " Accracy:";
cin >> Accur; //输入精度
if( LowLim >= HighLim ) //积分上限不能小于积分下限,否则提醒再次输入
cout << "HighLim is less than LowLim.Please input again.";
else cout << "The result of integration is: " << ING( LowLim, HighLim, Accur ) << endl;
system( "PAUSE" );
return 0;
}
//---------------------------
double func( double x )
{
if( x != 0 )
return sin( x ) / x;
else
return 1.0;
}
//----------------------------
double ING( double a, double b, double e )//参数:积分下限,积分上限,精度
{
double T1 = 0.0;
double T2 = 0.0;
double S = 0.0;
double h, x;
int flag;
h = b - a;
T1 = h / 2 * ( func( a ) + func( b ) );//计算第一个面积
do {
double s = 0;
x = a + h /2;
while( x < b )//循环计算
{
s = s + func( x );
x = x + h;
}
T2 = T1 / 2 + h / 2 * s;
if( fabs( T1 - T2 ) >= e )//判断精度
{
h = h / 2;
T1 = T2;
flag = 1;//当精度不够时,标志为1
}
else flag = 0;
}
while( flag );//为1时(意味着精度不够),继续计算。
return T2;
}
//-------------------------------
三、运算结果
文章来源:https://www.toymoban.com/news/detail-471427.html
到了这里,关于用梯形法求定积分的值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!