![]() |
(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)の近似値を求めることが
できる.