matlab用进退法确定区间,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

---------------------

作者:有个家伙喜欢代码

来源:CSDN

原文:blog.csdn.net/u012366767 …

版权声明:本文为博主原创文章,转载请附上博文链接!

更多免费技术资料可关注:annalin1203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值