实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
定义目标函数:
首先,定义了目标函数 f(x) = x^2 - x + 6。。
使用进退法确定初始搜索区间:
选择一个初始点 x0 和步长 h。
计算 f(x0) 和 f(x0 + h)。
根据函数值的变化确定搜索方向,如果 f(x0 + h) 比 f(x0) 小,则沿此方向继续搜索;否则,反向搜索。
通过多次迭代,确定一个区间 [a, b],使得函数值在该区间的两端点都比区间内的某一点大,这表明极小值点可能位于此区间内。
应用0.618法进行搜索:
计算黄金分割比例 rho = (sqrt(5) - 1) / 2,约等于0.618。
设置搜索精度 tol,例如 1e-6。
在区间 [a, b] 内,根据黄金分割比例选择两个点 x1 和 x2。
计算这两个点的函数值 f1 和 f2。
比较 f1 和 f2 的大小,根据哪个更小来缩减搜索区间:
如果 f1 < f2,则令 b = x2,即舍弃区间 [x2, b]。
如果 f1 >= f2,则令 a = x1,即舍弃区间 [a, x1]。
重复上述步骤,直到区间 [a, b] 的长度小于预设的精度 tol。
计算极小值点和极小值:
当搜索区间足够小时,认为区间的中点即为极小值点的近似值,即 xmin = (a + b) / 2。
计算该点的函数值 fmin = f(xmin),即为极小值的近似值。
输出结果:
打印或返回计算得到的极小值点 xmin 和极小值 fmin。
2. 代码
function [xmin, fmin] = goldenSectionSearch()
% 目标函数
f = @(x) x.^2 - x + 6;
% 进退法确定初始区间
x0 = 0; % 初始点
h = 1; % 初始步长
x1 = x0;
f1 = f(x1);
x2 = x0 + h;
f2 = f(x2);
% 确定搜索方向
while f2 >= f1
h = -h; % 反向搜索
x2 = x1;
f2 = f1;
x1 = x1 + h;
f1 = f(x1);
end
% 确定初始区间 [a, b]
a = x1;
b = x2;
fa = f1;
fb = f2;
% 黄金分割比例
rho = (sqrt(5) - 1) / 2;
% 精度要求
tol = 1e-6;
% 0.618法搜索极小值点
while (b - a) > tol
x1 = b - rho * (b - a);
x2 = a + rho * (b - a);
f1 = f(x1);
f2 = f(x2);
if f1 < f2
b = x2;
else
a = x1;
end
end
% 计算极小值点和极小值
xmin = (a + b) / 2;
fmin = f(xmin);
% 输出结果
fprintf('极小值点:%f, 极小值:%f\n', xmin, fmin);
end
3. 结果
四、心得体会
通过本次实验设置最优化算法计算函数,我理解了0.618法的实现原理.
0.618法(黄金分割法)是一种通过不断缩小搜索区间来逼近函数极小值点的方法。该方法利用黄金分割比例0.618来确定新区间的分割点,并通过比较函数值的大小来更新搜索区间,直至满足给定的精度要求。
这对于我来处理最优化问题很有帮助,编写程序的时候更加清晰步骤