まずは、図4の様な円の面積を求めることにする。もちろん、この
円の面積はと分かっているが、これを乱数を用いて数値計算しようと言うのである。
円を囲む正方形内部には、ランダムな点がある。正方形内部にある点の個数を
、円の
内部にある個数を
とする。そして、正方形の面積を
、円を
とする。する
と、これらには
![]() |
(16) |
円の面積を求めても大したことはないが、例えば図5のよ
うな複雑な形状の面積が計算できるとなるとぐっと御利益はある。先ほどの円の面積と同
じようにして、計算できるのである。計算したい部分内の点の数は、
![]() |
![]() ![]() ![]() ![]() ![]() ![]() |
|
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(18) |
このように複雑な領域の積分でも適用でき、応用範囲の広い方法である。積分の
精度を上げようとすると、サンプル数を増やすことになる。しかし、その精度は、た
かだかサンプル数の平方根に比例するのみである。誤差を1/10にしたければ、サンプル数
を100倍にする必要がある。これが、この方法の最大の弱点である。
精度がサンプル数の平方根に比例するのは、完全な乱数を仮定しているからである。それ を計算機で発生させることは不可能なので、その生成も問題となる。できるだけ良い乱数 を使わなくてはならないが、この問題は奥が深い。ここではこれ以上立ち入らないが、興 味のある者は調べてみると良い。
話は変わるが、ひとつ注意を与えておく。実際のプログラムでは、乱数を使って
を発生させて、それが内部にあるか否かをその場で判断する。配列に座標データを入れて、
最後に検査するとメモリーがいくらあっても足りなくなるからである。
|
|
積分を計算するために、まずは体積である。先ほどは、二次元問題であるが、はかなり複
雑な形状の面積をモンテカルロ積分で計算する方法を示した。2次元と同じ考えで、3次元、
4次元、、M次元の体積も比較的、容易に求めることができる。分かり切った体積
に、領域
を包み込み、その内部にランダムに配置されたサンプル点の数を数えれ
ば良いのである。体積の計算は簡単である。
残りは、体積内部の平均
である。これも簡単で、領域
内部
にあるサンプル点の平均より求めることができる。即ち、
![]() ![]() |
(20) |
以上より、モンテカルロ法を用いると、体積と平均値
の近似値が
計算できることが分かる。従って、式(20)の近似値を求めることが
できる。
数値計算で有名な本「NUMERICAL RECIPES in C」 [1]には、図 6の様な形状の重心を求める問題が出ている。このように複雑な積 分が必要なときにモンテカルロ法は威力を発揮する。