Home python으로 하는 수치미분 (Numerical Differentiation)
Post
Cancel

python으로 하는 수치미분 (Numerical Differentiation)


미분 (Differentiation) 📈

“사실 미분은 크게 두 가지 종류가 있어요~”라고 말하며 해석미분은 무엇이고 수치미분은 무엇인지 장황한 설명을 시작으로 글을 쓰고 싶으나, 간단하게 수치미분이 무엇인지, 또 파이썬으로 하려면 필요한게 무엇인지만 설명한 뒤 바로 코드로 들어가자!!

수치미분은 해석 미분을 수행할 수 없을 때, 정답은 아니지만 숫자를 입력해서 근사값을 구하는 방법이다.

수치미분을 하기 위한 세 가지의 방법이 존재한다. (응 그렇고나 하고 넘어가자)

  • 전향차분: $\lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x}$
  • 후향차분: $\lim_{\Delta x \to 0} \frac{f(x) - f(x - \Delta x)}{\Delta x}$
  • 중앙차분: $\lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x - \Delta x)}{2\Delta x}$

보통 제일 많이 쓰이고, 결괏값이 가장 정확한 것은 맨 마지막에 말한 “중앙차분 (Centered Difference)“이다.

아래의 그래프에 대한 설명은 지금 당장은 따로 하지 않겠다 (추후 수정을 통해 업데이트 하겠음!). 다만 이해에 도움이 되길 바랄 뿐이다.

differentiation

바로 아래의 코드를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def numerical_differentiation(f, x, method='central'):
  """
  첫번째 인자 f는 미분하려고 하는 함수
  두번째 인자 x는 x의 값 
  세번째 인자 method = 'central'  중앙차분이 디폴트.
                     'forward' 전방차분
                     'backward' 후방차분
  """
  delta_x = 1e-4  # 극한값을 고려. 델타x는 0에 최대한 가까워야함. 여기선 1 * 10^(-4)를 사용
  
  if method == 'central':
    result = (f(x + delta_x) - f(x - delta_x)) / (2 * delta_x)
  elif method == 'forward':
    result = (f(x + delta_x) - f(x)) / delta_x
  elif method == 'backward':
    result = (f(x) - f(x - delta_x)) / delta_x
  else:
    raise ValueError("Method must be either 'central', 'forward', or 'backward'")
  return result

이렇게 수치미분에 대한 함수를 정의했다.

정의했다시피 f는 미분하려고 하는 함수이다.

파이썬은 1급 함수를 지원하기때문에, 함수를 다른 함수에 인자로 넣어줄 수가 있다.

한번 사용해보자.

1
2
3
4
5
6
7
# f(x) = x^2   함수를 정의
def squared(x):
  return x ** 2

print("중앙차분의 값은 {} 입니다.".format(numerical_differentiation(squared, 5)))
print("전향차분의 값은 {} 입니다.".format(numerical_differentiation(squared, 5, 'forward')))
print("후향차분의 값은 {} 입니다.".format(numerical_differentiation(squared, 5, 'backward')))
1
2
3
4
# 이렇게 리턴되는 것을 볼 수 있다.
중앙 차분의 값은 9.999999999976694 입니다.
전향 차분의 값은 10.000099999984968 입니다.
후향 차분의 값은 9.99989999996842 입니다.

실제 계산을 해본다면

정답은: $ f’(x) = \frac{df}{dx} = 2x $

​ $ f’(5) = 10 $

정답에 아주 가까운 근사치를 리턴받을 수 있다.

오늘은 여기까지.

끄읏트 👋

This post is licensed under CC BY 4.0 by the author.

python Pandas (12) DataFrame Duplicates 중복값 제거

python으로 하는 수치미분 (Numerical Differentiation) (2)

Comments powered by Disqus.