function [x,minf] = minGS(f,XMAX,sigma1,sigma2,alpha,eps)
%目標函數:f;
%搜索最大值:XMAX;
%可接受系數 1:sigma1;
%可接受系數 2:sigma2;
%增大探索點系數:alpha
%精度:eps;
%目標函數取最小值時的自變量值:x;
%目標函數的最小值:minf
format long;
if nargin == 5 eps = 1.0e-6;
endif sigma1<=0 || sigma1>1 %輸入參數檢測disp('sigma1 參數不對!'); x = NaN; minf = NaN; return;
else if sigma2 <= sigma1 disp('sigma2 參數不對!'); x = NaN; minf = NaN; return; else if alpha <= 1 disp('alpha 參數不對!'); x = NaN; minf = NaN; return; end end
end df = diff(f); %一階導數
f0 = subs(f, findsym(f),0);
df0 = subs(df, findsym(df),0);
a = 0;
b = XMAX;
k = 0;
t = (a+b)/2; %初始探測點while 1 ft = subs(f,findsym(f),t); %探測點的函數值f1 = f0 + sigma1*t*df0; %可接受函數值上限if ft <= f1 f2 = f0 + sigma2*t*df0; %可接受函數值下限if ft >= f2 x = t; break; else a = t; %更新極值點所在區間的左端點if b < XMAX t = (a+b)/2; %更新探測點else t = alpha*t; end end else b = t; %更新極值點所在區間的右端點t = (a+b)/2; end k = k+1;
end
minf = subs(f,findsym(f),x);
format short;
運行方法如下: >> syms t; >>> f = t^2-2*t+7; >>> x = minGS(f, 8, 0.4,0.75,2) 然后運行即可.