最优化方法-Goldstein准则学习记录(matlab代码实现)

news2025/1/12 16:45:13

目录

一、前言

二、定义

三、代码实现

四、改良后

五、总结


一、前言

作为非精确线性搜索方法的一种,旨在降低计算量,提高算法效率。在迭代过程中没有必要把线性搜索搞得十分精确,因此我们可以放松对\alpha _k的精度要求,只要求每一步迭代都能够缩小区间即可。

Goldstein准则也称为Armijo-Goldstein准则,是一种用于确定步长的优化准则,旨在改进Armijo准则的不足。

由于网上实在找不到答案,本人无奈,只得看看视频讲解以及代码后做此纪录。

二、定义


要求目标函数值位于两条特定直线之间,以避免步长过小。这两条直线由当前点的函数值、梯度及步长共同决定。
设定\rho为(0, 0.5)之间的常数,若步长α满足:

f(x_k+\alpha _kd_k) \leq f(x_k)+\rho \alpha _kg_k^Td_k

f(x_k+\alpha _kd_k) \leq f(x_k)+(1-\rho) \alpha _kg_k^Td_k

则称步长α满足Goldstein准则。

其中,第一个不等式是充分下降条件,第二个保证了\alpha _k不会取的太小。

满足准则的区间为\left [ b,c \right ],成为可接受区间。
与Armijo准则相比,Goldstein准则通过设定上下界来确保步长不会过小,从而提高了优化算法的效率。

三、代码实现

MATLAB代码如下:

check_goldstein为简单判断是否符合准则条件,该代码为gpt自动生成的,后面作者改良了,该代码基于《最优化方法》第二版第三章课后题7.(1)。

function is_goldstein = check_goldstein(f, x_k, grad_f_k, d_k, alpha, c)
    % 检查给定的步长alpha是否满足Goldstein准则
    %
    % 输入:
    %   f        - 函数句柄,用于计算函数值
    %   x_k      - 当前点
    %   grad_f_k - 当前点的梯度
    %   d_k      - 搜索方向
    %   alpha    - 步长
    %   c        - Goldstein准则中的常数,通常在(0, 0.5)之间
    %
    % 输出:
    %   is_goldstein - 逻辑值,如果alpha满足Goldstein准则则为true,否则为false

    % 计算新点的函数值
    f_k_plus_alpha = f(x_k + alpha * d_k);
    
    % 计算Goldstein准则的上下界
    upper_bound = f(x_k) + c * alpha * grad_f_k' * d_k;
    lower_bound = f(x_k) + (1 - c) * alpha * grad_f_k' * d_k;
    
    % 检查步长是否满足Goldstein准则
    is_goldstein = (f_k_plus_alpha <= upper_bound) && (f_k_plus_alpha >= lower_bound);
    
end

编写主函数来计算最佳步长

% 定义函数句柄
f = @(x) -2*x^3 + 21*x^2 - 60*x + 50; % 例如,一个简单的二次函数

% 当前点
x_k = 0.5;

% 当前点的梯度(可以通过数值微分或符号微分得到)
grad_f_k = -6 * x_k^2 + 42*x_k - 60; % 对于这个简单的二次函数,梯度可以直接计算

% 搜索方向(例如,负梯度方向)
d_k = -grad_f_k;

% 初始步长和Goldstein准则中的常数
alpha = 1;
p = 0.1;

% 检查步长是否满足Goldstein准则
is_goldstein = check_goldstein(f, x_k, grad_f_k, d_k, alpha, p);

% 如果不满足,可以调整步长并重新检查(这里只是一个简单的示例,实际中可能需要更复杂的步长调整策略)
while ~is_goldstein
    alpha = alpha / 2; % 例如,将步长减半
    is_goldstein = check_goldstein(f, x_k, grad_f_k, d_k, alpha, p);
end


% 输出满足Goldstein准则的步长
fprintf('满足Goldstein准则的步长为:%f \n', alpha);

 可以得出结果为0.0625最佳步长

 思路为:

\alpha _0取1开始第一次迭代,\varphi \left ( 0 \right ){}'-f(0.5),为负梯度方向。

根据定义步骤算出第一次迭代结果,然后进行到第四步时

课本p121

将步4的赋值改为\alpha_k = \alpha _k/2,进行多次迭代即可完成该题

四、改良后

% 定义目标函数
f = @(x) -2*x^3 + 21*x^2 - 60*x + 50;

% 梯度函数(对于此简单函数,可以直接计算)
grad_f = @(x) -6 * x^2 + 42*x - 60;

% 初始点
x_k = 0.5;

% 初始步长和Goldstein准则中的常数
alpha = 1;
p = 0.1;

% 最大迭代次数
max_iter = 100;

