🎓 作者简介:博士研究生
🔬 工作室呀:超级学长_实验室(提供各种程序开发、实验指导)
💌 个人邮箱: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∗(b−a)x2=a+0.618∗(b−a)
然后根据 f ( x 1 ) , f ( x 2 ) f(x_1),f(x_2) f(x1),f(x2)的大小关系来重新选择搜索区间。
- 若 f ( x 1 ) < f ( x 2 ) f(x_1)<f(x_2) f(x1)<f(x2),则搜索区间变为 [ x 1 , b ] ; [x_1,b]; [x1,b];
- 若 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]。

二、黄金分割算法步骤
用黄金分割法求无约束问题 min f ( x ) , x ∈ R \min f(x),x\in\mathbb{R} minf(x),x∈R的基本算法步骤如下:
① 选定初始区间 [ 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∗(b1−a1)μ1=a1+0.618∗(b1−a1),并 令 k = 1 k= 1 k=1 ;
② 若 b k − a k < ε b_k-a_k<\varepsilon bk−ak<ε,则停止计算。
否则,当 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+1−ak+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+1−ak+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)=(t2−1)2+(t−1)2+3=t4−t2−2t+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 所示。

绘制上述曲线图的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代码问题、商业合作、课题选题与指导等均可私信交流。
178

被折叠的 条评论
为什么被折叠?



