我无法在此Scheme计划中找到我的错误来计算PI

时间:2009-08-23 14:09:18

标签: math scheme sicp

我正在进行蒙特卡罗实验来计算PI的近似值。来自SICP:

  

蒙特卡罗方法包括   随机选择样品实验   从一大套,然后制作   在此基础上扣除   估计的概率   列出那些结果   实验。例如,我们可以   近似使用的事实   6 / pi ^ 2是两个概率   随机选择的整数将没有   共同的因素;那是他们的   最大公约数将是1. To   获得近似值,我们   进行大量的实验。   在每个实验中,我们选择两个   随机整数并执行测试   看他们的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)))

我的翻译是麻省理工学院/ GNU 7.7.90

感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

好吧,直接回答你的问题,你的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)。


让我们在这里退后一步,看看蒙特卡罗方法对我们的计算方法(提示:期望收敛非常慢。你运行了多少次?)......

每个试验给出0或1,概率p = 6 /π 2 。这是一个Bernoulli process的例子,在许多试验 n 中,对于1的 m binomial distribution。 / p>

考虑ρ= m / n,即通过除数检验的次数。该a具有p的平均值和p(1-p)/ n的方差,或者stddevσρ = 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,5%的时间你会在2 std devs之外,或者在0.5982和0.6177之间。因此,给定n = 10000时,这种方法的π估计值将在3.117和3.167之间,在95%的时间内,超出此范围的时间为5%。

如果你想将试验次数增加100,那么std dev会减少10倍,π的估计值会在3.1391和3.1441之间变窄,置信度为95%。

蒙特卡罗方法很适合进行粗略估计,但是他们需要大量的试验来获得准确的答案,并且通常会达到收益递减的程度。

并不是说这是近似pi的无效方法,只要注意这个问题。

答案 1 :(得分: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)))