【智能优化算法】黄金分割算法原理、实现及函数极小值求解实例-Matlab源程序


🎓 作者简介:博士研究生
🔬 工作室呀:超级学长_实验室(提供各种程序开发、实验指导)
💌 个人邮箱:easy_optics@126.com
💬 个人微信:easy_optics
🐧 个人企鹅:754357517

摘要

本博文深入阐述了黄金分割算法的基本原理,详细列出了其实施步骤,并附上了完整的MATLAB源代码。此外,还通过一个具体的函数极小值求解实例,展示了黄金分割算法的实际应用。

一、 算法原理

黄金分割法也叫0.618法,它是一种基于区间收缩的极小点搜索算法,当用进退法确定搜索区间后,我们只知道极小点包含于搜索区间内,但是具体是哪个点,无法得知。

黄金分割法的思想很直接,既然极小点包含于搜索区间内,那么可以不断的缩小搜索区间,就可以使搜索区间的端点逼近到极小点。

如图1所示,[a,b]为搜索区间,黄金分割法首先根据黄金比例产生两个内点 x 1 , x 2 x_1,x_2 x1,x2

x 1 = a + 0.38 2 ∗ ( b − a ) x 2 = a + 0.61 8 ∗ ( b − a ) x_{1}=\mathrm{a}+0.382^{*}(\mathrm{b}-\mathrm{a})\\x_{2}=\mathrm{a}+0.618^{*}(\mathrm{b}-\mathrm{a}) x1=a+0.382(ba)x2=a+0.618(ba)

然后根据 f ( x 1 ) , f ( x 2 ) f(x_1),f(x_2) f(x1)f(x2)的大小关系来重新选择搜索区间。

  1. f ( x 1 ) < f ( x 2 ) f(x_1)<f(x_2) f(x1)<f(x2),则搜索区间变为 [ x 1 , b ] ; [x_1,b]; [x1,b];
  2. f ( x 1 ) > f ( x 2 ) f(x_1)>f(x_2) f(x1)>f(x2),则搜索区间变为 [ a , x 2 ] [\mathbf{a},x_2] [a,x2]

在这里插入图片描述

图1 黄金分割法的内点选择示意图

二、黄金分割算法步骤

用黄金分割法求无约束问题 min ⁡ f ( x ) , x ∈ R \min f(x),x\in\mathbb{R} minf(x),xR的基本算法步骤如下:

① 选定初始区间 [ a 1 , b 1 ] [a_1,b_1] [a1,b1]及精度 ε > 0 \varepsilon>0 ε>0,计算试探点:

λ 1 = a 1 + 0.38 2 ∗ ( b 1 − a 1 ) μ 1 = a 1 + 0.61 8 ∗ ( b 1 − a 1 ) \begin{aligned} & \lambda _{1}= \mathrm{a} _{1}+ 0. 382^{* }( \mathrm{b} _{1}- \mathrm{a} _{1}) \\ & \mu _{1}= \mathrm{a} _{1}+ 0. 618^{* }( \mathrm{b} _{1}- \mathrm{a} _{1}) \end{aligned} λ1=a1+0.382(b1a1)μ1=a1+0.618(b1a1),并 令 k = 1 k= 1 k=1

② 若 b k − a k < ε b_k-a_k<\varepsilon bkak<ε,则停止计算。

否则,当 f ( λ k ) > f ( μ k ) f(\lambda_{k})>f(\mu_{k}) f(λk)>f(μk) 时转③;

f ( λ k ) ⩽ f ( μ k ) f(\lambda_{k})\leqslant f(\mu_{k}) f(λk)f(μk) 时转④:

③ 置

