2009-08-23 13 views
3

私はPIの近似値を計算するためにモンテカルロ実験を行っています。 SICPから:PI計算のためのこのSchemeプログラムで私のエラーを見つけることができません

モンテカルロ法は、大規模なセットからランダム でサンプル実験を選択し、それら 実験の結果を集計 から推定 確率に基づいて 控除を作る で構成されています。例えば、 は、 6/pi^2がランダムに選択された2つの整数には共通して の要素を持たない確率であるという事実を使って近似することができます。すなわち、 の最大公約数は1になります。 に近似を求めるには、 という数多くの実験を行います。各実験で 我々はランダムに2つの 整数を選択し、そのGCDは、テストに合格された回数の割合 1であるかどうかを確認するためにテスト を行うには、6/PI^2の 私たちの推定を与える、と このから我々は近似を piに得る。

しかし、私は私のプログラムを実行すると、私はここで3.9 ...

のような値を得ることが私のプログラムである:

(define (calculate-pi trials) 
    (define (this-time-have-common-factors?) 
    (define (get-rand) 
     (+ (random 9999999999999999999999999999999) 1)) 
    (= (gcd (get-rand) (get-rand)) 1)) 
    (define (execute-experiment n-times acc) 
    (if (> n-times 0) 
     (if (this-time-have-common-factors?) 
      (execute-experiment (- n-times 1) acc) 
      (execute-experiment (- n-times 1) (+ acc 1))) 
     acc)) 
    (define n-success (execute-experiment trials 0)) 
    (define prob (/ n-success trials)) 
    (sqrt (/ 6 prob))) 

私の通訳はMIT/GNU 7.7.90で

感謝助けを求めて

+0

DrSchemeで実行するコードを取得できません。定義:関数本体の式が1つだけ期待されていましたが、少なくとも1つの余分な部分が見つかりました:(define(execute-experiment n-times acc)(if(> n-times 0) (実行時実験(n回1)(+ acc 1)))acc)) したがって、条件付きのあなたがしていると思われることをやっています。 –

+2

それは役に立ちませんが、あなたの質問で私はこれを考えました:http://www.wikihow.com/Calculate-Pi-by-Throwing-Frozen-Hot-Dogs。私が助けなかったら、少なくとも私は笑いを提供することができます。 – duffymo

+0

最後の2つの 'define'は前の定義を評価する必要があるため有効ではありません。 –

答えて

11

まあ、直接あなたの質問に答えるために、あなたは後方if文を持っています。それはこのようにすべきです。試験の#は無限大に近づくにつれて限界に6/π -

(if (this-time-have-common-factors?) 
     (execute-experiment (- n-times 1) (+ acc 1) 
     (execute-experiment (- n-times 1) acc)) 

は、だから、1を計算しています。これは、 "PI" = SQRT得(6 /(1 - 6/π ))= SQRT(6 π /(π -6))= 3.911)。


はのはしかし、ここに戻って一歩を踏み出すと、モンテカルロ法は、この計算で私たちのために何をするかを見てみましょう(ヒント:あなたはそれを実行しているどのように多くの時間が非常に遅い収束を期待します?)...

各試行は確率p = 6/π で0または1を与えます。これは、数が mの数が nbinomial distributionであるBernoulli processの例です。

ρ = m/n、共通除数テストに合格した時間の割合。このaはpの平均値とp(1-p)/ nの分散、または標準偏差があります。σ ρ = sqrt(p(1-p)/ n)です。 n = 10000の場合、std devは0.00488であるはずです。 95% of the time you will be within 2 std devs of the meanであり、2デシベル外にいる時間の5%、または0.5982から0.6177の間の時間の5%です。したがって、n = 10000で与えられるこの方法のπの見積もりは、時間の95%の3.117と3.167の間にあり、この範囲の5%の範囲外です。

試行回数を100回増やすと、標準偏差が10倍に減少し、πの推定値は95%信頼度で3.1391〜3.1441に狭められます。

モンテカルロの方法は大まかな見積もりには適していますが、正確な回答には多くの試行が必要で、通常はリターンが減少する点に達します。

これはpiを近似するための無駄な方法ではありませんが、この問題に注意してください。

+0

あなたの返信と追加情報ありがとう! – Castro

+0

>何回実行していますか? (calculate-pi 99999999) 1] =>;値:3.141544196485725 – Castro

3

私のエラーが見つかりました。 ありがとうございます。 私は間違った場所で成功したケースを増やしていました。

修正されたコードは次のとおりです。

(define (calculate-pi trials) 
    (define (this-time-have-common-factors?) 
    (define (get-rand) 
     (+ (random 9999999) 1)) 
    (= (gcd (get-rand) (get-rand)) 1)) 
    (define (execute-experiment n-times acc) 
    (if (> n-times 0) 
     (if (this-time-have-common-factors?) 
      (execute-experiment (- n-times 1) (+ acc 1)) 
      (execute-experiment (- n-times 1) acc)) 
     acc)) 
    (define n-success (execute-experiment trials 0)) 
    (define prob (/ n-success trials)) 
    (sqrt (/ 6 prob))) 
+0

ええ、あなたはそれを持っています! –

関連する問題