2024.6.2
实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
三、算法步骤、代码、及结果
1. 算法步骤
- 进退法确定初始区间:通过观察函数的性质或者初步的试探,确定一个包含极小点的初始搜索区间 [a, b]。
- 初始化:设定精度为 epsilon = 10^-6,以及常数 r = 0.618。
- 计算初始搜索点:计算初始搜索点 al = a + (1 - r) * (b - a) 和 ak = a + r * (b - a) 对应的函数值 fal 和 fak。
- 迭代:
- 4.1 如果搜索区间的长度小于精度 epsilon,则停止迭代,输出当前搜索区间的中点作为极小点,以及该点对应的函数值作为极小值。
- 4.2 否则,比较 fal 和 fak:
- 如果 fal < fak,则更新搜索区间为 [a, ak, b],即丢弃区间 [ak, b];
- 如果 fal > fak,则更新搜索区间为 [al, a, b],即丢弃区间 [a, al];
- 4.3 重新计算新的搜索点 al 和 ak,以及对应的函数值 fal 和 fak。
- 4.4 重复步骤4。
2. 代码
function [xmin, fmin, iter_info] = golds(a, b, epsilon)
r = 0.618; % Golden ratio
iter_info = struct('a', [], 'b', [], 'al', [], 'ak', []);
al = a + (1 - r) * (b - a);
ak = a + r * (b - a);
fal = target_function(al);
fak = target_function(ak);
iter = 0;
while abs(b - a) > epsilon
iter = iter + 1;
iter_info(iter).a = a;
iter_info(iter).b = b;
iter_info(iter).al = al;
iter_info(iter).ak = ak;
if fal < fak
b = ak;
ak = al;
fak = fal;
al = a + (1 - r) * (b - a);
fal = target_function(al);
else
a = al;
al = ak;
fal = fak;
ak = a + r * (b - a);
fak = target_function(ak);
end
end
xmin = (a + b) / 2;
fmin = target_function(xmin);
end
function y = target_function(x)
% Define your target function here
y = x^2 + 3*x + 2;
end
测试:
a = 0; % 初始搜索区间左端点
b = 1; % 初始搜索区间右端点
epsilon = 1e-6; % 精度
[xmin, fmin, iter_info] = golds(a, b, epsilon);
disp(['极小点:', num2str(xmin)]);
disp(['极小值:', num2str(fmin)]);
disp('迭代信息:');
disp(' 迭代次数 a b al ak');
for i = 1:length(iter_info)
disp([num2str(i), ' ', num2str(iter_info(i).a), ' ', ...
num2str(iter_info(i).b), ' ', num2str(iter_info(i).al), ' ', ...
num2str(iter_info(i).ak)]);
end
3. 结果
四、心得体会
这次实验让我深入了解了一维寻优中的黄金分割法。通过实现该算法,我学会了如何在一个区间内寻找函数的极小值点,并且可以控制精度以满足特定的要求。
首先,我了解到黄金分割法的核心思想是不断缩小搜索区间,使得每次迭代都能够尽可能减少函数的计算次数,提高寻优效率。在这个过程中,进退法帮助确定了初始的搜索区间,然后通过不断缩小区间来逼近最优解。
在编写 MATLAB 程序实现黄金分割法时,我按照算法步骤一步步进行了实现。通过定义目标函数、设定初始搜索区间、设置精度要求以及迭代过程中的参数更新,我成功地实现了该算法。在每次迭代中,我都输出了当前的搜索区间和相关参数的值,以便于跟踪算法的执行过程。
通过这次实验,我不仅学会了一个新的优化方法,还提高了自己的编程能力。我意识到了优化算法的重要性以及在实际问题中的应用价值。这次实验为我今后学习和应用无约束优化方法奠定了基础,同时也培养了我在计算机领域的应用能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通