实验一:黄金分割法
实验一:黄金分割法
一、实验目的
过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
步骤1:初始化参数
- 设定初始搜索区间[a, b]
- 计算两个内插点al和ak
- 设定精度为10^-6
步骤2:迭代过程
- 计算内插点的函数值
- 根据函数值比较更新搜索区间
- 更新内插点al和ak
- 重复以上步骤直到满足精度要求
步骤3:输出结果
- 输出极小点和极小值
- 输出每次迭代的a、b、al、ak的值
- 代码
function [xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol)
% f: 待优化的目标函数
% a,b: 初始区间
% tol: 精度要求
% xm,fm: 最优解和相应的最优函数值
% 黄金分割比例
r = (sqrt(5)-1)/2;
% 初始值
L = b-a;
x1 = a + (1-r)*L;
x2 = a + r*L;
fx1 = f(x1);
fx2 = f(x2);
% 记录每次迭代的值
i = 1;
aList(i) = a;
bList(i) = b;
alList(i) = x1;
akList(i) = x2;
% 迭代计算
while L > tol
if fx1 > fx2
a = x1;
x1 = x2;
fx1 = fx2;
x2 = a + r*(b-a);
fx2 = f(x2);
else
b = x2;
x2 = x1;
fx2 = fx1;
x1 = a + (1-r)*(b-a);
fx1 = f(x1);
end
i = i+1;
aList(i) = a;
bList(i) = b;
alList(i) = x1;
akList(i) = x2;
L = b-a;
end
% 输出结果
xm = (a+b)/2;
fm = f(xm);
end
- 结果
The minimum point is 0.876733, and the minimum value is -0.459698.
The a values are:
0
0
0
0.381966011250105
0.236067977499790
0.145898033750315
0.090169943749474
0.055728090000842
0.034441853748633
0.021286236252019
0.013155483496614
0.008130752755405
0.005024965740613
0.003105787014792
0.001919178725821
0.001186608289235
0.000732381425586
0.000454227862104
0.000278372834758
0.000175854482297
0.000102578032461
0.000073276955836
The b values are:
1.000000000000000
0.618033988749895
0.381966011250105
0.618033988749895
0.527864045000420
0.381966011250105
0.291796067500630
0.236067977499790
0.181835090000840
0.145898033750315
0.111982834752170
0.069915254246814
0.108396910257348
0.084076061991545
0.070374253494812
0.058715270752791
0.048068058861111
0.039235212890173
0.032042696432049
0.026337311863419
0.021981384914175
0.020242715948036
The al values are:
0.381966011250105
0.236067977499790
0.145898033750315
0.618033988749895
0.527864045000420
0.381966011250105
0.291796067500630
0.236067977499790
0.181835090000840
0.145898033750315
0.111982834752170
0.069915254246814
0.108396910257348
0.084076061991545
0.070374253494812
0.058715270752791
0.048068058861111
0.039235212890173
0.032042696432049
0.026337311863419
0.021981384914175
0.020242715948036
The ak values are:
0.618033988749895
0.381966011250105
0.236067977499790
0.527864045000420
0.454131926249457
0.327826024999581
0.252371922499263
0.204874905000158
0.158725110000630
0.127965201249685
0.098915600503356
0.061066579745468
0.060857962507227
0.047310052257331
0.039163521508602
0.032514812494448
0.026682500870536
0.021760693711955
0.017817332481058
0.013878867350363
0.013055421881667
0.010761747913840
四、心得体会
0.618法是一种相对简单但有效的搜索算法,通过不断缩小搜索区间和更新内插点的方式,可以逐步逼近最优解。每次迭代过程中,观察a、b、al、ak的变化,可以更直观地理解算法的执行过程。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