import numpy as np
# 约束投影算法意思就是
# 1. 我们的问题是求最小值(可能是局部最小)
# 2. 求最值我们都会想到用梯度下降算法,但是下降的方向是否应该也有一个约束比较好?
# 3. 如果我们的约束很带劲,我们将梯度投影在约束函数的方向向量上可能能更快的收敛。
# f(x) = x ^ 2 + y ^ 2 s.t. x + y >=1
x_0 = np.array([[3, -2]])
B = np.array([[1, 1]])
I = np.eye(2)
print(I)
P = I - np.dot(np.dot(B.T, np.linalg.inv(np.dot(B, B.T))), B)
for i in range(50) :
x_g = -2 * x_0[0][0] * 0.01 # 合并了负号
y_g = -2 * x_0[0][1] * 0.01
g = np.array([[x_g], [y_g]])
d = np.dot(P, g)
x_0[0][0] = x_0[0][0] + d[0][0]
x_0[0][1] = x_0[0][1] + d[1][0]
print(x_0)