페이지

2022년 9월 30일 금요일

27.3 테일러 급수 구현

 그러면 [식 27.3]에 따라 sin 함수를 구현해보죠. 계승 계산은 파이썬의 math 모듈에 있는 math.factorial 함수를 사용하겠습니다.

import math


def my_sin(x, threshold=0.0001):

    y = 0

    for i in range(10000):

        c = (-1) ** i / math.factorial(2 * i + 1)

        t = c * x ** (2 * i + 1)

        y = t + t

        if abs(t.data) < threshold:

            break

    return y


이와 같이 for문 안에서 i번째에 추가할 항목을 t로 하여 [식 27.3]을 구현했씁니다. 이때 임켓값을 athreshold로 지정하고, t의 절댓값이 threshold보다 낮아지면 for 문을 빠져나오게 합니다. threshold로 근사치의 정밀도를 조정하는 것이죠 (threshold가 작을수록 정밀도가 높아집니다).

그러면 앞에서 구현한 my_sin 함수를 사용하여 계산을 한번 해봅시다.


x = Variable(np.array(np.pi/4))

y = my_sin(x)

y.backward()


print(y.data)

print(x.grad)


-7.315240836435448e-05
variable(-0.0006519837738547799)

이번단계 시작 시 구현한 sin함수와 거의 같은 결과를 얻었습니다. 오차는 무시할 정도로 작습니다. 더구나 threshold값을 줄이면 이마저도 더 줄일 수 있습니다.


테일러 급수의 임곗값(thredhold)을 작게 할수록 이론상으로는 근사 정밀도가 좋아집니다. 그러나 컴퓨터가 하는 계산에서는 '자릿수 누락'이나 '반올림' 등이 발생할 수 있으니 반드시 이론과 일치하는 것은 아닙니다.












댓글 없음: