import numpy as np
import math
a=np.random.randint(1,10,size=[100,1])
G=(a*a.T)+np.random.randint(1,5)*np.eye(100)
b=np.dot(G,np.ones((100,1)))
x0=np.random.random(size=[100])
def Df(x):#求出梯度函数
return (np.dot(x,G)+b.T).reshape(100)
def hessian(df,z):#求hessian矩阵并赋值
return np.array(G)
def fun(x):
return 0.5*np.dot(np.dot(x,G),x.T)+np.dot(x,b)
def consice(x,dk):#精确线搜索
x=np.array(x)
return (-np.dot(Df(x),dk)/(np.dot(np.dot(dk,G),dk)))
def stepest(x):#最速下降法
return -Df(x)
def basicnewton(x):#牛顿法
A=np.array(-np.dot(np.mat(G).I,Df(x)))
A=A.reshape(100)
return A
def Nnewton(x0,H0):#拟牛顿法
return np.array(-np.dot(H0,Df(x0)))
def SR1(H0,sk,yk):#对称秩1修正公式
return np.array(H0+((sk.T-np.dot(H0,yk.T))*(sk-np.dot(H0,yk.T).T))/np.array((np.dot(sk-np.dot(H0,yk.T).T,yk.T))).reshape(1)[0])
def DFP(H0,sk,yk):
return np.array(H0+(sk.T*sk)/(np.array(yk*sk.T).reshape(1)[0])-np.dot(np.dot(H0,yk.T)*yk,H0)/np.array(np.dot(np.dot(yk,H0),yk.T)).reshape(1)[0])
def BFGS(H0,sk,yk):
return np.array(H0+(yk.T*yk)/(np.array(sk*yk.T).reshape(1)[0])-np.dot(np.dot(H0,sk.T)*sk,H0)/np.array(np.dot(np.dot(sk,H0),sk.T)).reshape(1)[0])
def solve(x0,eps):#x0为一n维向量
k=0
H0=np.eye(100)
dk=-Df(x0)
while np.linalg.norm(Df(x0))>eps:
if 0:
dk=basicnewton(x0)#最速下降法:stepest,牛顿法:basicnewton
ak=consice(x0,dk)#精确线搜索:consice,A