몬테카를로 방법을 통한 원주율 구하기 시각화

원주율과 원의 넓이

원주율, 즉 π는 원의 지름에 대한 원주의 비율을 뜻한다. 약 3.14의 값을 가지며 원의 넓이는 원주율과 반지름의 제곱의 곱으로 표현할 수 있다.

몬테카를로 방법

몬테 카를로 방법은 무작위 추출된 난수를 이용하여 원하는 함수의 값을 계산하기 위한 시뮬레이션 방법이다. (Wikipedia)

즉, 확률을 이용한다.

$$P(A) = \frac{사건 \, A가 \, 일어나는 \, 경우의 \, 수}{모든 \, 경우의\, 수}$$

원주율 구하기

정사각형 하나를 그려주고 그 정사각형에 접하는 원을 그려준다.

그리고 해당 정사각형에 무작위로 점을 찍어준다.

넓이

원과 정사각형의 넓이는 다음과 같다.

$$S_{정사각형} = 2r * 2r = 4r^{2} \\
S_{원} = \pi r^{2} $$

원주율 나타내기

$$\frac{S_{원}}{S_{정사각형}} = \frac{\pi r^2}{4r^2} = \frac{\pi}{4} $$

위 식과 같이 π만 남기고 식을 정리할 수 있다.

코드

import turtle as t # 그래픽 관련 라이브러리
import random # 난수 관련 라이브러리

# 변수 c는 coordinate를 의미합니다: (x, y)

t.setup(1000, 1000) # 화면 크기 지정
r = 400 # 반지름 지정

# 두 점(c1, c2)을 지나는 직선
def line(c1, c2):
    t.penup()
    t.goto(c1[0], c1[1])
    t.pendown()
    t.goto(c2[0], c2[1])
    t.penup()

# 점 c를 찍음
def dot(c, color='red'):
	t.goto(c[0], c[1])
	t.dot(5, color)

# 점 c가 원 안에 있는지 확인
"""
x^2 + y^2 에 점 (x1, y1)을 대입했을 때 r^2보다 작다면 점이 원 안에 위치함.
"""
def in_circle(c, r):
    return (c[0] ** 2 + c[1] ** 2) <= r ** 2

# 원주율 구하기
def pi(pos, total):
    return pos/total * 4



# 좌표평면 그리기
t.speed('fastest')
line((-1000, 0), (1000, 0))
line((0, -1000), (0, 1000))

# 원 그리기
t.goto(0, -r)
t.pendown()
t.circle(r) # x^2 + y^2 = r^2 (중심이 0,0 반지름이 r인 원)
t.penup()

# 원에 외접하는 정사각형 그리기
line((r,r), (-r,r))
line((-r,r), (-r,-r))
line((-r,-r), (r,-r))
line((r,-r), (r,r))

positive = 0 # 점이 원 안에 있음
negative = 0 # 점이 원 밖에 있음

for i in range(1, 10000):
    x = random.randint(-r, r)
    y = random.randint(-r, r)
    if in_circle((x, y), r):
        res = 'pos'
        positive += 1
    else:
        res = 'neg'
        negative += 1
    print(f'#{i} ({x}, {y}) => {res} : {pi(positive, i)}')
    dot((x,y), 'green' if res == 'pos' else 'red')

print(positive, negative)

t.done()

결과는 다음과 같다

기타

  • 코드와 발표용 PPT는 깃허브에서 확인하실 수 있습니다.
  • 해당 글은 학교 수학 교과 세부능력 및 특기사항 기재를 위해 제작한 발표 자료를 바탕으로 작성하였습니다.