Deprecated: Assigning the return value of new by reference is deprecated in /home/users/2/floppy.jp-999953/web/kagakusukimono/class/View.php on line 25

Deprecated: Assigning the return value of new by reference is deprecated in /home/users/2/floppy.jp-999953/web/kagakusukimono/class/View.php on line 30

Warning: Cannot modify header information - headers already sent by (output started at /home/users/2/floppy.jp-999953/web/kagakusukimono/class/View.php:25) in /home/users/2/floppy.jp-999953/web/kagakusukimono/class/View.php on line 81
科学好き者の日々::エクセルでモンテカルロ法

エクセルでモンテカルロ法

またもやエクセルの例題です。
モンテカルロ法でπを求めます。
モンテカルロ法は、正方形に内接する円を考え、乱数で正方形内に任意の点を打ちます。

内接円

円の半径をrとすると、円の面積はπrで正方形の面積は4rですので面積比は π:4 となり、円の内側にある点の数(m)と全ての点の数(n)を数えれば、π/4=m/n からπが求まることになります。ここではr=1とします。

エクセル表

表のX,Yは0〜1の乱数です。=RAND() の関数を使います。4行目〜65536行目(エクセルの最大行)まで入力します。
+Yを求めます。
円の中かどうかは X+Y<r(=1) なら円の中ですので、判定結果の列に =IF(E4<1,"",0) を入れて円の外なら0を表示するようにします。(円の外の方が数が少ないので処理が早い)
判定結果の列の上に =COUNT(F4:F65536) で判定結果の列の4行目から65536行目(エクセルの最大行)までにいくつ数字があるか数えます。これが円の外の数です。全体(65533)から引けば円の中の数が求まります。円の中の数を全体で割って4倍するとπが求まります。

さて実行結果は
3.144614
3.137168
3.144065
3.149009
3.138693
3.141379
などが得られました。

判定を「<(未満)」としたのですが、線上はどうなるのかと「<=(以下)」の判定でやっても結果は変わりません。線上はそれほどはないのでしょうね。
再計算の処理時間は「<」のとき7分40秒なのが「<=」とすると11分25秒と処理時間が増えてしまいます。判定に時間がかかるのでしょうね。
また、外側を数えるのではなく内側を数えると11分24秒と処理時間が増えてしまいます。処理回数が増えるからでしょうね。

ちなみに、CPUはアスロンXPの+1700でメモリーは512Mです。


Calendar
<< May 2024 >>
SunMonTueWedThuFriSat
   1234
567891011
12131415161718
19202122232425
262728293031
search this site.
tags
archives
recent comment
recent trackback
others
admin