5.23
实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
- 初始化搜索区间 [a, b],并计算区间长度 L = b - a。
- 计算两个内点 x1 = a + 0.382 * L 和 x2 = a + 0.618 * L。
- 计算在 x1 和 x2 处的函数值 f(x1) 和 f(x2)。
- 如果 f(x1) < f(x2),则更新搜索区间为 [a, x2],否则更新搜索区间为 [x1, b]。
- 重复步骤2-4,直到搜索区间的长度小于给定的精度阈值 tol。
- 最终结果为搜索区间的中点,即 (a + b) / 2。
2. 代码
function golds(f, a, b)
tol = 1e-6; % 精度
L = b - a;
iter = 1;
while L > tol
x1 = a + 0.382 * L;
x2 = a + 0.618 * L;
f1 = f(x1);
f2 = f(x2);
if f1 < f2
b = x2;
else
a = x1;
end
% 输出每次迭代的a、b、al、ak的值
fprintf('第%d次迭代:a = %.6f, b = %.6f, al = %.6f, ak = %.6f\n', iter, a, b, x1, x2);
L = b - a;
iter = iter + 1;
end
% 输出最终结果
x_min = (a + b) / 2;
f_min = f(x_min);
fprintf('极小点: %f\n', x_min);
fprintf('极小值: %f\n', f_min);
end
3. 结果
四、心得体会
在本次实验中,我学习了如何使用MATLAB来寻找一个函数的极小点和极小值。通过实现0.618法算法,我能够在给定的初始区间内迭代寻找函数的极小点,并且在一定精度范围内得到比较准确的结果。
通过本次实验,我学会了如何定义目标函数的函数句柄,如何绘制函数的图像以辅助确定初始区间,以及如何利用迭代算法逐步逼近极小点。在实验过程中,我遇到了一些错误,比如在定义目标函数时使用了错误的运算符,但通过查阅文档和改正错误,最终得以解决。
我认为这次实验对我的编程能力和数学建模能力有很好的提升。通过实践,我更加熟悉了MATLAB的使用,也加深了对优化算法的理解。我希望在未来的学习和工作中能够继续深入探索数学建模和优化算法的应用,为解决实际问题提供更好的解决方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义