Minggu, 11 September 2022

Estimasi Nilai 𝝿 Menggunakan Metode Monte Carlo

Metode Monte Carlo adalah suatu metode komputasi yang mengandalkan sampling random secara berulang untuk mendapatkan suatu hasil numerik. Pada kesempatan ini, metode Monte Carlo akan digunakan untuk mendapatkan estimasi nilai dari 𝝿. 𝝿 (pi) adalah suatu konstanta matematika yang merupakan rasio antara keliling suatu lingkaran dan diameter lingkaran tersebut.
    
Pada metode ini akan digambar sebuah persegi dengan sisi sepanjang 2r, kemudian di dalam persegi tersebut digambar sebuah lingkaran dengan jari-jari r. Pada persegi tersebut kemudian akan digambar sejumlah titik dengan posisi acak, kemudian akan dihitung rasio jumlah titik yang berada di dalam lingkaran dan total titik dalam persegi tersebut. Semakin banyak titk yang dihasilkan, maka akan semakin akurat estimasi nilai 𝝿 yang diperoleh.


Perbandingan area lingkaran dan persegi dapat dilihat dalam persamaan berikut:


Persamaan di atas dapat pula ditulis berdasarkan jumlah titik yang dihasilkan dari Metode Monte Carlo, jika titk yang dihasilkan sangat banyak


Pada kesempatan ini, penulis menggunakan bahasa pemrograman Python dan modul Pygame untuk membuat visualisasi dari metode Monte Carlo ini. Metode ini dapat pula dilakukan tanpa visualisasi, namun dengan visualisasi dapat diperoleh gambaran yang lebih jelas mengenai proses yang terjadi dalam metode ini, seperti proses penggambaran titik dan perhitungan nilai 𝝿 secara real-time.

Berikut adalah kode untuk menjalakan metode Monte Carlo ini:
    
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import pygame, random, sys

pygame.init()

#Screen
screen_width = 600
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Pi with montecarlo simulation")
screen.fill("black")
clock = pygame.time.Clock()

#Iteration and total dot
iteration = 10000
inside = 0
total = 0

#Displaying pi and dots count
def display_pi():
    if total == 0:
        pi_value = 0
    else:
        pi_value = 4 * inside / total
    pi_text_font = pygame.font.Font(None, 40)
    pi_text_surf = pi_text_font.render("Pi : " + str(pi_value), True, "white")
    pi_text_rect = pi_text_surf.get_rect(topleft = (20, 30))
    count_surf = pi_text_font.render(f"Total : {total} / {iteration}", True, "white")
    count_rect = count_surf.get_rect(topleft = (20, 60))
    screen.fill("black", (0, 0, screen_width, 100))
    screen.blit(pi_text_surf, pi_text_rect)
    screen.blit(count_surf, count_rect)

#Circle
circle_x = screen_width // 2
circle_y = screen_height // 2
circle_radius = 200

#Square
square_x = (screen_width - 2 * circle_radius) // 2
square_y = (screen_height - 2 * circle_radius) // 2
square_width = 2 * circle_radius
square_height = 2 * circle_radius

#Min and max boundary
x_min = square_x
x_max = square_x + square_width
y_min = square_y
y_max = square_y + square_height

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    #Drawing square and circle
    pygame.draw.circle(screen, "white", (circle_x, circle_y), circle_radius, 2)
    pygame.draw.rect(screen, "white", (square_x, square_y, square_width, square_height), 2)
    
    #Drawing the random dots
    while total < iteration:   
        dot_x = random.randint(x_min, x_max)
        dot_y = random.randint(y_min, y_max)
        if (dot_x - circle_x) ** 2 + (dot_y - circle_y) ** 2 <= circle_radius ** 2:
            pygame.draw.circle(screen, "red", (dot_x, dot_y), 1)
            inside += 1
            total += 1
        if (dot_x - circle_x) ** 2 + (dot_y - circle_y) ** 2 > circle_radius ** 2:
            pygame.draw.circle(screen, "blue", (dot_x, dot_y), 1)
            total += 1   
        display_pi()

        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
        clock.tick(100)
        pygame.display.flip()

Sumber bacaan dan referensi :

Tidak ada komentar:

Posting Komentar