{ a k + 1 = λ k b k + 1 = b k λ k + 1 = μ k μ k + 1 = a k + 1 + 0.61 8 ∗ ( b k + 1 − a k + i ) \begin{aligned}&\\&\begin{cases}a_{k+1}=\lambda_{k}\\b_{k+1}=b_{k}\\\lambda_{k+1}=\mu_{k}\\\mu_{k+1}=a_{k+1}+0.618^{*}(b_{k+1}-a_{k+i})\end{cases}\\\end{aligned} ak+1=λkbk+1=bkλk+1=μkμk+1=ak+1+0.618(bk+1ak+i),转⑤;

④ 置
{ a k + 1 = a k b k + 1 = μ k μ k + 1 = λ k λ k + 1 = a k + 1 + 0.38 2 ∗ ( b k + 1 − a k + 1 ) , \begin{aligned}&\\&\begin{cases}a_{k+1}=a_{k}\\b_{k+1}=\mu_{k}\\\mu_{k+1}=\lambda_{k}\\\lambda_{k+1}=a_{k+1}+0.382^{*}(b_{k+1}-a_{k+1})\end{cases},\\\end{aligned} ak+1=akbk+1=μkμk+1=λkλk+1=ak+1+0.382(bk+1ak+1)转⑤;

⑤ 令 k = k + 1 k=k+1 k=k+1,转②。

三、黄金分割法Matlab程序

黄金分割法的Matlab程序代码如下所示:

function [x,minf] = minHJ(f,a,b,eps)


% 目标函数:f;
% 极值区间左端点:a;
% 极值区间右端点:b;
% 精度:eps;
% 目标函数取最小值时的自变量值:x;
% 目标函数的最小值:minf

format long;
if nargin == 3
    eps = 1.0e-6;
end

l = a + 0.382*(b-a);
u = a + 0.618*(b-a);
k=1;
tol = b-a;

while tol>eps && k<100000
    fl = subs(f , symvar(f), l);
    fu = subs(f , symvar(f), u);
    if fl > fu
        a = l;
        l = u;
        u = a + 0.618*(b - a);
    else
        b = u;
        u = l;
        l = a + 0.382*(b-a);
    end
    k = k+1;
    tol = abs(b - a);
end
if k == 100000
    disp('找不到最小值!');
    x = NaN;
    minf = NaN;
    return;
end
x = (a+b)/2;
minf = subs(f, symvar(f),x);
format short;


四、黄金分割法求解函数极值实例演示

用黄金分割法求下面函数的最小值:

f ( t ) = ( t 2 − 1 ) 2 + ( t − 1 ) 2 + 3 = t 4 − t 2 − 2 t + 5 f(t)=(t^{2}-1)^{2}+(t-1)^{2}+3=t^{4}-t^{2}-2t+5 f(t)=(t21)2+(t1)2+3=t4t22t+5,其中 t ∈ [ − 10 , 10 ] t\in[-10,10] t[10,10]

在matlab命令窗口中输入:

syms t
f=t^4-t^2-2*t+5
[x,fx]=minHJ(f,-10,10)

所得结果为:

x =

    1.0000

 
fx =
 
18831305206737427346706372180303789976284356552717013960977/6277101735386680763835789423207666416102355444464034512896
 

其中,fx以分数形式进行显示,进一步计算得到

>> 18831305206737427346706372180303789976284356552717013960977/6277101735386680763835789423207666416102355444464034512896
 

ans =

    3.0000

从目标函数的表达式可以明显看出 t = 1 t=1 t=1是极小点,黄金分割法求出的结果是正确的。目标函数是单极值点函数,因此极值点(1,3)也是其最小点,其曲线图如图2 所示。

在这里插入图片描述

图2 该函数曲线图

绘制上述曲线图的Matlab代码如下:


	% 定义符号变量 t
	syms t
	% 定义函数 f(t)
	f = t^4 - t^2 - 2*t + 5;

	% 定义 t 的取值范围,例如从 -3 到 3,步长为 0.01
	t_vals = -3:0.01:3;

	% 计算 f(t) 在这些 t 值上的取值

	f_vals = double(subs(f, t, t_vals));
	% 绘制曲线
	figure;

	plot(t_vals, f_vals, 'LineWidth', 2);
	xlabel('t');
	ylabel('f(t)');
    % 设置 y 轴的区间,例如从 0 到 100
    ylim([2.5 6]);
	title('Plot of f(t) = t^4 - t^2 - 2t + 5');
	grid on;

五、总结


博主简介:擅长智能优化算法信号处理图像处理机器视觉深度学习神经网络等领域Matlab仿真以及实验数据分析等,matlab代码问题、商业合作、课题选题与指导等均可私信交流


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值