⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepz.m

📁 计量工具箱
💻 M
字号:
function alpha=step(b,infoz,stat,varargin)% PURPOSE: Determine step size in NUMZ package%-----------------------------------------------------------------% USAGE: alpha=step(b,infoz,stat,varargin)%  Where%  b         vector of model parameters%  infoz     structure variable with settings for MINZ0%  stat      structure variable with minimization status%  varargin  Variable list of arguments passed to func%% RETURNS:   alpha     scalar step size%-----------------------------------------------------------------% REFERENCES:  Numerical Recipes in FORTRAN  (LNSRCH, p. 378)%-----------------------------------------------------------------% written by:% Mike Cliff,  UNC Finance  mcliff@unc.edu% CREATED:  1/24/99%=================================================================%  INITIALIZATIONS%=================================================================direc = stat.direc;alf=infoz.ftol;fold = stat.f;maxalpha = 10;alpha=1;tmpalpha=1;go=1;lvar = length(varargin);func = fcnchk(infoz.func,lvar);% I don't use this step from  Num. Recipes; it causes trouble%sumx = sqrt(direc'*direc)%if sumx > maxalpha%  direc = direc*maxalpha/sumx%endslope = stat.G'*direc;temp=abs(direc)./max(abs(b),1);temp=max(temp);test=max(temp,eps);         % Added to avoid /0 errorminalpha = infoz.btol/test;b0 = b;%=================================================================%  FIND MINIMIZING STEP SIZE%=================================================================while go == 1  b = b0 + alpha*direc;  if strcmp(infoz.call,'other'),  f = feval(func,b,varargin{:});  else,  f = feval(func,b,infoz,stat,varargin{:});  end;  if alpha < minalpha    b = b0;    go = 0;    alpha = 0;  elseif f < fold + alpha*slope*alf    go = 0;  else    if alpha == 1      tmpalpha = -slope/(2*(f-fold-slope));    else      rhs1 = f - fold - alpha*slope;      rhs2 = f2 - fold2 - alpha2*slope;      a = (rhs1/alpha^2 - rhs2/alpha2^2)/(alpha-alpha2);      b = (-alpha2*rhs1/alpha^2 + alpha*rhs2/alpha2^2)/(alpha-alpha2);      if a == 0        tmpalpha = -slope/(2*b);      else         disc = b^2 - 3*a*slope;        if disc < 0          disp('Round off problem in STEP');           disc = 0;        end        tmpalpha = (-b+sqrt(disc))/(3*a);      end      if tmpalpha > .5*alpha, tmpalpha = .5*alpha; end    end  end  alpha2 = alpha;  f2 = f;  fold2 = fold;  if go ~= 0, alpha = max(tmpalpha,.1*alpha); endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -