#수치미분 1차버전 - 입력변수가 1개인 함수
#수치미분 1차버전(1)
import numpy as np
def numerical_derivative(f, x):
delta_x = 1e-4
return (f(x+delta_x) - f(x-delta_x))/(2*delta_x)
def my_func1(x):
return x**2
#my_func1함수의 x좌표 3에서의 기울기
result = numerical_derivative(my_func1, 3)
print("result == ", result)
------------------------------------------------------
#수치미분 1차버전(2)
import numpy as np
def numerical_derivative(f, x):
delta_x = 1e-4
return (f(x+delta_x) - f(x-delta_x))/(2*delta_x)
def my_func2(x):
return 3*x*(np.exp(x))
#my_func1함수의 x좌표 3에서의 기울기
result = numerical_derivative(my_func2, 2)
print("result == ", result)
print("3*exp(2) + 3 * 2 * exp(2) = ", 3 * np.exp(2) + 3 * 2 * np.exp(2))
------------------------------------------------------
#수치미분 2차버전 - 입력변수가 여러개인 함수(다변수 함수)
import numpy as np
#f : 다변수 함수
#x : 모든 변수를 포함하고 있는 numpy 객체(배열, 행렬...)
def numerical_derivative(f, x):
delta_x = 1e-4
#grad : 계산된 수치미분 값 저장 변수
grad = np.zeros_like(x)
print("debug 1. initial input variable =", x)
print("debug 2. initial grad =", grad)
#모든 입력 변수에 대해 편미분하기 위해 iterator 획득
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
#변수의 개수만큼 반복
while not it.finished:
idx = it.multi_index
print("debug 3. idx = ", idx, ", x[idx] = ", x[idx])
#tmp_val : numpy 타입은 mutable이므로 원래값 보관
tmp_val = x[idx]
x[idx] = float(tmp_val) + delta_x
fx1 = f(x) #f(x + delta_x)
x[idx] = float(tmp_val) - delta_x
fx2 = f(x) #f(x - delta_x)
grad[idx] = (fx1 - fx2) / (2 * delta_x)
print("debug 4. grad[idx] = ", grad[idx])
print("debug 5. grad = ", grad)
print("==============================")
x[idx] = tmp_val
it.iternext()
return grad
#f(x) = x**2
def func1(input_obj):
x = input_obj[0]
return x**2
numerical_derivative(func1, np.array([3.0]))
#f(x, y) = 2x + 3xy + y^3
def func2(input_obj):
x = input_obj[0]
y = input_obj[1]
return (2*x + 3*x*y + np.power(y,3))
#(x,y) = (1.0,2.0)에서의 편미분 값
numerical_derivative(func2, np.array([1.0, 2.0]))
#f(w,x,y,z) = wx + xyz + 3w + zy^2
def func3(input_obj):
w = input_obj[0,0]
x = input_obj[0,1]
y = input_obj[1,0]
z = input_obj[1,1]
return (w*x + x*y*z + 3*w + z*np.power(y,2))
input3 = np.array([[1.0, 2.0], [3.0, 4.0]])
numerical_derivative(func3, input3)
'파이썬' 카테고리의 다른 글
이미지 파일 하나씩 조회하기 (0) | 2020.06.30 |
---|---|
이미지를 흑백으로 읽어 배열로 변환 (0) | 2020.02.25 |
Matplotlib scatter/line graph (0) | 2019.09.29 |
Numpy 이것저것 (0) | 2019.09.29 |
numpy iterator (0) | 2019.09.29 |