Frage

Ich mache ein Experiment Monte Carlo eine Annäherung von PI zu berechnen. Von SICP:

  

Das Verfahren Monte Carlo besteht aus   Auswahl Probe Experimente zufällig   aus einem großen Satz und dann machen   Abzüge auf der Grundlage der   Wahrscheinlichkeiten abgeschätzt aus   Tabelliermaschinen die Ergebnisse dieser   Experimente. Zum Beispiel können wir   annähernd mit der Tatsache, dass   6 / pi ^ 2 ist die Wahrscheinlichkeit, dass zwei   Zahlen zufällig ausgewählt werden keine   Faktoren gemeinsam; das heißt, dass ihre   größte gemeinsame Teiler wird 1 sein   erhalten die Annäherung an, wir   eine große Anzahl von Experimenten durchführen.   Bei jedem Versuch wählten wir zwei   Zahlen nach dem Zufallsprinzip und führen Sie einen Test   zu sehen, ob ihre GCD 1. Die Fraktion ist   Mal, dass der Test bestanden ist, gibt   uns unsere Schätzung von 6 / pi ^ 2, und aus   Diese erhalten wir unsere Annäherung an   pi.

Aber wenn ich mein Programm laufe ich erhalte Werte wie 3,9 ...

Hier ist mein Programm:

(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)))

Mein Dolmetscher ist MIT / GNU 7.7.90

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Nun, Ihre Frage direkt zu beantworten, können Sie die if-Anweisung nach hinten haben; es sollte so sein.

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

So Sie 1 sind die Berechnung - 6 / π 2 in der Grenze als die Anzahl der Versuche gegen unendlich. Dies ergibt "pi" = sqrt (6 / (1 - 6 / π 2 )) = sqrt (6π 2 / (π 2 - 6)) = 3,911).


Lassen Sie uns einen Schritt hier zurück, obwohl, und schauen, was die Monte-Carlo-Methode hat für uns bei dieser Berechnung (Hinweis: erwarten sehr langsame Konvergenz Wie oft sind Sie es ausgeführt wird.?) ...

Jeder Versuch entweder gibt uns 0 oder 1, mit einer Wahrscheinlichkeit von p = 6 / π 2 . Dies ist ein Beispiel für einen Bernoulli-Prozess , die für die Anzahl von 1en m hat in einer Reihe von Studien n , ein Binomialverteilung .

Betrachten ρ = m / n, der Bruchteil der Zeit des gemeinsamen Divisoren-Test bestanden. Dies hat einen Mittelwert von p und eine Varianz von p (1-p) / n, oder std dev σ ρ = sqrt (p (1-p) / n). Für n = 10000, sollten Sie einen std Entwickler von 0,00488 erwarten. 95% der Zeit, die Sie innerhalb von 2 std Devs des mittleren sein werden, und 5% außen 2 std devs oder zwischen 0,5982 und 0,6177 der Zeit Sie sein. So eine Schätzung von π von dieser Methode, da n = 10000, zwischen 3.117 und 3.167 95% der Zeit und außerhalb dieses Bereichs 5% der Zeit sein wird.

Wenn Sie die Anzahl der Versuche um 100 erhöhen wollen, die um den Faktor 10 und die Schätzung von π wird verengt zwischen 3,1391 und 3,1441 mit 95% std Entwickler reduziert.

Monte-Carlo-Methoden sind schön für eine grobe Schätzung, aber sie brauchen viele Versuche für eine genaue Antwort, und in der Regel einen Punkt des abnehmenden Ertrags erreichen.

Nicht, dass dies ein fruchtlos Weg ist nur ungefähre pi, seien sich des Problems bewusst.

Andere Tipps

Ich finde meine Fehler. Dank an alle. Ich war die erfolgreichen Fälle an der falschen Stelle erhöht wird.

Der korrigierte Code lautet:

(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)))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top