Python/고전 컴퓨터 알고리즘
파이썬을 통한 라이프니츠 공식으로 파이 계산하기
polarcompass
2021. 1. 24. 00:21
728x90
위의 식은 파이 계산을 위한 무한급수 라이프 니츠 공식(Leibniz Formula)이다. 이를 무한히 더하면 파이값을 가질 수 있게 된다.
이를 코드로 나타내면
import numpy as np
import time
def calculate_pi(n_terms:int) -> float:
upNum: float = 4.0
downNum: float = 1.0
multiNum: float = 1.0
pi: float = 0.0
start = time.time()
for _ in range(n_terms):
pi += multiNum * ( upNum / downNum )
downNum += 2.0
multiNum *= -1.0
end = time.time()
return pi, end-start
if __name__ == '__main__':
n = 10000000
print( calculate_pi( n ) )
print( 100*(calculate_pi(n)[0] / np.pi))
전체 코드 블록은 위와 같고,
중요한 함수 부분을 따로 놓고 보면
def calculate_pi(n_terms:int) -> float:
upNum: float = 4.0
downNum: float = 1.0
multiNum: float = 1.0
pi: float = 0.0
start = time.time()
for _ in range(n_terms):
pi += multiNum * ( upNum / downNum )
downNum += 2.0
multiNum *= -1.0
end = time.time()
return pi, end-start
upNum : 분자 4를 나타내고
downNum : 분모를 나타내며 특징은 2씩 커지는 것이다.
multiNum : 첫 항은 + 이지만 그 다음항은 -1이 곱해지는 것을 알 수 있다.
pi : 순차적으로 더한 값을 저장하는 변수이다.
for문을 보면.
for _ in range(n_terms):
pi += multiNum * ( upNum / downNum )
downNum += 2.0
multiNum *= -1.0
pi = multiNum* ( 분자 / 분모)을 계속해서 더하고
pi 변수에 저장하는 것을 알 수 있고,
합이 끝난 후
downNum(분모)에 2를 더한 것을 볼 수 있다.
또 그다음 단계로 -1.0을 곱한다.
이러한 과정을 n_terms 동안 for문을 계속 돌리는 식이고
start = time.time()
for _ in range(n_terms):
pi += multiNum * ( upNum / downNum )
downNum += 2.0
multiNum *= -1.0
end = time.time()
for문 위아래에 시간을 측정하여
어느 정도의 시간이 걸리는지도 알아봐서
컴퓨터 연산 능력도 알 수 있다.
return pi, end-start
if __name__ == '__main__':
n = 10000000
print( calculate_pi( n ) )
print( 100*(calculate_pi(n)[0] / np.pi))
numpy에 있는 pi 값과
for문을 돌려서 얻은 pi값을 비교하기 위해
위와 같이 썼고
return 값으로 튜플 형식을 반환하기에
첫 항인 pi 값만을 쓰기위해
[0]을 사용하였다.
728x90