본문 바로가기

Library/Numerical Analysis

Numerical Differentiation 2

결과적으로, 함수값만 주어졌을 때 어떻게 미분값을 구할 수 있을까? 이 문제를 해결하기 위해서는 먼저 몇 가지 인프라가 필요한데, 다음과 같은 연산자를 정의하도록 하자. D와 d라는 연산자인데, Forward Differentiation과 Backward Differentiation을 의미한다. Forward Differentiation은 주어진 함수값의 앞의 값과 현재의 값을 뺀 것이고, Backward Differentiation은 현재 값과 이전의 값을 뺀 값이다. 즉, 다음과 같다.


D x(i) = x(i + 1) - x(i)

d x(i) = x(i) - x(i - 1)


D와 d의 관계는 어떻게 되는가? 실제 수를 대입하여 위의 식을 정리하면,

D x(0) = x(1) - x(0)

d x(1) = x(1) - x(0)

x(0) * (D + 1) = x(0) / (1 - d), (D + 1) = 1 / (1 - d)


위에서 정의한 연산자를 사용하여 좀 더 정밀한 미분값을 구할 수 있는 연산자를 정의할 수 있을까? 만약, D와 d의 평균을 구할 수 있는 새로운 연산자를 정의한다면, 이것은 좀 더 좋은 미분값을 구할 수 있는 연산자가 될 것이다. 그 연산자 g = 1 / 2 * (D + d)라고 하자.

또, g 연산자를 위의 두 식을 사용하여 D에 대해서도 정리할 수 있고, d에 대해서도 정리할 수 있다. 결과적으로 다음과 같은 두 식을 얻게 되는데,


g = D * (2 + D) / 2 * (1 + D)

g = d * (2 - d) / 2 * (1 - d)

이 식을 정리하면, D - d = D * d를 얻게 된다.


여기서, z라는 연산자를 새롭게 정의하는데, 이것은 앞의 값에서 이 연산자를 적용하여 다음 값을 얻기 위한 것이다. 이것은 사실 D와 d를 정리한 것인데,


x(i + 1) =  D x(i) + x(i)

∴ x(i + 1) = x(i) * (D + 1)


x(i) = x(i + 1) - d x(i + 1)

∴ x(i) = x(i + 1) * (1 - d)


여기서, x(i + 1) = z * x(i)라고 한다면, z 연산자를 (D + 1)이나 1 / (1 - d)라고 할 수 있다. 이제, 이 연산자를 함수값에도 적용하기 위해서, 테일러 급수(Taylor Series)로 돌아가 다시 생각해보면, 테일러 급수는 근사값으로 추정되는 x = a에 대해서 h 값을 반복적으로 구하면서 보다 좋은 근사값을 구하는 것이다. 이 식을 정리하면,


f(i + 1) = f(i) + f'(i) * h + (1 / 2! * f''(i) * h) + ....,


여기서 미분을 해주는 연산자를 D라고 한다면 f'(x)는 f(i) * (hD)^n의 형태로 표시할 수 있게 된다. 즉, 최종적으로, f(i + 1) = H * f(i)라고 할 수 있으며, H는 사실 e^x의 함수를 테일러 급수 형태로 전개한 것이다. 따라서,


f(i + 1) = e^(hD) * f(i)

∴ z = e^(hD)


이제, 각 함수값에 적용하기 위한 z 연산자를 구했다. 이제 마지막으로 필요한 미분 연산자 D는 D에 대해 정리하고, 원하는 함수값에 적용하면 해당 함수값의 미분값을 얻을 수 있다! 결과적으로 말하면 이것 또한 테일러 급수로 전개하는데, 원하는 정밀도에 해당하는 항만큼 계산하면 해당 정밀도의 미분값을 얻을 수 있다.

또, z 연산자는 D나 d를 사용하여 정리할 수 있으며, 필요에 따라 선택하면 된다. 그리고 x(i + 1) = z * x(i) 이외에도 z^(-1) 연산자를 정의하여 같은 과정을 반복할 수 있다. z^(-1) 연산자를 delayed z 연산자라 하자. 결과만 이야기하자면, z^(-1) 연산자를 사용하여 D에 대해 정리한 결과는 다음과 같다.


D = 1 / h * {(1 - z^(-1) + (1 - z^(-1))^2 / 2 + (1 - z^(-1))^3 / 3 + .... }


z 와 마찬가지로, 원하는 정밀도를 얻기 위해 필요한 항수를 선택하여 정리하고 함수값에 적용하면 된다.