import numpy as np
import matplotlib.pyplot as plt
# initial point x0
x0 = np.zeros((4,1))
# positive symmetric matrix H
H = np.array([[150, 20, 90, 101],
[20, 36, 46, 61],
[90, 46, 306, 156],
[101, 61, 156, 245]])
# vector g
g = np.array([8, -5, 1, 6]).reshape(-1, 1)
def f(x):
return 1/2*np.dot(np.dot(x.T,H),x)
y_data=np.zeros((7,1))
# x←x0
x = x0
# compute the gradient eta
eta = np.dot(H, x)-g
d = -eta
i = 0
epsilon = 1e-4
while not np.linalg.norm(eta, ord=2) <= epsilon:
i = i+1
print("iter=", i)
# compute alpha
alpha = -(np.dot(eta.T, d)/np.dot(np.dot(d.T, H), d))
print("alpha:", alpha)
x = x+alpha*d
print("x=", x)
# renew the gradient-更新梯度
eta = np.dot(H, x)-g
print("eta=", eta)
# renew the descent direction-更新下降方向
d = -eta+(np.dot(np.dot(eta.T, H), d)/np.dot(np.dot(d.T, H), d))*d
print("d=", d)
print("x=", x)