% 函数值的变化,太小则迭代停止
tol = 1e-6;

% 记录迭代过程中的x值和函数值
x_values = x_k;
f_values = f(x_k);

for iter = 1:max_iter %增加迭代计数
    % 计算当前点的梯度
    grad_f_k = grad_f(x_k);
    
    % 搜索方向(负梯度方向)
    d_k = -grad_f_k;
    
    % 检查步长是否满足Goldstein准则
    is_goldstein = false;
    while ~is_goldstein 
        % 计算新点的函数值
        f_k_plus_alpha = f(x_k + alpha * d_k);
        
        % 计算Goldstein准则的上下界
        upper_bound = f(x_k) + p * alpha * grad_f_k' * d_k;
        lower_bound = f(x_k) + (1 - p) * alpha * grad_f_k' * d_k;
        
        % 检查步长是否满足Goldstein准则
        is_goldstein = (f_k_plus_alpha <= upper_bound) && (f_k_plus_alpha >= lower_bound);
        
        % 如果不满足,调整步长(这里使用减半策略)
        if ~is_goldstein
            alpha = alpha / 2; %没有根据教材,直接二分法计算步长
        end
        
    end
    
    % 更新x_k
    x_k = x_k + alpha * d_k;
    
    % 存储新的x值和函数值
    x_values = [x_values, x_k];
    f_values = [f_values, f(x_k)];
    
    % 检查停止条件(函数值的变化)
    if abs(f(x_k) - f_values(end-1)) < tol
        break;
    end
    
    % 可选:输出迭代信息
    fprintf('第%d次迭代: x_k = %.6f, f(x_k) = %.6f, alpha = %.6f\n', iter, x_k, f(x_k), alpha);
end

% 输出最终结果
fprintf('x: %.6f\n', x_k);
fprintf('f(x): %.6f\n', f(x_k));
fprintf('一共迭代%d次\n', iter-1);

结果为五次迭代

五、总结

作者课本中Goldstein准则提到了搜索区间\left [ a_0,b_0 \right ],但是课后题中没有区间这一条件,但是结果感觉是正确的。

本人刚开始学习最优化

如有错误还请评论区指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

葵花卫星影像数据NC转tif

数据介绍 葵花8号卫星(Himawari-8)是日本发射的静止轨道气象卫星,由日本气象厅(JMA)运营。该卫星自2015年7月7日开始正式启用,主要用于观测东亚和西太平洋区域的天气情况。葵花8号卫星搭载了先进的光学仪器,能够提供高分辨率的气象数据。 卫星分辨率 葵花8号卫星的主要…

Python学习-注释,输入,运算符

python中的注释 单行注释以#开头多行注释 这是一段多行注释。 你可以在这里写很多行注释&#xff0c; 这些内容都不会被Python解释器执行。 中文编码注释#coding:utf-8按住ctrl\ 多行注释 输入函数 input() 输入值的类型为str 基本使用 presentinput(输入的提示) print(pre…

STL.string(中)

string 迭代器findswapsubstrrfindfind_first_of&#xff08;用的很少&#xff09;find_last_of&#xff08;用的很少&#xff09;find_first_not_of&#xff08;用的很少&#xff09; 迭代器 int main() {//正向迭代器string s1("hello world!");string::iterator i…

PCL 渐进式形态学滤波

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 如果不太了解点云数学形态学的基本理论,可以先阅读这篇文章:https://blog.csdn.net/dayuhaitang1/article/details/123172437。形态学中的窗口结构一直存在着这样的问题:如果窗口结构元尺寸过小,则无法去除一些…

Qt入门教程:创建我的第一个小程序

本章教程&#xff0c;主要介绍如何编写一个简单的QT小程序。主要是介绍创建项目的过程。 一、打开QT软件编辑器 这里使用的是QT5.14.2版本的&#xff0c;安装教程参考以往教程&#xff1a;https://blog.csdn.net/qq_19309473/article/details/142907096 二、创建项目 到这里&am…

《OpenCV计算机视觉》—— 风格迁移

将下图中的图片换一种风格展示出来 如下图结果&#xff1a; 完整代码如下&#xff1a; import cv2image_yuantu cv2.imread("wechat.jpg") image cv2.resize(image_yuantu, dsizeNone, fx0.5, fy0.5) cv2.imshow(yuan tu, image) cv2.waitKey(0)""&q…

如何实现简单的 WinCC 项目分屏?

说明&#xff1a; 本文主要介绍了在不使用分屏器的情况下&#xff0c;通过 WinCC 项目中的设置&#xff0c;实现简单的分屏操作。两台显示器分别显示不同的 WinCC 画面&#xff0c;独自操作&#xff0c;互不影响。 试验环境 &#xff1a; 本文试验时所用硬件及软件环境…

