BFGS和DFP

本文对比了Broyden-Fletcher-Goldfarb-Shanno (BFGS)和Davidon-Fletcher-Powell (DFP)两种常用的优化算法在解决二次函数问题上的应用,通过实例展示了它们的迭代过程和优化效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alexander plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值