ฉันกำลังพยายามหาวิธีเขียนโปรแกรมประมาณพายด้วยสูตรไลบ์นิซ ฟังก์ชันรับข้อผิดพลาด E และให้การประมาณค่าพายด้วยวิธีใดวิธีหนึ่ง
ฉันไม่แน่ใจเลยว่าจะทำเช่นนี้ได้อย่างไร ฉันเริ่มเขียนฟังก์ชันตัวช่วยแต่ไม่รู้ว่าจะใส่อะไรลงไป ความช่วยเหลือใด ๆ ?
ขอบคุณ!
ฉันกำลังพยายามหาวิธีเขียนโปรแกรมประมาณพายด้วยสูตรไลบ์นิซ ฟังก์ชันรับข้อผิดพลาด E และให้การประมาณค่าพายด้วยวิธีใดวิธีหนึ่ง
ฉันไม่แน่ใจเลยว่าจะทำเช่นนี้ได้อย่างไร ฉันเริ่มเขียนฟังก์ชันตัวช่วยแต่ไม่รู้ว่าจะใส่อะไรลงไป ความช่วยเหลือใด ๆ ?
ขอบคุณ!
สูตรของไลบ์นิซสำหรับ 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))))))
สูตรของไลบ์นิซเป็นวิธีที่ค่อนข้างไม่มีประสิทธิภาพในการคำนวณ π เว้นแต่จะใช้เทคนิคการเร่งความเร็วแบบลู่เข้าบางประเภท ตามข้อมูลของ 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