矩形法求定積分的原理和實現

矩形法求解定積分

做個小筆記,如表述有不對的地方,歡迎指正。

原理

積分在圖形上表示就是面積,把被積分區域劃分成一個個小矩形,求解這些矩形的面積和即可。

被積函數:f(x)f(x);

積分區間:[a,b][a,b];

積分區間劃分數:NN;

每個小矩形的面積:
Si=(ba)/Nf(a+(ba)/Ni)Si = (b - a )/ N * |f(a + (b - a )/ N * i)|

說明:
你可以想象一下,在積分函數圖形上,我們把被積分區域劃分成NN等份,

此時每個小矩形的底爲:(ba)/N(b - a )/ N.

如果N足夠大,可以把被積分區域劃分成一根根針一樣大小的矩形區域。

此時小矩形的底可以看成一個點,在被積分區域內,每個小矩形對應的位置

爲:x=a+(ba)/Nix = a + (b - a )/ N * i,將其代入f(x)f(x)即可得到對應小矩形的高。

假設ii爲第ii塊小矩形 , 則f(a+(ba)/Ni)|f(a + (b - a )/ N * i)|即爲第ii塊小矩形的高。

所以計算每個小矩形的面積用如上所述的公式。

f(x)f(x)如果爲cos,sin,expcos,sin,exp等內置函數可以使用C/C++裏面的math庫

例子

求解定積分:01sinxdx\int^{1}_{0}sinxdx

根據上述公式寫出矩形法求解此定積分的代碼

#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=1cos(1)\int^{1}_{0}sinxdx = [-cosx]^{1}_{0} = 1 - cos(1)

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  cout<<(1-cos(1))<<endl;
  return 0;
}

運行上述兩段代碼,(運行結果我就不貼了,請自行驗證)就可以對比出矩形法求解定積分的可靠性。

其他

我們常常可以使用C/C++裏的math庫中的一些內置函數表示我們常用的一些常數
比如圓周率PIPI:
因爲cos(PI)=1.0cos(PI) = -1.0,所以有:

const double PI = acos(-1.0);

再如:常數ee,我記得大概是2.7…
exp(x)exp(x)函數是用於計算exe^x,所以有:

const double e = exp(1.0);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章