矩形法求定积分的原理和实现
写一个矩形法求解定积分的通用函数,分别求: ∫01sinxdx\int_0^1sinxdx∫01sinxdx,∫01cosxdx\int_0^1cosxdx∫01cosxdx,∫01\int_0^1∫01exxx dxdxdx
矩形法求解定积分
做个小笔记,如表述有不对的地方,欢迎指正。
原理
积分在图形上表示就是面积,把被积分区域划分成一个个小矩形,求解这些矩形的面积和即可。
被积函数:f(x)f(x)f(x);
积分区间:[a,b][a,b][a,b];
积分区间划分数:NNN;
每个小矩形的面积:
Si=(b−a)/N∗∣f(a+(b−a)/N∗i)∣Si = (b - a )/ N * |f(a + (b - a )/ N * i)|Si=(b−a)/N∗∣f(a+(b−a)/N∗i)∣
说明:
你可以想象一下,在积分函数图形上,我们把被积分区域划分成NNN等份,
此时每个小矩形的底为:(b−a)/N(b - a )/ N(b−a)/N.
如果N足够大,可以把被积分区域划分成一根根针一样大小的矩形区域。
此时小矩形的底可以看成一个点。在被积分区域内,每个小矩形对应的位置
为:x=a+(b−a)/N∗ix = a + (b - a )/ N * ix=a+(b−a)/N∗i,将其代入f(x)f(x)f(x)即可得到对应小矩形的高。
假设iii为第iii个小矩形 , 则∣f(a+(b−a)/N∗i)∣|f(a + (b - a )/ N * i)|∣f(a+(b−a)/N∗i)∣即为第iii块小矩形的高。
所以计算每个小矩形的面积用如上所述的公式。
f(x)f(x)f(x)如果为cos,sin,expcos,sin,expcos,sin,exp等内置函数可以使用C/C++里面的math库,注意这些函数的传参【如果是角度要转换为弧度传入:角度 / 180 * PI 】
例子
求解定积分:∫01sinxdx\int^{1}_{0}sinxdx∫01sinxdx
根据上述公式写出矩形法求解此定积分的代码:
#include <iostream>
#include <cmath>
using namespace std;
double get_integral_sinx(double a,double b,int N)
{
/*
积分区间:[a,b] ,值均是弧度
积分区间划分数目:N ,越大求得的结果越精细
被积分函数:sinx
*/
double x = (b - a) / N;
double ans = 0;
for(int i = 1; i <= N; ++i)
{
ans += x * fabs(sin(a + x*i));
}
return ans;
}
int main()
{
double ans = get_integral_sinx(0,1,1000);
cout<<ans<<endl;
return 0;
}
如果你第一次接触,你难免会对上述做法有点疑虑,怕不可靠。
为了打消你的疑虑,我们结合我们手动求解定积分的方式来一个结果对比验证:
∫01sinxdx=[−cosx]01=1−cos(1)\int^{1}_{0}sinxdx = [-cosx]^{1}_{0} = 1 - cos(1)∫01sinxdx=[−cosx]01=1−cos(1)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
cout<<(1-cos(1))<<endl;
return 0;
}
运行上述两段代码,(运行结果我就不贴了,请自行验证)就可以对比出矩形法求解定积分的可靠性。
其他
我们常常可以使用C/C++里的math库中的一些内置函数来表示我们常用的一些常数。
比如圆周率PIPIPI:
因为cos(PI)=−1.0cos(PI) = -1.0cos(PI)=−1.0,所以有:
const double PI = acos(-1.0);
再如:常数eee,我记得大概是2.7…
exp(x)exp(x)exp(x)函数是用于计算exe^xex,所以有:
const double e = exp(1.0);
更多推荐
所有评论(0)