ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言丨定积分的近似计算

2021-12-13 13:59:33  阅读:175  来源: 互联网

标签:double 近似计算 梯形 C语言 积分 曲边 函数指针 矩形


我们已经知道,定积分\int_{a}^{b}f\left ( x \right )dx的几何意义是曲线y=f\left ( x \right )和两条直线x=ax=bx轴所围成的曲边梯形的面积,由此我们可以得出近似计算定积分的多种算法。下面分别介绍定积分的近似计算的三种方法:矩形法梯形法抛物线法

目录

矩形法

左矩形法

右矩形法

梯形法

抛物线法


矩形法

几何意义:用窄条矩形的面积作为窄条曲边梯形面积的近似值,整体上用台阶形的面积作为曲边梯形面积的近似值。


左矩形法

数学原理:设f\left ( x \right )\left [ a,b \right ]上连续,这时定积分\int_{a}^{b}f\left ( x \right )dx存在。采取把区间\left [ a,b \right ]等分的方法,即用a=x_{0},x_{1},,x_{2},\cdots ,x_{n}=b\left [ a,b \right ]分成n个长对象等的小区间,每个小区间的长为\Delta x=\frac{b-a}{n},在小区间\left [ x_{i-1},x_{i} \right ]上,用f\left ( x_{i-1} \right )代替小区间上的函数值,有\int_{a}^{b}f\left ( x \right )dx\approx \frac{b-a}{n}\sum_{i=1}^{n}f\left ( x_{i-1} \right )

代码实现

double Integral(double (*f)(double), double a, double b)//double (*f)(double)为定义的函数指针,使用函数指针可使本函数通用于任何函数的定积分计算
{
    double s, h;
    int n = 100, i;
    s = (*f)(a);//第一个矩形的底s1=f(a)
    h = (b - a) / n;//矩形的高为小区间的长度
    for (i=1; i<n; i++)
    {
        s += (*f)(a + i * h);//累加第一个矩形的底至第n个矩形的底,相当于s=s1+...+sn
    }
    return s * h;//面积为s*h=(s1+...+sn)*h=(s1*h+...+sn*h)
}

右矩形法

数学原理:相应地,把左矩形法中代替一步改为用f\left ( x_{i} \right )代替小区间上的函数值,有\int_{a}^{b}f\left ( x \right )dx\approx \frac{b-a}{n}\sum_{i=1}^{n}f\left ( x_{i} \right )

代码实现:相应地,只需把初始条件s赋值为(*f)(b),并让循环从右端点开始加至左端点

double Integral(double (*f)(double), double a, double b)//double (*f)(double)为定义的函数指针,使用函数指针可使本函数通用于任何函数的定积分计算
{
    double s, h;
    int n = 100, i;
    s = (*f)(b);//第一个矩形的底s1=f(b)
    h = (b - a) / n;//矩形的高为小区间的长度
    for (i=1; i<n; i++)
    {
        s += (*f)(b - i * h);//累加第一个矩形的底至第n个矩形的底,相当于s=s1+...+sn
    }
    return s * h;//面积为s*h=(s1+...+sn)*h=(s1*h+...+sn*h)
}

可以证明,矩形法计算定积分的误差为o\left ( n \right )


梯形法

几何意义:和矩形法一样,将区间\left [ a,b \right ]n等分。曲线y=f\left ( x \right )上的点\left ( x_{i},f\left ( x_{i} \right ) \right )记作M_{i}\left ( i=0,1,2,\cdots ,n \right )。将曲线y=f\left ( x \right )上的小弧段弧M_{i-1}M_{i}用直线段\overline{M_{i-1}M_{i}}代替,也就是把窄条曲边梯形用窄条梯形代替。

数学原理\int_{a}^{b}f\left ( x \right )dx\approx \frac{b-a}{n}\left ( \frac{f\left ( x_{0} \right )+f\left ( x_{1} \right )}{2}+\frac{f\left ( x_{1} \right )+f\left ( x_{2} \right )}{2}+\cdots +\frac{f\left ( x_{n-1} \right )+f\left ( x_{n} \right )}{2}\right )=\frac{b-a}{n}\left ( \frac{f\left ( x_{0} \right )+f\left ( x_{n} \right )}{2}+f\left ( x_{1} \right )+f\left ( x_{2} \right )+\cdots +f\left ( x_{n-1} \right ) \right )

显然,梯形法公式所得近似值就算是左矩形法公式和右矩形法公式所得两个近似值的平均值。

代码实现

double Integral(double (*f)(double), double a, double b)//double (*f)(double)为定义的函数指针,使用函数指针可使本函数通用于任何函数的定积分计算
{
    double s, h;
    int n = 100, i;
    s = ((*f)(a) + (*f)(b)) / 2;
    h = (b - a) / n;//梯形的高为小区间的长度
    for (i=1; i<n; i++)
    {
        s += (*f)(a + i * h);
    }
    return s * h;//面积为s*h=(s1+...+sn)*h=(s1*h+...+sn*h)
}

可以证明,梯形法计算定积分的误差为o\left ( n^{2} \right ),因此比矩形法的误差更小。


抛物线法

几何意义:将曲线y=f\left ( x \right )上的两个小弧段弧M_{i-1}M_{i}和弧M_{i}M_{i+1}合起来,用过M_{i-1},M_{i},M_{i+1}三点的抛物线y=px^{2}+qx+r代替。

数学原理:经推导可得,以此抛物线为弧段的曲边、以\left [ x_{i-1},x_{i+1} \right ]为底的曲边梯形面积为\frac{1}{6}\left ( y_{i-1}+4y_{i}+y_{i+1} \right )\cdot 2\Delta x=\frac{b-a}{3n}\left ( y_{i-1}+4y_{i}+y_{i+1} \right )

取n为偶数,得到定积分的近似值为\int_{a}^{b}f\left ( x \right )dx\approx \frac{b-a}{3n}\left [ \left ( y_{0}+4y_{1}+y_{2} \right )+\left ( y_{2}+4y_{3}+y_{4} \right )+\cdots +\left ( y_{n-2}+4y_{n-1}+y_{n} \right ) \right ]=\frac{b-a}{3n}\left [ y_{0}+y_{n}+4\left ( y_{1}+y_{3}+\cdots +y_{n-1} \right )+2\left ( y_{2}+y_{4}+\cdots +y_{n-2} \right ) \right ]

代码实现

double Integral(double (*f)(double), double a, double b)//double (*f)(double)为定义的函数指针,使用函数指针可使本函数通用于任何函数的定积分计算
{
    double s, h;
    int n = 100, i;
    s = (*f)(a) + (*f)(b);
    h = (b - a) / n;
    for (i=0; i<n-1; i+=2)
    {
        s += 4 * (*f)(a + h + 2 * i * h);
    }
    for (i=0; i<n-2; i+=2)
    {
        s += 2 * (*f)(a + 2 * h + 2 * i * h);
    }
    return s * (h / 3);
}

显然,因抛物线相较于矩形与梯形来说,与原曲线梯形的拟合度更高,用抛物线法计算定积分的误差将比矩形法与梯形法更小。


定积分的近似计算实质上采用的是微积分的重要思想:微元法。以上仅介绍了三种计算定积分的方法,感兴趣的朋友们可以自行研读微积分,寻求更多算法。


参考文献:

同济大学数学系 编,高等数学第七版上册,高等教育出版社,P229-231.

标签:double,近似计算,梯形,C语言,积分,曲边,函数指针,矩形
来源: https://blog.csdn.net/weixin_60921752/article/details/121901096

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有