一维搜索:0.618法

0.618法又叫黄金分割法,适用于单峰函数,可以不连续。

1.算法步骤
  • (1) 置初始区间[a1,b1][a1,b1]及精度要求L>0L>0,计算试探点λ1λ1μ1μ1,计算函数值f(λ1)f(λ1)f(μ1)f(μ1)。计算公式为
    λ1=a1+0.382(b1a1),μ1=a1+0.618(b1a1)λ1=a1+0.382(b1−a1),μ1=a1+0.618(b1−a1)
  • (2) 若bkak<Lbk−ak<L,则停止计算。否则,当f(λk)>f(μk)f(λk)>f(μk)时,转步骤(3);当f(λk)f(μk)f(λk)≤f(μk)时,转步骤(4)。
  • (3) 置ak+1=λk,bk+1=bk,λk+1=μk,μk+1=ak+1+0.618(bk+1ak+1)ak+1=λk,bk+1=bk,λk+1=μk,μk+1=ak+1+0.618(bk+1−ak+1)计算函数值f(μk+1)f(μk+1)转步骤(5)。
  • (4) 置ak+1=ak,bk+1=μk,μk+1=λk,λk+1=ak+1+0.382(bk+1ak+1)ak+1=ak,bk+1=μk,μk+1=λk,λk+1=ak+1+0.382(bk+1−ak+1)计算函数值f(λk+1)f(λk+1)转步骤(5)。
  • (5) 置k:=k+1k:=k+1,返回步骤(2)。

2.代码示例
1.测试函数:

clc,clear
func = @(x) 2*x.^2 - x - 1; % 创建函数句柄
a1 = -1;
b1 = 1;
L = 0.01;
tic
[x state] = goldenRatio(func,a1,b1,L); %求解最小值
toc
% 画图展示
x = a1:0.01:b1;
y = 2*x.^2 - x - 1;
axis([-2 2 -10 10])
for k = 1:size(state,1)
figure(1)
plot(x,y,'b'); hold on 
plot(state(k,[1 2]),func(state(k,[1 2])),'ro'); hold off
axis([-2 2 -4 4])
pause(0.4);
end


2.算法函数:

% goldenRatio 黄金分割法
%   - 优点:不要求函数可微,且每次迭代只需计算一个函数值,计算量小,程序简单
%   - 缺点:收敛速度慢
% Inputs:
%   - func  要计算的函数的函数句柄
%   - L > 0 精度
%   - a1    搜索区间下限
%   - b1    搜索区间上限
% Outputs:
%   - res     返回func(x)的最小值
%   - state   返回每次迭代的[a_k b_k lambda_k mu_k f1 f2] 

function [res,state] = goldenRatio(func,a1,b1,L)
%初始化
a_k = a1; 
b_k = b1;
lambda_k = a1 + 0.382*(b1 - a1);
mu_k = a1 + 0.618*(b1 - a1);
f1 = func(lambda_k);
f2 = func(mu_k);

count = 1;
while(true)
    %实际使用时可以去掉state和count,因为会影响运行速度
    state(count,:) = [a_k b_k lambda_k mu_k f1 f2]; 
    count = count + 1;

    if(b_k - a_k < L) break;end
    if(f1 > f2)
        a_k = lambda_k;
        %b_k = b_k; 
        lambda_k = mu_k;
        mu_k = a_k + 0.618*(b_k - a_k);
        f1 = f2;
        f2 = func(mu_k);
    else
        %a_k = a_k;
        b_k = mu_k;
        mu_k = lambda_k;
        lambda_k = a_k + 0.382*(b_k - a_k);
        f2 = f1;
        f1 = func(lambda_k);
    end
end
res = 0.5*(a_k + b_k);
end

3.搜索过程动图:
这里写图片描述
参考书目:《最优化理论与算法》陈宝林

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值