# -*- 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()


测试求得结果如下

Amijo.png