250x250
Notice
Recent Posts
«   2024/11   »
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
관리 메뉴

일상 코딩

파이썬을 통한 라이프니츠 공식으로 파이 계산하기 본문

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