黄金分割算法原理、实现及函数极小值求解实例
创作时间:
作者:
@小白创作中心
黄金分割算法原理、实现及函数极小值求解实例
引用
CSDN
1.
https://blog.csdn.net/Super_senior1/article/details/144832764
黄金分割算法是一种基于区间收缩的极小点搜索算法,广泛应用于函数极值求解。本文将详细介绍黄金分割算法的基本原理、实现步骤,并通过一个具体的函数极值求解实例,展示其在MATLAB中的应用。
一、算法原理
黄金分割法也称为0.618法,其基本思想是通过不断缩小搜索区间,使搜索区间的端点逼近极小点。具体来说,对于给定的搜索区间[a, b],算法首先根据黄金比例产生两个内点x1和x2:
x1 = a + 0.382 * (b - a)
x2 = a + 0.618 * (b - a)
然后根据f(x1)和f(x2)的大小关系来重新选择搜索区间:
- 若f(x1) < f(x2),则搜索区间变为[x1, b]
- 若f(x1) > f(x2),则搜索区间变为[a, x2]
二、算法步骤
用黄金分割法求解无约束优化问题min f(x), x∈R的基本算法步骤如下:
选定初始区间[a1, b1]及精度ε > 0,计算试探点:
λ1 = a1 + 0.382 * (b1 - a1)
μ1 = a1 + 0.618 * (b1 - a1)
并令k = 1若bk - ak < ε,则停止计算。否则,根据f(λk)和f(μk)的大小关系进行区间更新:
- 当f(λk) > f(μk)时,更新区间为[λk, bk],并计算新的试探点
- 当f(λk) ≤ f(μk)时,更新区间为[ak, μk],并计算新的试探点
- 重复步骤2,直到满足精度要求或达到最大迭代次数
三、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在区间[-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
进一步计算得到:
>> 18831305206737427346706372180303789976284356552717013960977/6277101735386680763835789423207666416102355444464034512896
ans =
3.0000
从目标函数的表达式可以看出,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中进行实际应用。
热门推荐
编导专业就业前景现状、发展趋势解读
比黑洞还要神秘和可怕,深渊的另一面——白洞,究竟是什么?
探究普洱茶价格:从入门到精通,全面解析影响普洱茶价格的因素及市场行情
德语在线培训有哪些常见的学习方法?
肺癌小细胞癌是什么意思
印象形成过程中的4种心理效应
强行征地如何维权?外嫁女权益与树苗补偿全解析
心脏搭桥手术风险大吗?术后注意事项全解析
晚上睡不着觉是什么原因造成的呢(晚上失眠原因有哪些)
汉中至西藏徒步及自驾路线全攻略
探索中国绝美风光:盘点8条不可错过的徒步路线
打电话时为何没有网络连接?了解原因及解决方法
便血就是肠癌吗?
楼顶有信号塔几楼最危险、楼顶信号塔影响风水?揭秘家居风水之谜
婴儿指甲剪套装选购指南:安全防夹肉专用产品推荐
抑郁症中的解离症状:原因、关联与治疗
社会保险缴费工资申报表填写指南
企业所得税的税收筹划如何进行
瞑眩反应是什么意思
【中医科普】中医的瞑眩(mingxuan)反应
探索圆的面积计算:公式背后的数学与生活应用知识
指数小课堂|细说中证500指数编制方案
小学语文概括段落大意的方法
如何有效进行法律案件的起诉:全面解析办案流程
笔记本电脑线缆接插全攻略:从基础到进阶的详细指南
专家解读:减肥期间中午两点饮食是否合适?
为什么你应该学习极真空手道而不是拳击?
定制化需求如何管理
全面解析:做好品牌策划你需要掌握的实用知识
QC协议工作原理,支持QC和FCP协议的诱骗取电协议芯片及其应用领域