• ベストアンサー

BASICでモンテカルロ法

モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ええと、専門用語では「提案分布」と言うんですが、それが積分範囲を「近似しつつ」かつ「計算が簡単な」分布を目的の積分範囲の外側になきゃいけません。 僕はBASICは良く知らないのですが、つまり擬似コード的にはこう言う事です。 1.積分したい関数(例では0≦x≦1の範囲でのx^2)を設定する。 2.上の「被積分関数」を上手く近似しそうな適当な分布を選ぶ。 とは言っても、実際の「確率分布」ではなくって、この場合「0≦x≦1の範囲」ってのをヒントとして、0≦x≦1、0≦y≦1と言う「正方形」を考えます。これが1の「被積分関数」を上手く囲んでいる事が分かるでしょう。 3.(x, y)の乱数を生成して「提案分布」内に乱数をプロットしていく。 4.3.の乱数がy≦x^2を満たしていたら「当たり」、そうじゃなかったら「ハズれ」として、数をカウントしていく。 5.当たりの数/(当たりの数+ハズレの数)×「提案分布の面積」が目的の被積分関数の面積、になる こう言うプログラムがオーソドックスな「モンテカルロ法での定積分」の手法となるんではないでしょうか?

juck0808
質問者

お礼

ありがとうございました。参考にさせていただきました。

その他の回答 (3)

回答No.4

僕はBASICを全く知らないので、代わりにSchemeと言う言語で問題のモンテカルロ法のソースを書いてみました。 何かの参考にして頂ければ幸いです。 (define (montecarlo n) (let loop ((i 0) (j 0));カウンターi、成功数jの初期値 (if (= i n) ;終了条件 (exact->inexact (/ j i)) ;解=成功数/カウント (let ((x (random)) (y (random)));x,yを設定 (loop (+ i 1) (+ j (if (<= y (* x x));繰り返し計算 1 0))))))) これをScheme処理系(例えばフリーウェアのDrScheme)で走らせると以下のような結果になりました。 > (montecarlo 1000000) 0.333365 と言うわけで、目的は達成できたとは思います。

juck0808
質問者

お礼

ありがとうございました。参考にさせて頂きました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

0~1の範囲の乱数を2つ求めて、それらをx, yとします。 y <= x*x を満たすとき、個数(例示のコードではsumin)を 1つ増やします。 乱数の組(x, y)を求める回数を十分大きく取れば、 sumin / 回数 の値は0.33333... に近づいていくことでしょう。

juck0808
質問者

お礼

ありがとうございました。参考にさせて頂きました。

回答No.1

提示しているプログラムは、モンテカルロ法による円周率の計算のようですね。 「定積分」ということは面積です。 半径1の円を考えます。(式1:x^2 + y^2 = 1) 計算を簡単にするために、x,yが共に正の部分(第一象限)のみに注目すると 1/4円の面積は、π/4となります。(理論値) 1/4円の面積を求めるために、x軸を10等分して 円に収まる棒グラフのような四角形を考えます。 各棒グラフの高さは、式1より y = √(1 - x^2) 各棒グラフの面積を合計すれば、円の面積の近似値が得られます。 あとはx軸の分割数を大きくして、より詳しく計算するだけです。 各棒グラフを単純な四角形から台形にすればさらに正確な近似値が得られます。

juck0808
質問者

お礼

ありがとうございました。参考にさせて頂きました。

