Написать программу для аппроксимации числа Пи по формуле Лейбница на схеме?

Я пытаюсь понять, как написать программу для аппроксимации числа Пи по формуле Лейбница. Функция принимает ошибку E и каким-то образом дает приближение числа пи.

Совершенно не знаю, как это сделать. Я начал писать вспомогательную функцию, но не знал, что в нее вставить. Любая помощь?

Спасибо!


person Community    schedule 25.03.2013    source источник


Ответы (2)


Формула Лейбница для PI представляет собой суммирование. Функция будет увеличивать n до тех пор, пока слагаемое для n не станет меньше E.

(define (leibniz err)
  (define (summand n)
    (/ (expt -1 n) (+ (* 2.0 n) 1)))
  (let summing ((result 0) (n 0))
    (let ((increment (summand n)))
      (if (< (abs increment) err)
          (* 4 (+ result increment))
          (summing (+ result increment) (+ n 1))))))
person GoZoner    schedule 25.03.2013

Формула Лейбница - довольно неэффективный способ вычисления π, если не используется какой-либо метод ускорения сходимости. Согласно Wikipedia, для вычисления π с точностью до 10 правильных десятичных знаков с использованием прямого суммирования ряда требуется около 5 000 000 000 членов!

В любом случае, вот прямой перевод формулы - с небольшими улучшениями, включая удаление операции возведения в степень, что делает ее немного быстрее, чем реализация @ GoZoner:

(define (leibniz err)
  (let loop ((n 0)
             (prev +nan.0)
             (curr 0.0))
    (if (<= (abs (- curr prev)) err)
        (* 4 curr)
        (loop (add1 n)
              curr
              ((if (even? n) + -) curr (/ 1 (add1 (+ n n))))))))

Процедура повторяется до тех пор, пока разница между текущим значением ряда и предыдущим не станет меньше или равна предоставленной ошибке. Ошибка должна быть небольшим числом, скажем 1e-6. Например:

(leibniz 1e-6)
=> 3.1415946535856922

Для справки, в этом вопросе есть несколько очень коротких реализаций формулы Лейбница - включая один в схеме.

person Óscar López    schedule 26.03.2013