# 파이썬에서 미분 (Differentiation in Python)

#### 개요

파이썬(Python)은 다양한 수치 계산 라이브러리와 함께 미분을 수행할 수 있는 도구들을 제공한다. 파이썬에서 미분을 구현하기 위해서는 기본적으로 수치 미분(numerical differentiation)과 상징적 미분(symbolic differentiation) 방법을 사용할 수 있으며, 이들 각각은 특정 라이브러리나 패키지를 활용하여 구현할 수 있다.

#### 수치 미분 (Numerical Differentiation)

수치 미분은 함수의 도함수를 근사적으로 계산하는 방법이다. 파이썬에서 수치 미분을 수행하기 위해서는 주로 `NumPy` 라이브러리를 활용한다. 수치 미분은 함수 $ f(x) $의 근사 도함수를 구하기 위해 다음과 같은 중심 차분(central difference) 방법을 사용할 수 있다:

$$
f'(x) \approx \frac{f(x + h) - f(x - h)}{2h}
$$

이때 $ h $는 매우 작은 값으로 설정한다. `NumPy`를 이용한 수치 미분의 예는 다음과 같다:

```python
import numpy as np

def f(x):
    return x**2 + 3*x + 2

def numerical_derivative(f, x, h=1e-5):
    return (f(x + h) - f(x - h)) / (2 * h)

x = 2.0
derivative = numerical_derivative(f, x)
print(derivative)
```

위 코드에서 `numerical_derivative` 함수는 중심 차분을 사용하여 함수 $ f(x) $의 도함수를 근사적으로 계산한다.

#### 상징적 미분 (Symbolic Differentiation)

상징적 미분은 함수의 도함수를 정확하게 구하는 방법으로, 파이썬에서는 `SymPy` 라이브러리를 사용하여 이를 수행할 수 있다. `SymPy`는 기호 계산(computer algebra) 시스템으로, 수학적 표현식을 상징적으로 다루고 조작할 수 있다.

다음은 `SymPy`를 사용한 미분의 예이다:

```python
import sympy as sp

x = sp.symbols('x')
f = x**2 + 3*x + 2
f_prime = sp.diff(f, x)
print(f_prime)
```

이 코드에서 `sp.diff` 함수는 주어진 함수 $ f(x) $의 도함수를 상징적으로 계산하여 출력한다. 결과는 수학적 표현식으로 출력되며, `SymPy`는 이를 더욱 복잡한 계산에 활용할 수 있는 기능을 제공한다.

#### 자동 미분 (Automatic Differentiation)

자동 미분(Automatic Differentiation, Autodiff)은 컴퓨터 프로그램에서 미분을 계산하는 기술로, 특히 역전파 알고리즘(backpropagation)과 같이 수치적 안정성과 정확성이 중요한 문제에서 활용된다. 파이썬에서는 주로 `TensorFlow`나 `PyTorch` 같은 딥러닝 프레임워크에서 자동 미분 기능을 제공한다.

예를 들어, `PyTorch`에서 자동 미분을 사용하는 방법은 다음과 같다:

```python
import torch

x = torch.tensor(2.0, requires_grad=True)
f = x**2 + 3*x + 2
f.backward()
print(x.grad)
```

이 코드에서 `requires_grad=True`로 설정된 텐서는 미분 가능하게 되며, `f.backward()` 함수는 $ f(x) $에 대한 도함수를 자동으로 계산하여 `x.grad`에 저장한다.

#### 수치 미분의 오차와 안정성

수치 미분은 근사 계산 방법이기 때문에, 오차가 발생할 수 있다. 이러한 오차는 주로 선택한 $ h $ 값과 함수의 성질에 따라 달라지며, 너무 작은 $ h $를 선택하면 소수점 반올림 오차(round-off error)가, 너무 큰 $ h $를 선택하면 근사 오차(truncation error)가 발생할 수 있다. 따라서 $ h $ 값을 적절히 선택하는 것이 중요하다.

#### 상징적 미분의 복잡도

상징적 미분은 수학적으로 정확한 도함수를 제공하지만, 복잡한 함수의 경우 계산 시간이 크게 증가할 수 있다. 또한, 상징적 미분은 수치적 방법과 달리 미분 가능한 함수의 형태에 제한을 받을 수 있으며, 상징적 표현이 매우 복잡해질 수 있다.

#### 자동 미분의 장점과 한계

자동 미분은 수치 미분과 상징적 미분의 장점을 결합하여, 수치적 정확성을 유지하면서도 복잡한 함수의 미분을 자동으로 계산할 수 있다. 이는 딥러닝과 같은 분야에서 매우 유용하다. 그러나 자동 미분은 메모리 사용량이 증가할 수 있으며, 계산 그래프의 복잡성에 따라 성능 저하가 발생할 수 있다.
