เขียนโปรแกรมประมาณ pi ด้วยสูตร Leibniz ใน Scheme หรือไม่?

ฉันกำลังพยายามหาวิธีเขียนโปรแกรมประมาณพายด้วยสูตรไลบ์นิซ ฟังก์ชันรับข้อผิดพลาด 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

สำหรับการอ้างอิง ในคำถามนี้ มีการใช้งานสูตรของ Leibniz สั้น ๆ หลายประการ - รวมถึงหนึ่งใน Scheme

person Óscar López    schedule 26.03.2013