중심 차분법(central difference method)

IKNOW·2024년 10월 24일
import numpy as np

def numerical_gradient(f, x):
    """
    수치적으로 함수 f의 gradient(기울기)를 계산하는 함수.
    :param f: 미분하려는 함수
    :param x: 기울기를 구하려는 점의 좌표 (numpy 배열)
    :return: 주어진 점에서의 함수 f의 기울기 (numpy 배열)
    
    각 변수에 대해 중심 차분법을 사용하여 기울기를 계산한다.
    """
    h = 1e-4  # 아주 작은 값, 수치 미분을 위한 delta 값
    grad = np.zeros_like(x)  # 입력과 동일한 shape를 가지는 gradient 배열 초기화

    for idx in range(x.size):  # 각 변수에 대해 반복
        tmp_val = x[idx]  # 변수의 원래 값 저장

        # f(x + h) 계산
        x[idx] = tmp_val + h
        fxh = f(x)  # 함수 f에서의 값 계산

        # f(x - h) 계산
        x[idx] = tmp_val - h
        fxh2 = f(x)  # 함수 f에서의 값 계산

        # 중심 차분을 사용한 기울기 계산
        grad[idx] = (fxh - fxh2) / (2 * h)

        # 원래의 변수 값 복원
        x[idx] = tmp_val

    return grad

{함수 f(x)f(x)가 주어졌을 때, 변수 xix_i에 대한 기울기 fxi\partial f\over \partial x_i 는 중심 차분법에 의해 다음과 같이 계산된다.

fxif(x1,x2,,xi+h,,xn)f(x1,x2,,xih,,xn)2h{\partial f\over \partial x_i} \approx {f(x_1, x_2, \dots,x_i+h,\dots,x_n) - f(x_1, x_2, \dots,x_i-h,\dots,x_n) \over 2h}
  • 여기서 x=(x1,x2,,xn)x = (x_1, x_2, \dots, x_n)은 함수의 입력 변수 벡터이다.
  • h는 매우 작은 값으로, 수치 미분의 정확성을 높이기 위해 설정된 값이다.

모든 변수 xix_i에 대해 반복하면, 함수 ff의 기울기 벡터인 f(x)\nabla f(x)를 구할 수 있다.

중심 차분법은 양쪽에서 기울기를 계산하여 오차가 상쇄되기 때문에, 전진 차분법(forward difference method), 후진 차분법(backward difference method)보다 더 정확하다.

두 미분법의 오차는 big O 표기법으로 나타낼 수 있으며, 중심차분법은 O(h^2), 전진/후진 차분법은 O(h)의 차수 오차를 갖고 있다.

중심 차분법의 차수 오차는 테일러 급수를 사용하여 근사치를 표현하고, 오차 항을 도출하여 구할 수 있다.

먼저 f(x)f(x)xi+hx_i + h에 대해 근사하여 테일러 급수로 나타내면

f(xi+h)=f(xi)+hf(xi)+h22f(xi)+h36f(3)(xi)+O(h4)f(x_i+h) = f(x_i) + hf'(x_i)+{h^2\over 2}f''(x_i)+{h^3\over 6}f^{(3)}(x_i)+O(h^4)

로 나타낼 수 있으며,
반대로 xihx_i-h에 대해서는
f(xi+h)=f(xi)hf(xi)h22f(xi)h36f(3)(xi)+O(h4)f(x_i+h) = f(x_i) - hf'(x_i)-{h^2\over 2}f''(x_i)-{h^3\over 6}f^{(3)}(x_i)+O(h^4)

로 나타낼 수 있다.

중심 차분법에서는 f(xi+h)f(xih)2h{f(x_i+h)-f(x_i-h)\over 2h}를 사용하여 기울기를 계산하는데,
위의 테일러 급수를 대입하면
2hf(xi)+O(h3)2h=f(xi)+O(h2){2hf'(x_i)+O(h^3)\over 2h} = f'(x_i) +O(h^2)
위의 식을 구하여 차수 오차가 O(h2)O(h^2)인 것을 확인 할 수 있다.

profile
조금씩,하지만,자주

0개의 댓글