Monte Carlo simülasyonu ile Pi sayısına yaklaşım ve Haskell ile uygulaması
Monte Carlo simülasyonu bir deneyin sonucunu (çıktısını) tahmin etmek için rastgele örneklemeden yararlanan bir yöntemdir.
Yarıçapı 1 birim olan bir daire ve bu daireyi kapsayan ve kenar uzunluğu 2 birim olan bir kare düşünelim.
Karenin alanı 4 birim² ve dairenin alanı ise π1²=π ’dir. Dolayısıyla dairenin alanının karenin alanına oranı ρ=π/4 olur. Peki bunu Pi sayısını hesaplamak için nasıl kullanacağız?
Karenin içerisinden n tane rastgele nokta aldığımızı, bunların da m tanesinin çemberin içinde olduğunu düşünelim. Yeterince büyük n sayıları için,
olur.
Haskell ile hesaplama
İlk olarak Haskell kodunu verelim ve adım adım açıklayalım.
- İlk olarak gerekli fonksiyon ve modülleri içeri aktarıyoruz.
- pickPointAndCheck: Bu fonksiyon -1 ile 1 arasında iki farklı rastgele nokta seçiyor ve bu noktanın birim çemberin dışında olup olmadığını hesaplıyor.
- approximate_pi: Bu fonksiyon ilk olarak pickPointAndCheck fonksiyonunu n defa çalıştırıyor (replicateM ile). Bunun sonucunda 0 ve 1 sayılarından oluşan bir liste elde ediliyor. Daha sonra bu listeyi toplayarak dairenin içerisinde kalan nokta sayısını buluyoruz. Burada kullandığımız foldl fonksiyonu, bir başlangıç değeri ile başlayarak (bizim kodumuzda 0), listedeki her bir elemanı kendisinden bir önceki elemanın işleme (bizim kodumuzda işlem toplama (+))girmesiyle elde edilen sonuçla işleme sokar. Yani, elimizdeki liste [1,0,1,1,0,1] ise, foldl (+) 0 [1,0,1,1,0,1] fonksiyonu ((((((1+0)+0)+1)+1)+0)+1) toplamını hesaplar.
- main: Burada da komut satırından n sayısını alıp approximate_pi fonksiyonunu girilen n sayısı ile çağırır ve sonucu komut satırına yazar.
GitHub hesabım: https://github.com/mrtkp9993
Blogum: https://makineogrenimi.wordpress.com
Kaynaklar
http://mathfaculty.fullerton.edu/mathews/n2003/montecarlopimod.html
https://www.geeksforgeeks.org/estimating-value-pi-using-monte-carlo/