アプリ版:「スタンプのみでお礼する」機能のリリースについて

モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。
例えば、定積分∫[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

A 回答 (2件)

質問のソースはカテゴリ違いですが、


アルゴリズムに関する質問だと思いますので、
言語に依存しない部分で回答します。

f(x) = x*x の関数を、0~1の区間で積分ですね。

まず、y 軸の範囲を考えます。
グラフを書けば分かりやすいと思います。

f(0) = 0 から始まり、xが増加すれば f(x) も増加。
f(1) = 1 で終わりなので、y 軸の範囲は 0~1 とします。

---------------------------------
ループ回数 n の入力

カウント sumin を初期化

ループ開始(n 回ループ)

x に 0~1の乱数を代入(積分区間)

y に 0~1の乱数を代入(上記で計算した範囲)

ポイント(x, y) が求める面に入っていればカウントする
つまり、y < x*x の場合はカウント sumin に 1 を加算

ループ終了

結果は、(乱数範囲の面積) × (カウント) ÷ (ループ回数)
つまり、 1 * 1 * sumin / n
---------------------------------

円周率の場合とほとんど変わらないと思います。

このアルゴリズムを、お使いのBASICで記述して下さい。

そのBASICでの記述方法が分からないと言うのなら、
「その他(プログラミング)」の方が良いかも。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
道筋だけでも教えて頂き、とても助かります。
ありがとうございました。

お礼日時:2007/11/24 20:51

こちらはC/C++のカテゴリーです。


投稿されたコードはBASIC系の言語のものであるように
お見受けします。
このコードをC/C++に置き換えたらどうなるか、という
ご質問でしょうか?

この回答への補足

BASICでお聞きしたいのですが…このカテゴリーじゃないみたいですね。すみません、カテゴリーを間違えたみたいです。
内容的に、その他(プログラミング)で質問するべきなのでしょうか?

補足日時:2007/11/24 07:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!