
BFGS算法:
from numpy import *
%matplotlib inline
import matplotlib.pyplot as plt
def hyj():
x0 = mat([[0],[0]])
def fun(x):
return x[0,0] ** 2 - x[1,0]**2 -3*x[0,0] - x[0,0]*x[1,0] + 3
def gfun(x):
result = zeros((2, 1))
result[0, 0] = 2*x[0,0] - 3 - x[1,0]
result[1, 0] = 2*x[1,0] - x[0,0]
return result
def bfgs(fun, gfun, x0):
result = []
maxk = 10
rho = 0.55
sigma = 0.4
m = shape(x0)[0]
Bk = eye(m)
k = 0
while (k < maxk):
gk = mat(gfun(x0))
dk = mat(-linalg.solve(Bk, gk))
m = 0
mk = 0
while (m < 20):
newf = fun(x0 + rho ** m * dk)
oldf = fun(x0)
if (newf < oldf + sigma * (rho ** m) * (gk.T * dk)[0,0]):
mk = m
break
m = m + 1
x = x0 + rho ** mk * dk
sk = x - x0
yk = gfun(x) - gk
if (yk.T * sk > 0):
Bk = Bk - (Bk * sk * sk.T * Bk) / (sk.T * Bk * sk) + (yk * yk.T) / (yk.T * sk)
k = k + 1
x0 = x
result.append(fun(x0))
return result
result = bfgs(fun, gfun, x0)
print(result)
n = len(result)
ax = plt.figure().add_subplot(111)
x = arange(0, n, 1)
y = result
ax.plot(x,y)
plt.show()
hyj()
DFP算法
from numpy import *
%matplotlib inline
import matplotlib.pyplot as plt
def DFP():
def fun(x):
return x[0,0] ** 2 - x[1,0]**2 -3*x[0,0] - x[0,0]*x[1,0] + 3
def gfun(x):
result = zeros((2, 1))
result[0, 0] = 2*x[0,0] - 3 - x[1,0]
result[1, 0] = 2*x[1,0] - x[0,0]
return result
def dfp(fun, gfun, x0):
result = []
maxk = 10
rho = 0.55
sigma = 0.4
m = shape(x0)[0]
Hk = eye(m)
k = 0
while (k < maxk):
gk = mat(gfun(x0))
dk = -mat(Hk)*gk
m = 0
mk = 0
while (m < 20):
newf = fun(x0 + rho ** m * dk)
oldf = fun(x0)
if (newf < oldf + sigma * (rho ** m) * (gk.T * dk)[0,0]):
mk = m
break
m = m + 1
x = x0 + rho ** mk * dk
sk = x - x0
yk = gfun(x) - gk
if (sk.T * yk > 0):
Hk = Hk - (Hk * yk * yk.T * Hk) / (yk.T * Hk * yk) + (sk * sk.T) / (sk.T * yk)
k = k + 1
x0 = x
result.append(fun(x0))
return result
x0 = mat([[0], [0]])
result = dfp(fun, gfun, x0)
print(result)
n = len(result)
ax = plt.figure().add_subplot(111)
x = arange(0, n, 1)
y = result
ax.plot(x,y)
plt.show()
DFP()
