몬테카를로 방법을 통한 원주율 구하기 시각화
파이썬을 통한 원주율 구하기 시각화 하기
원주율과 원의 넓이
원주율, 즉 π는 원의 지름에 대한 원주의 비율을 뜻한다. 약 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는 깃허브에서 확인하실 수 있습니다.
- 해당 글은 학교 수학 교과 세부능력 및 특기사항 기재를 위해 제작한 발표 자료를 바탕으로 작성하였습니다.