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