0.618法 求 最优化极小值

简介

参考《最优化方法及其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 // 近似极小值
Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
原文地址:https://www.cnblogs.com/eat-too-much/p/12027915.html