简介
参考《最优化方法及其Matlab设计》
code
function [s, phis, k, G, E] = golds(phi,a,b,delta, eps)
% ---input
% phi 所求的目标函数
% a 区间的下界
% b 区间的上界
% delta 自变量容许误差
% eps 函数值的容许误差
% ---output
% s 近似极小点
% phis 极小值
% G nx4矩阵 其中第k行分别是a, p, q, b的第k次迭代值[ak,pk,qk,bk]
% E = [ds, dphi], 分别是s和phis 的误差限
%
t = (sqrt(5) - 1) / 2; h = b - a;
phia = feval(phi, a);% feval 将想要执行的函数和参数传入,然后返回执行的值
phib = feval(phi, b);
p = a+(1-t)*h; q=a+t*h;
phip=feval(phi, p); phiq = feval(phi, q);
k=1; G(k,:)=[a, p, q, b];
while(abs(phib-phia) > eps) | (h > delta)
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
k=k+1; G(k,:)=[a, p, q, b];
end
ds=abs(b-a); dphi=abs(phib-phia);
if(phip <= phiq)
s=p; phis=phip;
else
s=q; phis=phip;
end
E=[ds, dphi];
测试结果
[s, phis, k, G, E]=golds(inline('s^2-sin(s)'), 0, 1, 1e-4, 1e-5)
s = 0.4502 // 近似极小值