# -*- coding: utf-8 -*-
# author: 'boliang'
# date: 2018/4/16 20:58
import numpy as np
class Armijo(object):
def __init__(self, fun, gfun, xk, dk):
self.reset(fun, gfun, xk, dk)
def reset(self, fun, gfun, xk, dk):
self.__fun = fun
self.__gfun = gfun
self.__xk = xk
self.__dk = dk
def run(self):
beta = 0.5
sigma = 0.2
max_step = 20
m = 0
mk = m
while m <= max_step:
tmp_a = self.__fun( self.__xk + (beta**m)*self.__dk)
tmp_b = self.__fun(self.__xk) + (sigma * (beta**m) * self.__gfun(self.__xk).T).dot(self.__dk.T)
if tmp_a <= tmp_b:
mk = m
break
m += 1
xk = self.__xk + beta**mk * self.__dk
fk = self.__fun(xk)
result = {
'最小值fk为:': fk
}
for index, x in enumerate(xk):
result['x{0}:'.format(index+1)] = x
for key, value in result.items():
print(key, value)
# 目标函数
def fun(x):
return 100*(x[0]**2 - x[1])**2 + (x[0] - 1)**2
# 梯度函数
def gfun(x):
a = 400*x[0]*(x[0]**2-x[1]) + 2*(x[0]-1)
b = -200*(x[0]**2 - x[1])
return np.array([[a], [b]])
if __name__ == '__main__':
xk = np.array([-1, 1])
dk = np.array([1, 1])
Armijo(fun, gfun, xk, dk).run()
测试求得结果如下
Comments