【Matlab学习手记】进退法和黄金分割法求极小值

功能:进退法和黄金分割法确定极小值。

  • 源码
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值