DFP 算法 Matlab 实现

该文介绍了DFP(Davidon-Fletcher-Powell)优化方法,一种用于寻找函数最小值的迭代技术。它基于H_k*▽f(x_k)作为下降方向,并通过迭代更新正定矩阵H_k来确保函数持续下降。在每次迭代中,使用精确的一维线搜索确定步长,当梯度的范数小于预设阈值时停止迭代。文章还提供了DFP算法的MATLAB实现,并通过一个示例函数进行测试。

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

1. 基本思想

以 H_k * ▽f(x_k) 作为下降方向,通过 DFP 方法迭代 H_k,保证 H_k * ▽f(x_k) 一直是函数下降方向。

2. DFP 函数

function [xValue, yValue, k] = DFP_method(f, yDiff, x, xStart, H, e, alpha1)
    yDk1 = subs(yDiff, x, xStart);
    d = -H * yDk1;
    k = 0;
    while true
        k = k + 1;
        
        %精确一维线搜索,此处用 fminsearch 替代
        xcell = num2cell(xStart + alpha1 * d);
        f_tmp = matlabFunction(f);
        f_alpha = f_tmp(xcell{:});
        f_alpha = matlabFunction(f_alpha);
        alphaMin = fminsearch(f_alpha, 0); 
        
        xStart = xStart + alphaMin * d; % x_k+1 = x_k + alpha * d;
        yDk = subs(yDiff, x, xStart);   % ▽f(x_k+1)
   
        if norm(yDk) < e
            xValue = xStart;
            yValue = subs(f, x, xStart);
            break;
        end
        deltaX = alphaMin * d;
        deltaY = yDk - yDk1;
        yDk1 = yDk;
        
        %DFP方法
        H = H + (deltaX * deltaX') / (deltaX' * deltaY) - (H * deltaY) * (H * deltaY)' / (deltaY' * H * deltaY);
        d = -H * yDk1;
    end
end

程序中,输入参数分别为:
f : 需要求最小值的函数,可以是 matlab 函数
yDiff : 是函数 f 的偏导数,雅可比矩阵
x : f 自变量的形式
xStart : 自变量起始迭代点
H: 起始的正定矩阵 H_0
e : 阈值,函数中止条件
alpha1 : 步长变量,每一次迭代通过精确一维线搜索计算

3. 测试函数

%定义目标函数
syms x1 x2;
x = [x1; x2];
y = x1 * x1 + x2 * x2 - 3 * x1 - x1 * x2 + 3;

%求导数
yDiff = jacobian(y, x);
yDiff = yDiff';

%初始正定阵
H = [1 0; 0 1];
xStart = [0; 0];

syms alpha1;
[xValue, yValue, k] = DFP_method(y, yDiff, x, xStart, H, 0.00001, alpha1);

4. 总结

代码相对简单,主要还是 H 矩阵的选取,H 矩阵又 DFP 公式即为 DFP 方法; 如果用 BFGS 公式就是 BFGS 方法,都是秩二方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值