본문 바로가기
파이썬 수학

[수학 코딩] 파이썬으로 원주율(π) 구하기

by 데이터 큐레이터 2019. 8. 5.

아르키메데스는 96 각형을 직접 손으로 그려서 다각형의 둘레의 길이를 측정하였고, 원주율(π)이 3.14163이라고 계산하였다. 실제 값과 거의 차이가 나지 않았다.

아르키메데스가 96각형을 정확하게 작도하는데 들인 공과 시간을 생각해 보자. 컴퓨터의 힘을 빌린다면 96각형이 아니라 960 각형, 9600 각형도쉽게 계산할 수 있다.  

이제 파이썬 코딩을 통해서 아르키메데스의 발자취를 따라가 보자. 

 

 

1)  파이썬 내장 함수 이용

 

math 모듈을 import하면 원주율 내장함수 파이(pi)를 사용한다. math.pi로 불러서 계산식에 넣거나 출력 가능하다. 

 

import math

print(math.pi)
3.141592653589793

 

2)  아르키메데스의 수 

 

삼각함수 식을 이용하여 반지름이 1인 원에 내접하는 변과 외접하는 변의 길이를 구한다. 두 변의 길이 차이가 일정 오차범위 이하로 작아질 때까지 n각형을 반복문으로 구현한다. n이 커질수록 원에 가까워지는 성질을 이용한다. 

 

""" 원주율(파이) 계산하기 * 아르키메데스의 수 """
import math           # math 모듈 불러 오기

old_pi = 3.14163      # 아르키메데스가 96각형을 사용(n = 96)하여 계산한 원주율값
n = 5                 # 5각형부터 시작
err = 0.000000001          # 허용오차 십억분의 일

while True:
    degree = 360 / n      # n각형의 내각
    theta = degree / 2    # 내각의 절반이 삼각함수의 기준 각도(A)
    inner_length = math.sin(math.radians(theta)) * 2      # 내접하는 변의 길이 sin A * 2
    outer_length = math.tan(math.radians(theta)) * 2      # 외접하는 변의 길이 tan A * 2
    difference = outer_length - inner_length              # 내접하는 변과 외접하는 변의 길이 차이
    new_pi = n * ((outer_length + inner_length) / 2) /2   # 중간값으로 원주율 계산

    # n값 증가에 따른 원주율 값, 오차 변화
    print("n: ", n, "new_pi: ", new_pi)
    if (difference < err): 
        break                # 반복문 탈출
    else:
        n = n + 1            # 다각형의 변의 개수를 늘리기
        
# 아르키메데스의 원주율과 계산값 차이 비교
print("old_pi: ", old_pi, "new_pi: ", new_pi, "error: ", new_pi - old_pi)

# 파이썬 내장 원주율값(math.pi)와 비교
print("내장 원주율: ", math.pi, "차이: ", math.pi - new_pi)

허용오차 10억분의 1에서는 3142 각형을 만들었을 때, 반복문의 연산을 마치게 된다. 허용오차를 다른 값으로 주면서 n값과 원주율의 변화를 살펴본다. 

n:  3139 new_pi:  3.141592915822049
n:  3140 new_pi:  3.1415929156550484
n:  3141 new_pi:  3.141592915488207
n:  3142 new_pi:  3.1415929153215263
old_pi:  3.14163 new_pi:  3.1415929153215263 error:  -3.7084678473853216e-05
내장 원주율:  3.141592653589793 차이:  -2.6173173317545206e-07

 

댓글