関連するQ&A

  • モンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1, 1.1, -0.1,1.1 DRAW grid SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET r=x*x SET POINT COLOR 2 ! PRINT USING "(%.####, %.####)": x,y; PLOT POINTS: x,y; NEXT i PRINT sumin;n PRINT sumin/n END

  • fortran モンテカルロ法

    モンテカルロ法により円周率πを計算するプログラムを作ったのですが、以下のプログラムでモンテカルロ法から推定された円周率piの値が実行すると大きな数字になってしまって、うまく計算できてない見たです。式に問題があるのでしょうか?教えて下さい。 rogram list1_9 implicit none real(8) x, y, pi, pi0 integer :: n, i, im = 2**20 pi0 = 2.0d0*acos(0.0d0) n = 0 do i = i, im call random_number(x) call random_number(y) if(x ** 2 + y ** 2 <= 1.0d0) n = n + 1 enddo pi = 4.0d0*dble(n)/dble(im) write(*,*) ' pi, pi0, er = ', pi, pi0, pi-pi0 end program list1_9

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • IF文 教えてください (BASIC)

    1, 2, 3, 4 のいずれかの値を取る3つの乱数 x, y, z を同じ行に表示させ,さらに x=y=z=1 のときは「大当」, x=y=z≠1 のときは「当」, x, y, z のうち2つだけが一致したときは「惜」, 上記以外の場合は「残念」 と表示するプログラム ELSEIF文を用い,IF文およびEND IF文は1回で済ませる。 乱数x,y,zを表示することと IF文が分かりません。 RANDOMIZE FOR n=1 TO 3       PRINT INT (RND*4)+1; NEXT n

  • モンテカルロ法を使ったルートの出しかた

    エクセルを使ったモンテカルロ法での√5の求めかたを知りたいです。 例題として√2がありました。 乱数を10個ほどだし出し(Xとします) =IF(X*X<0.5,1,0)を各乱数に対し代入します。 代入して出た数字をY1~Y10とすると =AVERAGEA(Y1:Y10)*2 で答えが出ます。 この例と同じ流れで√5をだすにはどうすればいいでしょうか。 =IF(X*X<●,1,0) ●の部分を変えればいいと思うのですが…, √3を出す例題では●は0.75でした。

  • 数値積分 モンテカルロ法を用いて

    次の問題をモンテカルロ法を用いたC言語のプログラムを教えてください。 積分区間[0,10] ∫x^3+x^2-2x+10dx です お願いします。

  • モンテカルロ法

    モンテカルロ法で円(半径y=1、x=2の楕円)の面積を求める計算なのですが、 http://www.geocities.co.jp/SiliconValley-SanJose/8366/kihonC.html このURLのプログラムについて、 ソースプログラムの15行目をxの半径が2なので、”2*”となっているのは分かるのですが、 ・17行目でx*xを4で割ることの意味 (2x*2xとなるから4で割ってるのかなとか漠然とは思うのですが、理解をつめたいです。。) ・20行目でinを2倍している意味 を教えていただきたいです。 よろしくお願いいたします。

  • モンテカルロ法を用いた積分計算のプログラミング

    今、指数関数の積分をモンテカルロ法を用いてMatlab上で計算しようとしています。 途中までプログラムを組みましたが、間違っている個所があるようなのです。 rand()の使い方が間違っているのでしょうか? また、rand()は一様分布に従う疑似乱数を返すという解釈で合ってますでしょうか? プログラム上にあるX2がとる値の大きさと、randのとる値の大きさは?と聞かれたのですが、 どのように答えていいか分りません。。。 下にプログラムを載せました。 よろしくお願いいたします。 N = 10000; %the number of calculation a =0; %begin of interval b =1; %end of interval c = exp(b); %constant of max f =0; for n = 1:N; X1 = a +rand()*(b-a); %Generate values from the uniform distribution on the interval [a, b] X2 = a + rand()*(1-0); if (c * X2 ) < (exp(X1)) f = f +1; %count the number of point in the area end end y = f*c*(b-a) / N % f/N:ratio of points, c*(b-a):area of integral Int = exp(b) - exp(a) err = abs(Int - y)

  • VBAにおける、たし算の自動作問プログラムについて

    二列目に、二桁の整数の足し算を出題することができるたし算の作問プログラムを以下のように作ったのですが、続いて三列目に、足し算の解答をして、それの正誤を確かめるプログラムを作りたいのですがどのようにすればよいでしょうか? ↓作問のプログラム Sub test() Columns("B:F").Clear n = InputBox("問題数は?") ReDim ans(n) For i = 1 To n Randomize x = Int(Rnd * 100) Randomize y = Int(Rnd * 100) ans(i) = x + y Cells(i, 2) = "(" & i & ") " & x & " + " & y & " = " Next i End Sub 以下のような感じで採点のプログラムを作りたいのですが、上のプログラムの変数ans(i)を参照する場合、下のプログラムのans(i)はどのように定義すればよいのでしょうか? Sub saiten() For i = 1 To n If Cells(i, 3) = ans(i) Then Cells(i, 4) = "○" Else: Cells(i, 4) = "×" Next i End Sub

  • 08年センター試験本試数学Bコンピュータ

    以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

専門家に質問してみよう