비교
| 방법 | 장점 | 단점 | 시간복잡도 |
|---|---|---|---|
| 수치 미분 | 구현 간단, 모든 함수 가능 | 오차 발생, 계산 비용 높음 | |
| 해석적 미분 | 정확, 빠름 | 수식 필요, 복잡한 함수 어려움 | |
| 자동 미분 | 정확, 복잡한 함수 가능 | 메모리 사용량 증가 |
미분은 현대 과학과 공학의 핵심 도구이다. 특히 컴퓨터 과학에서는 다음과 같이 활용한다:
Proof of Polynomial Differentiation
함수
이 값을
정리:
증명:
정리:
증명:
이항정리를 적용하면:
여기서
전개하면:
따라서:
마지막 등식은
정리:
증명:
정리:
증명:
정리: 다항함수
증명: 위의 법칙들을 조합하면:
마지막 등식에서
머신러닝에서 손실함수
def gradient_descent(f, df, x0, learning_rate=0.01, iterations=100): """ f: 목적함수 df: f의 도함수 x0: 초기값 """ x = x0 history = [x]
for _ in range(iterations): grad = df(x) # 미분 계산 x = x - learning_rate * grad # 파라미터 업데이트 history.append(x)
return x, history
# 예시: f(x) = x^2 - 4x + 4 최소화def f(x): return x**2 - 4*x + 4def df(x): return 2*x - 4 # 도함수
minimum, path = gradient_descent(f, df, x0=0)print(f"최솟값 위치: {minimum}") # 2에 수렴function gradientDescent(f, df, x0, learningRate = 0.01, iterations = 100) { let x = x0; const history = [x];
for (let i = 0; i < iterations; i++) { const grad = df(x); // 미분 계산 x = x - learningRate * grad; // 파라미터 업데이트 history.push(x); }
return { minimum: x, history };}
// 예시: f(x) = x^2 - 4x + 4 최소화const f = x => x**2 - 4*x + 4;const df = x => 2*x - 4; // 도함수
const result = gradientDescent(f, df, 0);console.log(`최솟값 위치: ${result.minimum}`); // 2에 수렴현대 딥러닝 프레임워크는 자동으로 도함수를 계산한다:
import torch
# PyTorch의 자동 미분x = torch.tensor([2.0], requires_grad=True)y = x**3 - 2*x**2 + x - 1 # f(x) = x³ - 2x² + x - 1
y.backward() # 자동으로 dy/dx 계산print(f"x=2에서의 도함수: {x.grad}") # f'(2) = 3(2)² - 4(2) + 1 = 5비교
| 방법 | 장점 | 단점 | 시간복잡도 |
|---|---|---|---|
| 수치 미분 | 구현 간단, 모든 함수 가능 | 오차 발생, 계산 비용 높음 | |
| 해석적 미분 | 정확, 빠름 | 수식 필요, 복잡한 함수 어려움 | |
| 자동 미분 | 정확, 복잡한 함수 가능 | 메모리 사용량 증가 |
class Polynomial: """다항식과 그 도함수를 다루는 클래스"""
def __init__(self, coefficients): """ coefficients: [a0, a1, a2, ...] for a0 + a1*x + a2*x^2 + ... """ self.coeffs = coefficients
def __call__(self, x): """다항식 값 계산""" return sum(coeff * x**i for i, coeff in enumerate(self.coeffs))
def derivative(self): """도함수 반환""" if len(self.coeffs) <= 1: return Polynomial([0])
new_coeffs = [i * coeff for i, coeff in enumerate(self.coeffs)][1:] return Polynomial(new_coeffs)
def __str__(self): terms = [] for i, coeff in enumerate(self.coeffs): if coeff != 0: if i == 0: terms.append(str(coeff)) elif i == 1: terms.append(f"{coeff}x") else: terms.append(f"{coeff}x^{i}") return " + ".join(terms) if terms else "0"
# 사용 예시p = Polynomial([1, -2, 3]) # 1 - 2x + 3x^2print(f"P(x) = {p}")print(f"P'(x) = {p.derivative()}") # -2 + 6xprint(f"P(2) = {p(2)}") # 9print(f"P'(2) = {p.derivative()(2)}") # 10이 문서에서 다룬 멱의 법칙은 양의 정수
다항함수의 미분은 계수만 조정하므로
Wikipedia | “Derivative"
"The derivative … is the slope of the tangent line …"
"Derivatives can be generalized to functions …” ↩
Wikipedia | “Differential (mathematics)"
"… refer to an infinitesimal (“infinitely small”) change …” ↩