def Hessian(x):
return np.matrix([[1896*x[0]**2 - 632*x[1] + 4, -632*x[0]],
[-632*x[0], 316]])
def LevenbergMarkvardt(x, step = 0, m = 10000, eps = 0.01, M = 1000):
d = grad(x)
if np.linalg.norm(d) < eps or step > M:
return f(x), x, step
while True:
d = -(Hessian(x)+m*np.ones([n, n])).I * d
print(d.shape)
print(d.transpose())
new_x = x + d
print(d, x)
if f(new_x) < f(x):
return LevenbergMarkvardt(np.array(new_x)[0], step+1, m / 2.)
m *= 2