함수 f를 받아서 중앙 차분을 이용하여 수치 미분하는 코드
정확한 미분 값을 구하지는 못하므로 수치 미분이라고 함
아무튼 해당 함수와 특정 좌표를 받아서 h라는 미세한 값을 더하고(A), 뺀 뒤(B), A와 B의 차이를 계산하여 기울기를 구하는 방식
좌표가 n개가 되면 각각의 n의 f 위에서의 기울기를 구한 뒤 반환함
만약 좌표가 2차원이라면 1개의 차원씩 잘라서 계산 후, 반환함
즉, f 함수에서 각각의 좌표에 해당하는 지점에서의 기울기를 구한다.
import numpy as np
def numerical_gradient(f, x):
# 함수 f를 x 좌표에서의 편미분 값을 반환하는 함수
h = 1e-4
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
x[idx] = tmp_val + h
fxh1 = f(x)
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val
return grad
def numerical_gradient_2d(f, x):
if x.ndim == 1:
return numerical_gradient(f, x)
else:
grad = np.zeros_like(x)
for idx, x in enumerate(x):
grad[idx] = numerical_gradient(f, x)
return grad
if __name__ == "__main__":
from numerical_diff import function_2
value = numerical_gradient(function_2, np.array([3.0, 4.0]))
print(value)