#수치미분 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

+ Recent posts