用python写了一个求极小值的算法,但是不尽人意,我也不知道问题出在哪?
函数为=> 100(x1^2 - x2)^2 + (x1 - 1)^2
x应该的极小值=> x^* = (1,1)
函数的极小值=> f_min = 0
到那时程序算出的不一样
请大家帮我看看!
import numpy as np
import math
# min 100(x1 - x2)^2 + (x1 - 1)^2
# x^* = (1,1)
# f_min = 0
# 函数
def f(x):
return 100 * (x[0, 0] ** 2 - x[1, 0]) ** 2 + (x[0, 0] - 1) ** 2
# 梯度
def gf(x):
return np.matrix([
[400 * x[0, 0] * (x[0, 0] ** 2 - x[1, 0]) + 2 * (x[0, 0] - 1)],
[-200 * (x[0, 0] ** 2 - x[1, 0])]
], dtype="int64")
# 2范数
def g2(x):
gx = gf(x)
# print(gx[0,0],gx[1,0])
return math.sqrt(gx[0, 0] ** 2 + gx[1, 0] ** 2)
x = np.matrix([
[0],
[1]
], dtype="int64")
ro = 0.25
alpha = 1
Omeiga = 0.99
while g2(x) > 0.00005:
# 算出梯度
g = gf(x)
# 算出下降方向
d = -g
# 找出最优步长
while True:
# print("---------",x + alpha * d)
temp_x = f(x + alpha * d)
condition = f(x) + ro * alpha * np.dot(g.T,d)[0,0]
if temp_x > condition:
alpha = Omeiga * alpha
# print(alpha)
else:
x = x + alpha * d
# print("x:",x)
alpha = 1
break
print("最终x的结果:", x)
print("f(x) = ",f(x))