6-9 求一元函数定积分

        一元函数f(x)在区间[a,b]上定积分∫ab​f(x)dx的几何意义是被积函数与横坐标轴以及直线x=a和直线x=b围成的曲边形的面积。依据几何意义求定积分的方法是将这个区域按x轴方向等分成若干个细小的条状区域,每个小区域近似于一个梯形(如图所示),计算出所有小梯形面积之和就可计算出区域面积的近似值。区间划分的越细求得的结果越精确

6-9 求一元函数定积分_第1张图片

现在要求用梯形法编写一个求一元定积分的函数,调用该函数求解以下三个函数在给定区间的定积分。
(1) y=x2
(2) y=x3
(3) y=sinx

函数接口定义:

double integration(double (*p)(),double a,double b,int n);

其中  a  b 是积分区间的端点,n是对积分区间的等分数量。 p 是一个指向函数的指针。

裁判测试程序样例:

#include 
#include 
#include 
double square(double x)
{
    return x*x;
}
double cube(double x)
{
    return x*x*x;
}
/*你编写的积分函数嵌入在这里*/
int main()
{
    /*求平方函数在区间[0,2]上的定积分*/
    printf("square=%f\n",integration(square,0,2,10000));
    /*求立方函数在区间[0,2]上的定积分*/
    printf("cube=%f\n",integration(cube,0,2,10000));
    /*求正弦函数在区间[0,2]上的定积分*/
    printf("sin=%f\n",integration(sin,0,2,10000));
    return 0;
}

输入样例:

0 2 100000

输出样例:

square=2.666667
cube=4.000000
sin=1.416147

定积分定义:

定积分是积分的一种,是函数f(x)在区间[a,b]上积分和的极限。具体定义如下:

设函数f(x) 在区间[a,b]上连续,将区间[a,b]分成n个子区间[x₀,x₁], (x₁,x₂], (x₂,x₃], …, (x,xₙ],其中x₀=a,xₙ=b。该和式叫做积分和,设λ=max{△x₁, △x₂, …, △xₙ}(即λ是最大的区间长度),如果当λ→0时,积分和的极限存在,则这个极限叫做函数f(x) 在区间[a,b]的定积分,记为,并称函数f(x)在区间[a,b]上可积。

之所以称其为定积分,是因为它积分后得出的值是确定的,是一个常数, 而不是一个函数。

当然对于一元函数的积分 我们可以简单理解为求函数在指定区间x轴所围成的面积

有了上面的解释我们就可以只去求f(x)与x轴所围成的面积即可 

在高中我们学过利用分割法去求面积

6-9 求一元函数定积分_第2张图片

解决代码

double integration(double (*p)(),double a,double b,int n){
    double sum = 0;
/*elem 表示分割区间的宽度*/
    double elem = (b-a)/n;
    for(double i=a;i<=b-elem;i=i+elem){
        /*p(i)表示区间左边界的函数值  p(i+elem)表示区间右边界的函数值*/
        /*对两个面积的和 求平均*/
        sum+=(p(i)+p(i+elem))*elem/2;
    }
    return sum;
}

6-9 求一元函数定积分_第3张图片

注意: 在积分求解过程中 我们一定 一定 要注意积分的上下限 为了保证积分的上下限都被取到

我们可以把上下限的计算放入for循环中

自我反思:在我第一次做的时候代码如下

double integration(double (*p)(),double a,double b,int n){
    
    double sum=0;
    //elem 代表区间分割的大小
    double elem=(b-a)/n;
    for(double i=0;i

这样写第三个测试点一直过不去 ,于是检查发现可能是积分的上下限的问题,所以这一题建议把积分上下限放在for循环中

你可能感兴趣的:(算法题,算法)