功能:进退法和黄金分割法确定极小值。
- 源码
function result = Advance_Retreat_Gold(func, t0, step, eps)
% 进退法和黄金分割法确定极小值
%
=======================================================================
% 输入:
% fun:目标函数;
% t0:进退法端点值;
% step:进退法步长;
% eps:黄金分割法的精度
% 输出:
% result:步长;
%
=======================================================================
% 进退法确定大致区间
bd = Opt_AdvanceRetreat(func, t0, step);
if abs(bd - t0) < eps
disp('此端点右侧单调递增,没有搜索到极小值区间,请修改端点值!');
return;
end
% 黄金分割法确定精确解
result = Opt_Gold(func, t0, bd, eps);
end
function result = Opt_AdvanceRetreat(func, t0, step)
% 进退法确定最优解区间
% 确定一个单峰区间
%
=======================================================================
% 输入:
% fun:目标函数;
% t0:进退法端点值;
% step:进退法步长
% 输出:
% result:另一个端点;
%
=======================================================================
t1= t0 + step;
ft0 = func(t0);
ft1 = func(t1);
if ft1 <= ft0
step = 2*step;
t2 = t1 + step;
ft2 = func(t2);
while ft1 - ft2 > 0
t1 = t2;
step = 2*step;
t2 = t1 + step;
ft1 = func(t1);
ft2 = func(t2);
end
else
step = step/2;
t2 = t1;
t1 = t2 - step;
ft1 = func(t1);
while ft1 - ft0 > 0
step = step/2;
t2 = t1;
t1 = t2 - step;
ft1 = func(t1);
end
end
result = t2;
end
function result = Opt_Gold(func, a, b, eps)
% 黄金分割法确定最优解
%
=======================================================================
% 输入:
% fun:目标函数;
% a:左端点值;
% b:右端点值;
% eps:精度
% 输出:
% result:最优解;
%
=======================================================================
a1 = a + 0.382*(b - a);
a2 = a + 0.618*(b - a);
f1 = func(a1);
f2 = func(a2);
while abs(b - a) >= eps
if f1 < f2
b = a2;
a2 = a1;
f2 = f1;
a1 = a + 0.382*(b - a);
f1 = func(a1);
else
a = a1;
a1 = a2;
f1 = f2;
a2 = a + 0.618*(b - a);
f2 = func(a2);
end
end;
result = 0.5*(a + b);
end