DFP算法是本科数学系中最优化方法的知识,也是无约束最优化方法中非常重要的两个拟Newton算法之一,上一周写了一周的数学软件课程论文,姑且将DFP算法的实现细节贴出来分享给学弟学妹参考吧,由于博客不支持数学公式,所以就不累述算法原理及推导公式了。


DFP算法流程图

先给出DFP算法迭代流程图,总体上是拟Newton方法的通用迭代步骤,唯独在校正公式的地方有所区别。

MATLAB实现DFP

  基于此图便可以设计DFP算法的MATLAB程序:

  对分法及加步探索法的实现

  首先由于DFP算法中需要利用一维搜索得到最优步长,因此需要先设计一个一维搜索函数,博主选用的是简单的对分法(二分法):

  

  1. %本函数利用二分法求解X = ls(Xk,Pk)问题
  2. %目标函数:f
  3. %符号参数:var
  4. %终止限:eps
  5. function x = dichotomy(f,var,eps)
  6. g = diff(f,var);
  7. [a, b] = search(f,var);
  8. x = (a + b)/2; %防止eps过大导致x无值
  9. while b - a > eps
  10. x = (a+b)/2;
  11. gx = subs(g, var, x);
  12. if gx > 0
  13. b = x;
  14. elseif gx < 0
  15. a = x;
  16. else break;
  17. end
  18. end
  19. %加步搜索法-确定搜索区间
  20. function [a, b] = search(g,var)
  21. gt = matlabFunction(g);
  22. X = 0; tmp = X;
  23. h = 1; k = 0;
  24. while 1
  25. Xk = X + h; k = k+1;
  26. Y = subs(gt,var,X);
  27. Yk = subs(gt,var,Xk);
  28. if Y > Yk %加大步长搜索
  29. h = 2 * h;
  30. tmp = X;
  31. X = Xk;
  32. elseif Y == Yk %缩小步长搜索
  33. h = h/2;
  34. elseif k == 1
  35. h = -h; %反向搜索
  36. else break;
  37. end
  38. end
  39. a = min(tmp, Xk);
  40. b = max(tmp, Xk);
  41. end
  42. end

  DFP算法的实现

  有了一维搜索函数,那么实现DFP算法也就能依照算法流程图来设计了:

  

  1. %DFP算法主程序
  2. %目标函数:f
  3. %初始点:X0
  4. %参数:var
  5. %终止限:eps
  6. function DFP(f, X0, var, eps)
  7. %初始化符号函数,梯度,维数等
  8. syms var t;
  9. g = jacobian(f)'; %Jacobian转置->Grad
  10. fx = matlabFunction(f); %符号函数->函数句柄(R2009以上支持)
  11. gx = matlabFunction(g);
  12. n = length(var); %维数
  13. X = X0; Xk = X0;
  14. while 1
  15. fx0 = fx(X(1),X(2)); gx0 = gx(X(1),X(2));
  16. Hk = eye(2); Pk = -gx0; %初始方向
  17. k = 0; %迭代次数
  18. while 1
  19. Y = Xk + t*Pk;
  20. y = fx(Y(1),Y(2));
  21. tk = dichotomy(y, t, eps); %一维搜索
  22. Xk = Xk + tk*Pk;
  23. fx1 = fx(Xk(1),Xk(2));
  24. gx1 = gx(Xk(1),Xk(2));
  25. if norm(gx1) < eps || k == n
  26. X = Xk; fx0 = fx1;
  27. break;
  28. end
  29. Sk = Xk - X; Yk = gx1 - gx0;
  30. Hk = Hk + Sk*Sk'/(Sk'*Yk) - Hk*(Yk)*Yk'*Hk/(Yk'*Hk*Yk);
  31. Pk = -Hk*gx1; %校正方向
  32. k = k+1;
  33. end
  34. if norm(gx1) < eps
  35. disp('X(k+1) = '); disp(Xk);
  36. disp('F(K+1) = '); disp(fx0);
  37. break;
  38. end
  39. end

实例验证

  有了DFP算法的实现函数,那么应用于实例也就不难了。

  可以在命令文件下输入如下代码就能得到目标函数极值点及极值

  1. clear; clc; format long;
  2. syms x1 x2;
  3. f = 4*(x1-5)^2 + (x2-6)^2;
  4. tic; %初始时间
  5. DFP(f, [8;9], [x1, x2], 0.00000001);
  6. toc; %结束时间

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}

输出结果如下:

X(k+1) =

4.999995811278565

5.999767686222325

F(K+1) =

5.403987284687523e-08

Elapsed time is 8.229108 seconds.

  算法时间度分析:

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}

由此可知,函数 在[8,9]附近的点[5.00,6.00]处取得局部最小值,其中局部极值点约为5.40e-8.

此算法运行时间约为8.23s,并且我们在降低终止限eps后,针对本题,算法运行时间增长较快,例如若eps = 1e-3,耗时11.6s,若eps = 1e-5,耗时22.94s,而eps = 1e-7,耗时甚至超过15分钟.这说明DFP算法在求解高精度运算时的运行效率表现得并不是那么好,甚至有可能无法得出最优解.

  

  实例搜索图

  基于该实例,对算法的迭代过程进行绘图,得到如下搜索图

  

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}

可以由以上两个搜索图像得出一个结论:DFP算法的实质是在每一次迭代过程中调整自己的搜索方向,以使得该方向能够尽可能接近极值点,这也正是几乎所有拟Newton算法中校正矩阵的作用.


Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}

数学软件 之 基于MATLAB的DFP算法的更多相关文章

  1. 基于MATLAB的滤波算法

    目前比较经典的图像去噪算法主要有以下三种: 均值滤波:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度  的平均值来代替每个像素的灰度.有效抑制加性噪声,但容易引起图像模糊,  可以对其进行改进, ...

  2. 基于Matlab的MMSE的语音增强算法的研究

    本课题隶属于学校的创新性课题研究项目.2012年就已经做完了,今天一并拿来发表.   目录: --基于谱减法的语音信号增强算法..................................... ...

  3. 杂项-数学软件:MATLAB

    ylbtech-杂项-数学软件:MATLAB MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATL ...

  4. 数学软件Matlab的使用感受

    在我一年前的暑假,我们的小学期学习了MATLAB软件.MATLAB是一款数学软件,可以用于算法计算.数据可视化.数据分析以及数据计算. 我们主要学习了MATLAB关于数学上的经常用的一些用法和算法,M ...

  5. Mathematica 和 MATLAB、Maple 并称为三大数学软件

    Mathematica是一款科学计算软件,很好地结合了数值和符号计算引擎.图形系统.编程语言.文本系统.和与其他应用程序的高级连接.很多功能在相应领域内处于世界领先地位,它也是使用最广泛的数学软件之一 ...

  6. 基于暗通道优先算法的去雾应用(Matlab/C++)

    基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理:             参见论文:Single Image Haze Removal Using Dark Channel Pri ...

  7. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  8. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  9. 基于MATLAB的腐蚀膨胀算法实现

    本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作. 什么是二值图像 ...

随机推荐

  1. Ubuntu14.04 LTS更新源

    Ubuntu14.04 LTS更新源 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp ...

  2. #ifdef的用法【转】

    #ifdef的用法     #ifdef的用法灵活使用#ifdef指示符,我们可以区隔一些与特定头文件.程序库和其他文件版本有关的代码.代码举例:新建define.cpp文件 #include &qu ...

  3. 用jquery写循环播放div的相关笔记 珍贵的总结 -1

    用jquery写循环播放div line-height应用的元素的 层次? line-heig字ht, 叫行高, 仅仅是指 文/文本, 而不管图片. line-height是容器中 文本行 与 文本行 ...

  4. 一次关于使用status作为变量引发的bug及思考

    这个bug出现在一年前,当时自己大学还没毕业,刚刚进入一家公司实习.那个时候还没有用seajs或者requirejs那样的模块化管理的库,也没有用一个自执行的函数将要执行的代码包裹起来,于是bug就在 ...

  5. seo是什么职业

    SEO(Search Engine Optimization)汉译为搜索引擎优化.seo从业者首要工作就是优化网站,使其符合搜索引擎的基本规律和满足用户的需求,进而获得大量的用户访问.SEO职业属于一 ...

  6. 开始使用 Markdown

    (Xee:我最近感觉nyfedit打开有点慢,数据库有点大,试想着用一些其他的方式记录一下学习的过程,才想起了遗忘了很长时间的Markdown,将其分类在HTML下,也是我原本意愿的...) 本文面向 ...

  7. C# 添加excel批注

    public bool AddComent(object coment, int row, int column) { try { Excel.Range range = myExcel.get_Ra ...

  8. apache2 多站点虚拟主机配置

    <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /var/www/ ServerN ...

  9. 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)

    矩形面积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. PHP如何释放内存之unset销毁变量并释放内存详解

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...