![]() |
(1) |
1 #include <stdio.h>
2 #include <math.h>
3 #define N 1000 // 分割数
4
5 double f(double x); // プロトタイプ宣言
6
7 //======= メイン関数 ==================
8 int main(void)
9 {
10 double a, b, h;
11 double t=0;
12 int j;
13
14 a=0; // 積分の左端
15 b=2*M_PI; // 積分の右端
16
17 h=(b-a)/N;
18
19 for(j=0; j<N; j++){
20 t += f(a+j*h)+f(a+(j+1)*h);
21 }
22 t *= h/2;
23
24 printf("Integral = %e\n", t);
25
26 return 0;
27 }
28
29
30 //======= 関数 ========================
31 double f(double x)
32 {
33 double y;
34
35 y=sin(x)*sin(x);
36
37 return y;
38 }
2次関数で近似を行うことを考える.2次関数で近似するためには,3点必要である.3つの
分点をそれぞれ,
とする.そして,この2次関数を
と
する.
はラグランジュ補間に他ならないので,
これを,区間
で積分する.紙面の都合上,式
(3)の右辺を各項毎に積分を行う.まず,右辺第1項で
あるが,それは以下のようになる.
これは,ある区間
の積分で,その巾は
である.区間
にわ
たっての積分
は,式(7)を足し合わせればよい.ただし,
と足し合わせる.
![]() |
(8) |
この式から,分割数
は偶数でなくてはならないことがわかる.
積分を計算するために,まずは体積である.これは体積の計算が容易な単純な形状の内部
に,領域
を包み込み,その内部にランダムに配置されたサンプル点の数を数えれ
ば良いのである.単純な形状内部に配置されたランダムな点の数を
とする.そして,
その内部にある積分領域
に含まれる点の数を
とする.さらに,単純
な形状の体積を
,領域
のそれを
とすると,
![]() |
(10) |
残りは,体積内部の平均
である.これも簡単で,領域
内部
にあるサンプル点の平均より求めることができる.即ち,
| (11) |
以上より,モンテカルロ法を用いると,体積
と平均値
の近似値が
計算できることが分かる.従って,式(9)の近似値を求めることが
できる.