算法
程序
代码如下(示例):
import numpy as np
# 函数表达式fun
fun = lambda x:100*(x[0]**2-x[1])**2 + (x[0]-1)**2
# 梯度向量 gfun
gfun = lambda x:np.array([400*x[0]*(x[0]**2-x[1])+2*(x[0]-1), -200*(x[0]**2-x[1])])
# 海森矩阵 hess
hess = lambda x:np.array([[1200*x[0]**2-400*x[1]+2, -400*x[0]],[-400*x[0],200]])
def steepest_descent_method(fun,gfun,x0):
maxk = 1e5
rho = 0.5 # [0,1]
sigma = 0.4 # [0,0.5]
k = 0
epsilon = 1e-5
while k<maxk:
gk=gfun(x0)
dk=-gk
if np.linalg.norm(dk)<epsilon:
break
m=0
mk=0
while m<20:
if fun(x0+rho**m*dk)<fun(x0)+sigma*rho**m*np.dot(gk,dk):
mk=k
break
m += 1
x0=x0+rho**m*dk
k += 1
return x0,fun(x0),k
x0,fun0,k=steepest_descent_method(fun,gfun,np.array([0,0])) # 此处x0是行向量,计算时要转成列向量
print(x0,fun0,k)
总结
[0.99998922 0.99997841] 1.1629800417640636e-10 1159