Implementasi Formula Viete Menggunakan Haskell Untuk Mengaproksimasi Pi

Valerian Mahdi Pratama 28 Januari 2017

Implementasi Formula Viete Menggunakan Haskell Untuk Mengaproksimasi Pi

Pengantar

Bilangan pi merupakan suatu konstanta dalam matematika dan tidak dapat dinyatakan dalam bentuk pecahan rasional. Karena digit-digitnya yang tak berujung, banyak orang yang tertarik untuk berlomba-lomba menghitung pi dengan sebanyak mungkin digit desimal. Ada beberapa metode yang dapat digunakan dan diturunkan dari berbagai macam ide dasar. Misalnya saja metode Newton, formula Ramanujan, deret Gregory-Leibniz, formula Viete, dan lain-lain. Pada tulisan kali ini, saya akan membahas tentang formula Viete. Berikut formulanya : Viete2.jpg

Mengapa Viete?

Ada beberapa alasan saya menggunakan formula Viete. Beberapa di antaranya adalah

  • Kemudahan implementasi. Bentuk nested radical pada formula ini dapat dituliskan dengan mudah menggunakan rekursi
  • Konvergensi yang cepat. Meski tak sesakti formula Ramanujan, tetapi konvergensi formula Viete jauh lebih cepat dibandung deret Gregory-Leibniz ataupun Wallis Product.

Implementasi

Formula Viete merupakan perkalian tak-hingga suku. Perlu dilakukan pemotongan pada suatu nilai agar dapat dihitung menggunakan komputer. Sebut saja, pada suku ke-n. Untuk kemudahan, formula tersebut dapat kita ubah ke bentuk viete_tr.jpg.

Dengan bentuk tersebut, bisa didefinisikan sebuah fungsi a secara rekursif, sebagai berikut :

a :: Integer -> Double
a n
  |n == 1    = sqrt 2
  |otherwise = sqrt (2 + (a (n-1)))

Setelah itu, kita bisa definisikan sebuah fungsi piApprox n yang akan mengaprokimasi nilai pi dengan formula Viete yang dipotong pada suku ke-n. Fungsi tersebut dapat didefinisikan sebagai

piApprox :: Integer -> Double
piApprox n =
2 / (product [(a x) / 2 | x <- [1..n])

Menggunakan List comprehension pada Haskell, penyebut pada formula Viete dapat dihitung dalam one line saja.

Penutup

Dalam pengujian eksekusi, untuk 100 iterasi, didapat tingkat error sekitar 4e-16, cukup untuk penggunaan praktis yang tidak memerlukan ketelitian sangat tinggi. Namun, penulis menemukan bahwa untuk iterasi yang lebih banyak, tingkat error yang lebih rendah tidak tercapai. Entah karena kekurangan di implementasi, bahasa program atau lainnya, belum penulis kaji lebih lanjut. Hal ini dapat dijadikan rujukan bagi penulis lainnya.