python基础——网络编程

前言 互联网时代&#xff0c;现在基本上所有的程序都是网络程序&#xff0c;很少有单机版的程序了。网络编程就是如何在程序中实现两台计算机的通信。 Python语言中&#xff0c;提供了大量的内置模块和第三方模块用于支持各种网络访问&#xff0c;而且Python语言在网络通信方面…

如何避免日志中打印SQL语句:完整解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

空间智能技术赋能CIM平台,为数字住建插上翅膀

在数字化浪潮的推动下&#xff0c;城市信息模型&#xff08;CIM&#xff09;平台正成为城市规划、建设和管理的重要工具。CIM平台通过集成地理信息系统&#xff08;GIS&#xff09;、建筑信息模型&#xff08;BIM&#xff09;和物联网&#xff08;IoT&#xff09;等技术&#x…

博客搭建之路:Netlify将url重定向到小写问题

文章目录 Netlify将url重定向到小写问题 Netlify将url重定向到小写问题 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 前两天将博客从vercel改为托管到Netlify上&#xff0c;本来运行的挺流畅的。但是今天我看一篇博客的评论时突然发现&#xff0c;虽然有评论 但是文章开头的评论…

完整发布/上传uniapp Ios应用到App Store流程

使用uniapp打包&#xff0c;假如使用app store证书打包出来的ipa文件&#xff0c;需要上传到app store上才能上架。假如你还没有app store证书&#xff0c;还没有打包&#xff0c;你可以参考下面这篇文章&#xff0c;先创建打包证书再继续看这篇上架的教程&#xff1a;https://…

unity ps 卡通角色自制

一、PS的使用 1.画头 按U键打开画椭圆工具&#xff0c;红色框内选择形状填充色和描边&#xff0c;默认是画椭圆&#xff0c;按住Shift即可画圆 2.画眼睛 按照步骤一的操作画两个填充椭圆就行&#xff0c;然后CtrlG打组&#xff0c;再CtrlJ复制即可 3.画鼻子、嘴、身体、脚 同…

多态对象的存储方案小结

某个类型有几种不同的子类&#xff0c;Jackson中的JsonTypeInfo 和JsonSubTypes可以应对这种情形&#xff0c;但有点麻烦&#xff0c;并且name属性必须是字符串、必须用Jackson为基础的json工具类对json字符串和对象进行序列化和反序列化。用过一次这种方案后边就不想再用了。 …

重学SpringBoot3-Spring Data JPA简介

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring Data JPA简介 1. 什么是 Spring Data JPA&#xff1f;2. Spring Data JPA 的核心概念2.1. 实体&#xff08;Entity&#xff09;2.2. Repository&…

若依前后端框架学习——新建模块(图文详解)

若依框架—新建模块 一、项目地址1、后端启动2、前端启动 二、生成代码1、添加菜单2、创建表结构3、生成代码2、编辑一些基本信息&#xff0c;然后点击提交3、生成代码&#xff0c;压缩包里有前端和后端代码 三、配置后端模块1、新建模块2. 修改pom.xlm2.1 修改第一个pom.xml 2…

关于jmeter设置为中文问题之后无法保存设置的若干问题

1、jemeter如何设置中文模式 Options--->Choose Language--->Chinese(Simplifies), 如此设置后就可显示中文模式(缺点&#xff1a;下次打开还是英文)&#xff1b;如下图所示&#xff1a; 操作完成之后&#xff1a; 但是下次重启之后依旧是英文&#xff1b; 2、在jmeter.…

探索 Jupyter 笔记本转换的无限可能:nbconvert 库的神秘面纱

文章目录 探索 Jupyter 笔记本转换的无限可能&#xff1a;nbconvert 库的神秘面纱背景&#xff1a;为何选择 nbconvert&#xff1f;库简介&#xff1a;nbconvert 是什么&#xff1f;安装指南&#xff1a;如何安装 nbconvert&#xff1f;函数用法&#xff1a;简单函数示例应用场…

18-基于双TMS320C6678 DSP的3U VPX的信号处理平台

一、板卡概述 该板卡是由我公司自主研发的基于3U VPX架构的信号处理板&#xff0c;该处理板包含2片TI的TMS320C6678 DSP芯片&#xff0c;1片Xilinx公司的Spartan-3系列XC3S200AN配置芯片&#xff0c;两片DSP分别有1路RapidIO x4连接至VPX背板&#xff0c;两片DSP之间通过Hyperl…

scratch机器人捡垃圾 2024年9月scratch二级真题 中国电子学会 图形化编程 scratch二级真题和答案解析

目录 scratch机器人捡垃圾 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …