当前位置: 首页 > news >正文

25、matlab里面的10中优化方法介绍——Opt_Golden法(matlab程序)

1.简述

      

基本思想
黄金分割法也称为 0.618 法,其基本思想是通过取试探点和进行函数值比较,使包含极小点的搜索区间不断缩短以逼近极小值点。适用于确定区间上的任何单谷函数求极小值的问题。

公式推导
设有定义在[ a , b ] [a,b][a,b]上的单谷函数
φ ( α ) = f ( x k + α d k ) \varphi \left( \alpha \right) =f\left( x_k+\alpha d_k \right)

在[ a , b ] [a,b][a,b]上取两个试探点。计算φ ( x 1 ) 
可能会出现以下两种情形:


我们要求试探点满足下列两个原则:

对称原则
λ = 新 区 间 长 度 原 区 间 长 度 = \lambda =\frac{新区间长度}{原区间长度}=λ= 
原区间长度
新区间长度

 =定值(保持缩减比)
从而可得
{ x 1 = a + ( 1 − λ ) ( b − a ) x 2 = a + λ ( b − a )

 

考虑情形1,此时新的搜索区间为[ a 1 , b 1 ] [a_1,b_1][a 
选取新的试探点x 
 

若令λ 2 = 1 − λ ( λ > 0 ) \lambda ^2=1-\lambda\left( \lambda>0 \right)λ 

则有
新的试探点x 4 x_4x 
1−λ得λ ≈ 0.618 \lambda \approx0.618λ≈0.618。

具体练习及Matlab实现
 

2.代码

主程序:

%%   用Opt_Golden()求解最优化
f1201 = inline('x-(x.*x-2).^3/2','x');
a = 0;
b = 4; 
TolX = 1e-4;%判断循环是否停止的x阈值
TolFun = 1e-4; %函数阈值
MaxIter = 100; %设定迭代次数
[xo,fo] = Opt_Golden(f1201,a,b,TolX,TolFun,MaxIter)

子程序:

function [xo,fo]=Opt_Golden(f,a,b,TolX,TolFun,k)
%%%%黄金搜索算法求在区间[a,b]上的最优化解
%f为目标函数,TolX为x阈值,TolFun为函数阈值,k为迭代次数
r =(sqrt(5)-1)/2; %r为黄金分割点值,
h = b-a;  %区间宽度
rh = r*h; 
%%%取两点c、d,并计算相应的函数值fc和fd
c = b-rh; 
d = a+rh;
fc = feval(f,c);
fd = feval(f,d);
%%%算法第二步判断是否停止迭代
if k <= 0 | (abs(h) < TolX & abs(fc - fd) < TolFun)
    if fc <= fd
        xo = c;
        fo = fc;
    else
        xo = d;
        fo = fd;
    end
    if k == 0
        fprintf('最好设定迭代次数大于0');
    end
%%%%算法第三步,进行新一轮迭代    
else
    if fc < fd
        [xo,fo] = Opt_Golden(f,a,d,TolX,TolFun,k-1);
    else
        [xo,fo] = Opt_Golden(f,c,b,TolX,TolFun,k-1);
    end
end

3.运行结果

 

 

http://www.lryc.cn/news/95600.html

相关文章:

  • 点云拟合球体
  • 基于动态规划(DP)算法的增程式EV能量管理策略研究(MATLAB编程)
  • 前端知识点视频补充
  • python多线程—终止子线程
  • #P1012. [NOIP2015提高组] 神奇的幻方
  • (学习笔记-IP)Ping的工作原理
  • php 进程间通信:管道、uds
  • Stable Diffusion如何生成高质量的图-prompt写法介绍
  • MySQL 高级SQL语句(一)
  • SkyWalking链路追踪-技术文档首页
  • AndroidStudio Memory profiler(内存分析器)
  • 【C++模板进阶】
  • (一)RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理
  • JetBrains全家桶:如何自定义实现类TODO注释?
  • 【技术干货】工业级BLE5.2蓝牙模块SKB378 使用教程,AT指令集
  • 零基础深度学习——学习笔记1 (逻辑回归)
  • I want to know on what switchport is connected my computer (10.8.0.2)
  • OpenCv之人脸操作
  • C++[第五章]--指针和引用
  • 用i18next使你的应用国际化-React
  • TSN -促进IT/OT 融合的网络技术
  • 改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例
  • 等保工作如何和企业创新业务发展相结合,实现“安全”和“创新”的火花碰撞?
  • 23.7.25 杭电暑期多校3部分题解
  • 【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • 文档翻译软件那么多,哪个能满足你的多语言需求?
  • MySQL 中NULL和空值的区别
  • 阿里云容器镜像仓库(ACR)的创建和使用
  • 工业的相机与镜头(简单选型)
  • numpy广播机制介绍