文章目录

  • 一、前言
  • 二、Goldstein准则
    • 1. 定义
    • 2. 几何含义
  • 三、代码实现
  • 四、与Armjio准则的对比
  • 五、总结

一、前言

为了克服 Armijo 准则的缺陷,我们需要引入其他准则来保证每一步的 αk\alpha^kαk 不会太小。

既然 Armijo 准则只要求点 (α,ϕ(α))(\alpha, \phi(\alpha))(α,ϕ(α)) 必须处在某直线下方,我们也可使用相同的形式使得该点必须处在另一条直线的上方。

这就是 Armijo-Goldstein 准则,简称 Goldstein 准则。


二、Goldstein准则

1. 定义

设 dkd^kdk 是点 xkx^kxk 处的下降方向,若

f(xk+αdk)≤f(xk)+cα∇f(xk)Tdk,f(xk+αdk)≥f(xk)+(1−c)α∇f(xk)Tdk\begin{aligned} &f(x^k + \alpha d^k) \le f(x^k) + c\alpha \nabla f(x^k)^Td^k,\\ &f(x^k + \alpha d^k) \ge f(x^k) + (1 - c)\alpha \nabla f(x^k)^Td^k \end{aligned} ​f(xk+αdk)≤f(xk)+cα∇f(xk)Tdk,f(xk+αdk)≥f(xk)+(1−c)α∇f(xk)Tdk​

则称步长 α\alphaα 满足 Goldstein 准则,其中 c∈(0,12)c \in (0, \dfrac{1}{2})c∈(0,21​)。

2. 几何含义

与 Armjio 准则相类似,Goldstein 准则也有非常直观的几何含义,它指的是点 (α,ϕ(α))(\alpha, \phi(\alpha))(α,ϕ(α)) 必须在两条直线

l1(α)=ϕ(0)+cα∇f(xk)Tdk,l2(α)=ϕ(0)+(1−c)α∇f(xk)Tdk\begin{aligned} &l_1(\alpha) = \phi(0) + c\alpha \nabla f(x^k)^Td^k,\\ &l_2(\alpha) = \phi(0) + (1 - c)\alpha \nabla f(x^k)^Td^k \end{aligned} ​l1​(α)=ϕ(0)+cα∇f(xk)Tdk,l2​(α)=ϕ(0)+(1−c)α∇f(xk)Tdk​

之间。如下图所示:

区间 [α1,α2][\alpha_1, \alpha_2][α1​,α2​] 中的点均满足 Goldstein 准则,同时我们也注意到 Goldstein 准则确实去掉了过小的 α\alphaα。


三、代码实现

MATLAB 代码如下:

function [alpha, xk, f, k] = Goldstein(fun, grid, x0, dk)%% Function [alpha, xk, fx, k] = Goldstein(fun, grid, x0, dk)% 求出函数fun在x0处以dk为下降方向时的步长alpha,同时返回相对应的下% 一个下降点xk以及xk处的函数值fx,k为迭代次数% -----------------------------------------------------------% 输入: %    fun     函数名称(字符变量)%  grid    梯度函数名称(字符变量)%   x0      迭代点(列向量)%   dk      函数在迭代点处的下降方向(列向量)%% 输出:%    alpha   函数在x0处以dk为下降方向时的下降步长%   xk      函数在x0处以dk为下降方向,以alpha为步长%            求得的下降点% f       函数在下降点xk处的函数值%  k       求步长算法迭代次数% -----------------------------------------------------------% by Zhi Qiangfeng %c = 0.3;     % 泰勒展开式补足系数,0 < c < 1/2alpha = 1;     % 初始步长为 1k = 0;        % 统计迭代次数a = 0; b = inf; % 二分法确定 alpha 值gk = feval(grid, x0); % x0处的梯度值fk = feval(fun, x0 + alpha * dk);    % 函数在下一个迭代点处的目标函数值l1 = feval(fun, x0) + c * alpha * gk' * dk;    % Armjio准则l2 = feval(fun, x0) + (1 - c) * alpha * gk' * dk;  % Armjio准则的补全while trueif fk > l1k = k + 1;b = alpha;alpha = (a + b) / 2;fk = feval(fun, x0 + alpha * dk);l1 = feval(fun, x0) + c * alpha * gk' * dk;l2 = feval(fun, x0) + (1 - c) * alpha * gk' * dk;continue;endif fk < l2k = k + 1;a = alpha;alpha = min([2 * alpha, (a + b) / 2]);fk = feval(fun, x0 + alpha * dk);l1 = feval(fun, x0) + c * alpha * gk' * dk;l2 = feval(fun, x0) + (1 - c) * alpha * gk' * dk;continue;endbreak;endxk = x0 + alpha * dk; % 下降点f = feval(fun, xk);       % 下降点处函数值
end

四、与Armjio准则的对比

以求解 Rosenbrock 函数为例,这是优化领域中一个著名的检验函数,函数表达式如下:

f(x)=100(x2−x12)2+(1−x1)2,g(x)=[−400x1x2+400x13+2x1−2;200x2−200x12]\begin{aligned} &f(x) = 100(x_2 - x_1^2)^2 + (1 - x_1)^2,\\ &g(x) = \left[\begin{aligned}-400x_1x_2 + 400x_1^3 + 2x_1 - 2;\\200x_2 - 200x_1^2\end{aligned}\right] \end{aligned} ​f(x)=100(x2​−x12​)2+(1−x1​)2,g(x)=[−400x1​x2​+400x13​+2x1​−2;200x2​−200x12​​]​

编写函数文件 fun.m 如下:

function f = fun(x)
f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
end

随后是梯度函数文件 grid.m 如下:

function g = grid(x)
g = [-400 * x(1) * x(2) + 400 * x(1)^3 + 2 * x(1) - 2;200 * x(2) - 200 * x(1)^2];
end

Armjio 准则代码参考此篇博客:最优化建模算法理论之Armjio准则(数学原理及MATLAB实现)

求解方法采用 BFGS 拟牛顿方法,代码参考此篇博客:最优化建模算法理论之BFGS/DFP拟牛顿方法(数学原理及MATLAB实现)

编写求解代码如下:

x0 = [-10; 10];
[f, xk, k] = BFGS(x0, 'fun', 'grid', 1e-5, 1000)

初始点选为 [-10, 10],若采用 Armjio 准则求步长,输出如下:

>> resolve
f =8.7712e-17
xk =1.00001.0000
k =70
>>

迭代了 70 次,若采用 Goldstein 准则,输出如下:

>> resolve
f =8.3501e-20
xk =1.00001.0000
k =60
>>

迭代了 60 次即达到了精度要求,并且求解的函数值 f = 8.3501e-20 还要优于 Armjio 准则。


五、总结

不喜欢写总结。

最优化建模算法理论之Goldstein准则(数学原理及MATLAB实现)相关推荐

  1. 【建模算法】基于遗传算法求解TSP问题(matlab求解)

    [建模算法]基于遗传算法求解TSP问题(matlab求解) TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增 ...

  2. 学数学建模算法对计算机的好处,数学建模中常见十种算法 (期末论文).doc

    数学建模中常见十种算法 (期末论文) 数 学 系 毕 业 论 文 论文 (设计)题目: 数学建模中常见的十种算法 姓 名 黄小芬______ 学 号 100501313 专 业 数学与应用数学 班 级 ...

  3. 数学建模算法汇总(全网最全,含matlab案例代码)

    数学建模常用的算法分类 全国大学生数学建模竞赛中,常见的算法模型有以下30种: 最小二乘法 数值分析方法 图论算法 线性规划 整数规划 动态规划 贪心算法 分支定界法 蒙特卡洛方法 随机游走算法 遗传 ...

  4. 数学建模算法与应用_《数学建模算法与应用》笔记【1】

    Chapter1.线性规划 import def Chapter2.整数规划 def Chapter3.非线性规划 def def def Chapter4.图与网络模型及方法 老本行了,先放一放 C ...

  5. 使用(VAE)生成建模,理解可变自动编码器背后的数学原理

    理解可变自动编码器背后的原理 ​ 生成模型是机器学习中一个有趣的领域,在这个领域中,网络学习数据分布,然后生成新的内容,而不是对数据进行分类.生成建模最常用的两种方法是生成对抗网络(GAN)和可变自编 ...

  6. RD算法及其距离徙动校正(原理及matlab仿真)

    RD算法流程图: 图1 RD算法流程图 因为是在word里写的,这里直接上截图了,不然mathtype公式显示不出来. 对于RD算法的原理这里就不展开讨论了,重点分析距离徙动校正的原理. 仿真程序,F ...

  7. Matlab彩色图像卷积的数学原理及纯手工实现

    一.引言 在图像处理中,不论是提取图像边缘特征,还是尺度空间变换,亦或者目前大火的深度学习,图像卷积都是非常重要的基础工作.卷积从整体上说是卷积,从局部上说其实就是内积.卷积不论在数学上还是信号处理中 ...

  8. Matlab图像水平方向错切变换的数学原理及实现

    一.引言 图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换.图像错切错切变换包括水平方向错切变换和竖直方向错切变换,本文给出了灰度图像和彩色图像的水平方向错切变换的数学原理及m ...

  9. matlab中yita怎么打,数学建模算法之模拟退火

    数学建模算法之模拟退火 模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都 ...

最新文章

  1. webpack 项目使用--转换为React项目(4)
  2. python time智能等待_python中等待怎么表示
  3. 【转】解决keepalived正常启动但是虚IP(VIP)没有生成的问题
  4. how is sap-ui-core.js initialize the reqeust of sap-ui-core-dbg.js
  5. mysql dateformat 索引_DATE_FORMAT索引问题
  6. day05 数据类型
  7. 【GRE协议】CentOS配置GRE隧道
  8. PHP连接mysql数据库使用方法,PHP连接MySQL数据库的操作方法
  9. PowerShell中远程管理简单配置
  10. SRS之SrsRtmpConn::publishing详解
  11. Windows下QQ聊天记录中图片的默认存放位置
  12. php后台发送qq消息,WebQQ消息发送功能
  13. 改进YOLOv5!GSConv+Slim Neck进一步提升YOLOv5性能!
  14. Linux常用命令-时刻更新
  15. haproxy配置sni实现https多域名代理
  16. 微信小程序跳转公众号文章非web-view
  17. 动态规划——斐波那契数列(70. 爬楼梯、198. 打家劫舍、213. 打家劫舍II、信件错排、母牛生产)
  18. cad调了比例因子没反应_CAD入门学习之如何修改比例因子
  19. 王爽汇编语言 实验7
  20. 犀牛书第七版学习笔记:数据类型与结构-数字

热门文章

  1. r语言中残差与回归值的残差图_R语言逻辑回归、方差分析、伪R平方分析
  2. GSM MODEM的基本用法-收发短信篇
  3. Java多线程Zip压缩
  4. 记一次3dmax入门
  5. 安全狗防护引擎安装失败
  6. linux 游戏 复刻,魔法门复刻手游官网版-魔法门复刻下载v4.00.9-Linux公社
  7. 新海诚画集[秒速5センチメートル:樱花抄·春]
  8. 如何用python计算函数的值域_(完整版)求函数定义域及值域方法及典型题归纳
  9. iPad/Iphone抓包
  10. QQ音乐评论分布可视化