---
# System prepended metadata

title: Finite Differencing

---

# Finite Differencing
수치적으로 미분값 구하는 방법은 4가지가 있는데 1) symbolic derivative 2) finite differencing 3)complex step method 4) automatic differenciation 이다. 그 중에서 가장 간단하게 자주 쓰이는 방법이 finite differencing 이다. 
먼저 symbolic derivative는 함수의 analytic한 derivative를 찾는 방법이다. 예를 들어서 $f=\sin(x)$의 경우에 symbolic derivative는 $f=\cos(x)$이다. 그런데 이 방법은 implicit equation의 경우에 매우 비효율적인 연산이 되거나 계산 자체가 어렵다. 따라서 모든 함수에 symbolic derivative를 적용할 수가 없다. 

여기서 잠깐 implicit equation에 대해서 좀 더 자세히 알아보자. implicit equation이란 $f(x, y) = y$ 처럼 equation 내부에도 y가 있는 equation을 말한다. 내가 다루는 대부분의 equation이 이렇게 coupled relationship의 implicit equation 이다. implicit equation을 계산하는 방법은 예를 들어, $f=\sin(x+f)$ 의 경우에 모든 x에서 이 관계가 성립해야 하므로 $f$ 를 guess 하고 새로운 $f$를 얻는 연산을 f가 수렴할 때까지 반복한다. 


finite differencing은 symbolic derivative와는 다르게 function이 어떤 형태이건 상관없다. black box여도 된다. finite differencing은 Taylor expansion에서 아래와 같이 유도된다. 
\begin{equation}
f(x+h) = f(x)+hf'(x) + \frac{h^2}{2}f''(x) + \cdots 
\end{equation}
2nd order term을 포함해서 이후의 모든 terms를 무시하고 $f'(x)$에 대해서 정리하면 아래와 같다.
\begin{equation}
f'(x) \approx \frac{f(x+h)-f(x)}{h} + O(h)
\end{equation}
여기 high order terms O(h)만큼의 error가 생기는데 central differencing이라고 이를 개선한 방법도 있다.
\begin{aligned}
f(x+h) &= f(x) + h \frac{\partial f}{\partial x} + \frac{h^2}{2}\frac{\partial ^2 f}{\partial x^2} + \cdots\\
f(x-h) &= f(x) - h\frac{\partial f}{\partial x} + \frac{h^2}{2}\frac{\partial ^2 f}{\partial x^2} - \cdots
\end{aligned}
위의 두 식을 빼면 2nd order term은 없어지지만 accuracy는 앞에서 언급한 forward finite differencing에 비해서 개선된다. 따라서 정리하면 아래와 같다.
\begin{equation}
\frac{\partial f}{\partial x} = \frac{f(x+h)-f(x-h)}{2h} + O(h^2)
\end{equation}
근데 the number of design variables 변수의 수가 너무 많아지면 연산의 수도 늘어나서 이게 finite differncing의 단점이다. 그리고 또 하나의 단점이 step size h에 의해서 order of accuracy가 결정된다는 점이다. step size가 작아진다고 에러가 줄어드는 것이 아니라 에러가 줄어들다가 어떤 값 이하에서는 수치적으로 어떤 digit을 잃어버리기 때문에 에러가 커지는 경우가 생긴다. 그래서 accuracy를 향상시키는데 한계가 있다.  

