In [38]:
import numpy as np

def rv(value_list):
    return np.array([value_list])
def cv(value_list):
    return np.transpose(rv(value_list))
def f(x):
    return(x - 2.) * (x - 3.) * (x + 3.) * (x + 1.)
def fdf1(x):
    return float((2 * x + 3)**2), 2 * 2 * (2 * x + 3)
def fdf2(v):
    x = float(v[0]); y = float(v[1])
    return f(x) + (x + y -1)**2,\
           cv([(-3. + x) * (-2. + x) * (1. + x) + \
               (-3. + x) * (-2. + x) * (3. + x) + \
               (-3. + x) * (1. + x) * (3. + x) + \
               (-2. + x) * (1. + x) * (3. + x) + \
               2 * (-1. + x + y), 
               2 * (-1. + x + y)])

def one_hot(v, entries):
    vec = len(entries)*[0]
    vec[entries.index(v)] = 1
    return vec

def num_grad(f, delta=0.001):
    def new_func(x):
        fu=np.zeros((len(x),len(x)))
        for i in range(len(x)):
            fu[i][i]=1
      
        print(x+delta*np.reshape(fu[:,0],(-1,1)))
        result=[(f(x+delta*np.reshape(fu[:,0],(-1,1)))-f(x-delta*np.reshape(fu[:,0],(-1,1))))/(2*delta) for i in range(len(x))]
        return np.array([result])
    return new_func

x=cv([0.1, -0.1])

ans=(num_grad(lambda xa: fdf2(xa)[0])(x).tolist(), x.tolist())

print(ans)


[[ 0.101]
 [-0.1  ]]
([[4.7739994000011166, 4.7739994000011166]], [[0.1], [-0.1]])

In [39]:
def minimize(f, x0, step_size_fn, max_iter):
   
    fdf=lambda x: (f(x),num_grad(f)(x))
    print(fdf(x0))
    

    xn=gd(fdf, x0, step_size_fn, max_iter)
    return xn
    pass

In [40]:
ans=package_ans(minimize(f1, cv([0.]), lambda i: 0.1, 1000))


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-40-15c15ec4de17> in <module>()
----> 1 ans=package_ans(minimize(f1, cv([0.]), lambda i: 0.1, 1000))

NameError: name 'package_ans' is not defined

In [ ]: