首页 > 编程语言 >DFP算法-MATLAB

DFP算法-MATLAB

时间:2024-09-22 22:54:19浏览次数:9  
标签:矩阵 DFP 算法 MATLAB delta new grad

背景

DFP算法是在20世纪60年代初期由Davidon、Fletcher和Powell共同开发的,是拟牛顿法(Quasi-Newton Methods)的一种重要实现。拟牛顿法的基本思想是利用目标函数在当前点附近的二次近似来构造搜索方向,并通过迭代更新这一近似来逼近真实的解。DFP算法通过不断更新Hessian矩阵的逆矩阵(或其近似)来实现这一目标,从而避免了直接计算Hessian矩阵及其逆矩阵的高昂代价。

优点

  1. 收敛速度快:DFP算法结合了梯度法和牛顿法的优点,能够在保持梯度法简单性的同时,实现更快的收敛速度。特别是在高维问题中,其收敛性能尤为突出。
  2. 计算效率高:与牛顿法相比,DFP算法无需直接计算Hessian矩阵及其逆矩阵,从而大大减少了计算量。它只需计算目标函数的一阶导数(梯度),并通过迭代更新Hessian矩阵的逆矩阵的近似值。
  3. 对初始点选择无严格要求:DFP算法对初始点的选择没有严格要求,这使得它在实际应用中更加灵活和方便。
  4. 稳定性好:通过适当的迭代更新策略和步长选择方法,DFP算法能够保持较好的稳定性,避免算法在迭代过程中发散或陷入局部最优解。

缺点

  1. 可能不收敛:对于一般问题,DFP算法所得的点列未必收敛。这主要是由于算法在迭代过程中可能受到多种因素的影响,如步长选择不当、Hessian矩阵逆矩阵的近似误差等。
  2. 计算复杂度高:虽然DFP算法避免了直接计算Hessian矩阵及其逆矩阵的高昂代价,但其迭代更新过程中仍需进行大量的矩阵运算和向量运算,这在一定程度上增加了算法的计算复杂度。特别是在高维问题中,这种计算复杂度可能会成为限制算法性能的一个重要因素。
  3. 对参数敏感:DFP算法的性能可能受到多个参数的影响,如步长选择参数、迭代终止条件等。这些参数的选取需要根据具体问题的特点进行仔细调整和优化,否则可能会导致算法性能下降或无法收敛。

 

function [Xmin] = Davidon_Fletcher_Powell(f, X, tol)
% 项目名称:DFP算法  
% 更新时间:2024/09/21  
% 背景: DFP算法是一种秩2拟牛顿法,DFP算法(Davidon-Fletcher-Powell algorithm)是由戴维登(Davidon)于1959年首先提出的一种求解非线性优化问题的算法,后经弗莱彻(Fletcher)和鲍威尔(Powell)的进一步发展和完善。
% 作者:月白风清江有声 

    %定义梯度函数
    syms x1 x2;
    grad_sym = gradient(f(x1, x2), [x1, x2]);
    grad = matlabFunction(grad_sym, 'vars', [x1, x2]);
    
    %初始化
    x = X;  
    H = eye(length(X)); 
    k = 0;

    while norm(grad(x(1), x(2))) >= tol && k < 10 % 添加迭代次数上限防止死循环

        grad_old = grad(x(1), x(2));
        d = -H * grad_old;
        
        %求解步长ak
        syms c;
        x_bar = x + c * d;   
        f_c = f(x_bar(1), x_bar(2));   
        df_dc = diff(f_c, c);
        sol = solve(df_dc == 0, c);
        ak = double(sol);      %   1.不能eval,不是字符串2.不能sol.c,这个不能引用
        
        x_new = x + ak * d;
        grad_new = grad(x_new(1), x_new(2));
        
        %防止除小数
        delta_x = x_new - x;% 2行1列
        if norm(delta_x) < 1e-10  
            warning('Delta X too small.');  
            break;  
        end  
        delta_y = grad_new - grad_old;% 2行1列
        if norm(delta_y) < 1e-10  
            warning('Delta Y too small.');  
            break;  
        end  
        
        % 确保矩阵乘法的维度匹配,一步一步来
        temp1 = delta_x * delta_x'; %  2行2列
        temp2 = H * delta_y;    %  2行1列
        hess_sim = delta_y'*H*delta_y; % 标量
        if hess_sim == 0
            error('Hess_sim too small.');
        else
            num1 = temp1 /(delta_x' *delta_y) ; %2行2列
            num2 = (temp2 * temp2') / (hess_sim); % 2行2列
            H_new = H + num1 - num2;
        end
        
        %更新迭代
        x=x_new;
        H = H_new;
        k = k + 1;
    
    end
    
    Xmin = x_new;

    fprintf('Final min result: k = %.4f, Xmin=[%.4f;%.4f]\n', k, Xmin(1), Xmin(2));
end


%f=@(x1,x2)x1*x1-2*x1*x2+2*x2*x2-2*x1+x2;X=[0;0];tol=10e-3;Davidon_Fletcher_Powell(f, X,tol);

标签:矩阵,DFP,算法,MATLAB,delta,new,grad
From: https://blog.csdn.net/ws13563798156/article/details/142413926

相关文章

  • DeepCross模型实现推荐算法
    1.项目简介A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发展,利用用户行为数据和内容特征,来生......
  • 智谱AI算法工程师带你上手实践CogVideoX 视频生成开源模型
    关注公众号:青稞AI,第一时间学习最新AI技术......
  • 408算法题leetcode--第11天
    3.无重复字符的最长子串3.无重复字符的最长子串思路:滑动窗口时间:O(n);空间:O(字符种类数)classSolution{public:intlengthOfLongestSubstring(strings){//滑动窗口:如果没有出现相同的字符,那么右指针一直向右intret=0,size=s.size();......
  • 408算法题leetcode--第九天
    344.反转字符串344.反转字符串思路:双指针时间:O(n);空间:O(1)classSolution{public:voidreverseString(vector<char>&s){intsize=s.size();for(inti=0,j=size-1;i<j;i++,j--){swap(s[i],s[j]);}......
  • 故障诊断│GWO-DBN灰狼算法优化深度置信网络故障诊断
    1.引言随着人工智能技术的快速发展,深度学习已经成为解决复杂问题的热门方法之一。深度置信网络(DBN)作为深度学习中应用比较广泛的一种算法,被广泛应用于分类和回归预测等问题中。然而,DBN的训练过程通常需要大量的时间和计算资源,因此如何提高DBN的训练效率成为一个重要的研究方向......
  • Matlab可视化│常用绘图全家桶
    Matlab拥有强大的数据可视化功能,这也是其备受科研大佬们青睐的原因之一。利用Matlab的高级绘图全家桶,你能够轻松地呈现各种复杂数据,并使其变得更加易于阅读和理解。效果图展示:colormapMatlab还提供了各种各样的颜色,线型和配色方案,让你的数据呈现出更好的效果。除此之外,Mat......
  • KMP算法的实现
             这是C++算法基础-数据结构专栏的第二十六篇文章,专栏详情请见此处。引入     KMP算法是一种可以快速查找某一字符串在一个文本中的所有出现的算法。        下面我们就来讲KMP算法的实现。定义        Knuth–Morris–Pratt算......
  • 数据结构与算法之间有何关系?
    相信很多人都应该上个《数据结构与算法》这门课吧,而这两个概念也如孪生兄弟一样经常被拿出来一起讨论。那它们究竟是一个什么样子的关系呢? 听到数据结构与算法我第一反应是想到了Pascal语言之父尼古拉斯·沃斯在他的《Algorithms+DataStructures=Programs》著作中提出了......
  • leetcode 算法题目学习笔记 - 序号2
    2.两数相加给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。可用的模板#include<iostream>#in......
  • 关于 最短路 及其 拓展算法 的粗浅总结
    关于最短路及其拓展算法的粗浅总结最短路(Dijkstra)Core_Codeinlinevoiddijkstra(){memset(vis,0,sizeofvis); memset(dis,0x3f,sizeofdis);dis[s]=0;priority_queue<pair<int,int>>q;q.push(make_pair(dis[s],s));while(!q.empty()){......