【MATLAB】黄金分割算法实现单变量函数最优值求解

用黄金分割算法求单变量函数f(x)在单峰区间[a,b]上的近似极小点

函数实现:

function [i,s,phis,ds,dphi,G] = golds(phi, a,b,epsilon, delta)
% 函数功能:黄金分割法精确线搜索
% 函数思想:通过试探点函数值的比较,使包含极小点的搜索区间不断缩小。
% 输入参数:phi:目标函数;a、b:搜索区间的两个端点;
%           epsilon:自变量的容许误差; delta:函数值的容许误差

% 输出结果:i:迭代次数;s:近似极小点;phis:极小值;
%           ds:近似极小点的误差限;dphi:极小值的误差限;
%           G:ix4矩阵,第i行分别是a、p、q、b的第i次迭代值[ai,pi,qi,bi].

t = (sqrt(5)-1)/2;  % 0.618,区间长度的缩短率
h = b - a;
phia = feval(phi,a); phib = feval(phi, b);
p = a + (1 - t) * h; q = a + t * h;
phip = feval(phi, p); phiq = feval(phi, q);
i = 1; G(i, :) = [a, p, q, b];
while(abs(phib - phia) > delta) || (h > epsilon)
    if(phip <= phiq)
        b = q;phib = phiq; q = p; phiq = phip;
        h = b - a; p = a + (1 - t) * h; phip = feval(phi, p);
    else
        a = p; phia = phip; p = q; phip = phiq;
        h = b - a; q = a + t * h; phiq = feval(phi, q);
    end
    
    i = i + 1; G(i, :) = [a, p, q, b];
end
if(phip <= phiq)
    s = p; phis = phip;
else
    s = q; phis = phiq;
end
ds = abs(b - a); dphi = abs(phib - phia);

求解函数:

% 黄金分割法测试函数
fx = @(x)-x*exp(-x);  % 测试函数,可以更改为其他函数
[i,x,f,ds,dphi,G] = golds(fx, -10,10,1e-4, 1e-5) % 确定参数,详见函数注释部分
% 工具箱函数
[x,fval] = fminbnd(fx,-10,10)

利用自定义函数golds和工具箱函数的结果是完全一致的~

发布了96 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Thera_qing/article/details/103322182