首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >优化算法——拟牛顿法之DFP算法

优化算法——拟牛顿法之DFP算法

作者头像
felixzhao
发布2018-03-19 16:57:00
2.3K0
发布2018-03-19 16:57:00
举报
文章被收录于专栏:null的专栏null的专栏null的专栏

一、牛顿法   

二、DFP拟牛顿法

1、DFP拟牛顿法简介

        DFP拟牛顿法也称为DFP校正方法,DFP校正方法是第一个拟牛顿法,是有Davidon最早提出,后经Fletcher和Powell解释和改进,在命名时以三个人名字的首字母命名。

对于拟牛顿方程:

化简可得:

可以得到:

在DFP校正方法中,假设:

2、DFP校正方法的推导   

3、DFP拟牛顿法的算法流程   

       DFP拟牛顿法的算法流程如下:

4、求解具体的优化问题

    求解无约束优化问题

其中,

python程序实现:

  1. function.py#
#coding:UTF-8  
''''' 
Created on 2015年5月19日 
 
@author: zhaozhiyong 
'''  
  
from numpy import *  
  
#fun  
def fun(x):  
    return 100 * (x[0,0] ** 2 - x[1,0]) ** 2 + (x[0,0] - 1) ** 2  
  
#gfun  
def gfun(x):  
    result = zeros((2, 1))  
    result[0, 0] = 400 * x[0,0] * (x[0,0] ** 2 - x[1,0]) + 2 * (x[0,0] - 1)  
    result[1, 0] = -200 * (x[0,0] ** 2 - x[1,0])  
    return result 
  1. dfp.py#
#coding:UTF-8  
''''' 
Created on 2015年5月19日 
 
@author: zhaozhiyong 
'''  
  
from numpy import *  
from function import *  
  
def dfp(fun, gfun, x0):  
    result = []  
    maxk = 500  
    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  
          
        #DFP校正  
        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 
  1. testDFP.py#
#coding:UTF-8  
''''' 
Created on 2015年5月19日 
 
@author: zhaozhiyong 
'''  
  
from bfgs import *  
from dfp import dfp  
  
import matplotlib.pyplot as plt    
  
x0 = mat([[-1.2], [1]])  
result = dfp(fun, gfun, x0)  
  
n = len(result)  
ax = plt.figure().add_subplot(111)  
x = arange(0, n, 1)  
y = result  
ax.plot(x,y)  
  
plt.show() 

5、实验结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、牛顿法   
  • 二、DFP拟牛顿法
    • 1、DFP拟牛顿法简介
      • 2、DFP校正方法的推导   
        • 3、DFP拟牛顿法的算法流程   
          • 4、求解具体的优化问题
            • 5、实验结果
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档