Tulis program untuk memperkirakan pi dengan rumus Leibniz di Skema?

Saya mencoba mencari cara untuk menulis program untuk memperkirakan pi dengan rumus Leibniz. Fungsi ini mengambil kesalahan, E, dan entah bagaimana memberikan perkiraan pi.

Saya tidak yakin sama sekali bagaimana melakukan ini. Saya mulai menulis fungsi pembantu tetapi tidak tahu apa yang harus dimasukkan ke dalamnya. Ada bantuan?

Terima kasih!


person Community    schedule 25.03.2013    source sumber


Jawaban (2)


Rumus Leibniz untuk PI adalah sebuah penjumlahan. Fungsi tersebut akan bertambah n hingga penjumlahan n lebih kecil dari 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

Rumus Leibniz adalah cara yang kurang efisien untuk menghitung π, kecuali jika digunakan teknik percepatan konvergensi. Menurut Wikipedia, menghitung π hingga 10 tempat desimal yang benar menggunakan penjumlahan langsung deret tersebut memerlukan sekitar 5.000.000.000 suku !

Bagaimanapun, berikut terjemahan langsung rumusnya - dengan sedikit optimasi termasuk penghapusan operasi eksponensial, yang membuatnya sedikit lebih cepat daripada implementasi @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))))))))

Prosedur ini terus melakukan iterasi hingga perbedaan antara nilai rangkaian saat ini dan nilai sebelumnya kurang dari atau sama dengan kesalahan yang diberikan. Kesalahannya harus berupa angka kecil, misalnya 1e-6. Misalnya:

(leibniz 1e-6)
=> 3.1415946535856922

Sebagai referensi, dalam pertanyaan ini ada beberapa implementasi singkat dari rumus Leibniz - termasuk satu di Skema.

person Óscar López    schedule 26.03.2013