黄金分割法在求解单峰函数的极小值中的应用
(姓名:肖逢,学号:122081915)
1. 算法程序
算法源代码(matlab 环境,以 cos 函数例)
% 用黄金分割法求解单峰函数的极小值
interval_left=0; % 初始搜索区间左边界点
interval_right=5; % 初始搜索区间右边界点
cycle_times=0; % 迭代次数
precision = 0.001; % 算法精度参数
right_interval_ag=0; % 右侧区间标志,1=选右侧区间,0=选左侧区间
interval_length = interval_right - interval_left; % 计算搜索区间长度
insert_point_left = interval_left + 0.382*interval_length; % 计算黄金分割法的左插入点
insert_point_right = interval_left + 0.618*interval_length; % 计算黄金分割法的右插入点
% 开始迭代
while interval_length>precision
value_left = cos(insert_point_left); % 计算左插入点的函数值
value_right = cos(insert_point_right); % 计算右插入点的函数值
if value_left>value_right
right_interval_ag=1; % 选择右侧区间
interval_left = insert_point_left; % 压缩区间后,更新左边界点
insert_point_left = insert_point_right; % 下次迭代运算左插入点
else
right_interval_ag=0; % 选择左侧区间
interval_right = insert_point_right; % 压缩区间后,更新右边界点
insert_point_right = insert_point_left; % 下次迭代运算右插入点
end
interval_length = interval_right - interval_left; % 计算区间长度
cycle_times=cycle_times+1; % 迭代计数
if right_interval_ag==1
insert_point_right = interval_left + 0.618*interval_length; % 右区间,则计算下次迭代运算的右插入点
else
insert_point_left = interval_left + 0.382*interval_length; % 左区间,则计算下次迭代运算的左插入点
end
end
% 迭代结束
x = 0.5 * (interval_right + interval_left) % 黄金分割算法搜索到的极小值点
y = cos(x) % 极小值点处函数值
运行结果:
>> golden_mean
x =
3.1414
y =
-1.0000
>> cycle_times
cycle_times =
18
由运行结果可知:采用黄金分割法对函数 cos(x)在区间[0,5]上以 0.001 的精度搜索到
极小值点为 3.1414,其函数值为-1.0000,显然搜索结果与理论计算在算法要求误差范围内
是一致。笔者试过其他单峰函数,其结果也符合理论值。
注:提供可在 matlab 环境下直接运行的.m 文件,文件名为 golden_mean.m。