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