私は計算PIのために、このスキームプログラムで、私のエラーを見つけることができません

StackOverflow https://stackoverflow.com/questions/1318664

  •  19-09-2019
  •  | 
  •  

質問

私は、PIの近似値を計算するためにモンテカルロ実験を行っています。 SICPから:

  

モンテカルロ法は、から成り   ランダムにサンプル実験を選びます   大規模なセットから、次に作ります   に基づいて控除   確率から推定   これらの結果を集計   実験。例えば、我々はできます   事実を利用して近似   6 / PI ^ 2は、2つの確率であります   ランダムに選ばれた整数ではありません持っています   共通因子;それは彼らのことです   最大公約数をするには1になります。   近似値を取得し、我々   多数の実験を行います。   各実験では、2つを選択してください   ランダムに整数とテストを実行   彼らのGCDが1分数であるかどうかを確認します   テストが与え渡された回の   私たち私たちの6 / PI ^ 2の推定値、およびから   この私たちは、私たちに近似値を得ます   パイます。

しかし、私は私のプログラムを実行すると、私は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です。

任意の助けてくれてありがとう。

役に立ちましたか?

解決

さて、直接あなたの質問に答えるために、あなたは後方if文を持っています。それはこの方法である必要があります。

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

あなたは1を計算しているので - 6 /π 2 限界での試験の#は無限大に近づくにつれて。これは、 "PI" = SQRT(6 /(1 - 6 /π 2 ))が得られる= SQRTを(6π 2 /(π 2 - 6))= 3.911)。

<時間>

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

各試験は、確率P = 6 /π 2 で、私たちは0または1を与えるのいずれか。これは、1の Mの数のために、持っているベルヌーイ過程に、一例ですは試行回数では、 N 二項分布するます。

ρ= M / N、共通除数試験を通過回数の割合を考えます。このAは、pの値とP(1-P)の分散/ N、またはSTDのDEVのσ<サブ>ρ = SQRT(P(1-P)/ n)を意味しています。 nに= 10000、あなたは0.00488のSTD devのを期待するべきです。 あなたは平均するの2つのSTDの開発者内であろう時間の95%、および5%時間のあなたは2つのSTDの開発者の外、または0.5982と0.6177の間になるだろう。したがって、この方法からπの推定値は、時間の5%3.117と時間の3.167〜95%とこの範囲外となり、N所与= 10000

あなたは100で試行回数を増やしたい場合は、それが10倍STD DEVを低減し、πの推定値は、95%の信頼度で3.1391と3.1441の間で絞り込まれます。

モンテカルロ法は、概算のための素晴らしいですが、彼らは正確な答えのための臨床試験のLOTSと多くを必要とし、通常は収穫逓減のポイントに到達ます。

これはパイを近似する無益な方法ではないことを、単に問題を認識してます。

他のヒント

私は自分のエラーを見つけます。 ありがとうございます。 私は間違った場所に成功した例をインクリメントしてます。

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

(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)))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top