用黄金分割算法求单变量函数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
和工具箱函数的结果是完全一致的~