📄 linmin.m
字号:
function [pout,fout] = linmin(pin,xi,tol,f,varargin)% PURPOSE: line minimization routine that performs an ad hoc n-dimensional% Golden Section Search for the minimum of a function. % (Converted from Numerical Recipes book linmin routine) %---------------------------------------------------% USAGE: [pout,fout] = linmin(pin,x,tol,func,varargin)% where: pin = (kx1) vector of starting values% x = (kx1) direction vector% tol = tolerance% func = function name string% varargin = arguments passed to func%---------------------------------------------------% RETURNS: pout = (kx1) minimizing vector% fout = (kx1) value of func at minimum pout values%---------------------------------------------------% NOTE: func must take the form func(b,varargin)% where: b = parameter vector (k x 1)% varargin = arguments passed to the function %--------------------------------------------------- % SEE ALSO: dfp_min, pow_min, frpr_min functions that use this routine%---------------------------------------------------% written by:% James P. LeSage, Dept of Economics% University of Toledo% 2801 W. Bancroft St,% Toledo, OH 43606% jpl@jpl.econ.utoledo.edufunfcn = fcnchk(f,length(varargin));p1 = pin;d1 = 0.618;d2 = 0.382;p2 = pin + xi;xarg = p1;f1 = feval(funfcn,xarg,varargin{:});itry = 0; xarg = p2; f2 = feval(funfcn,xarg,varargin{:}); while (f1 == f2 ) itry = itry+1; p2 = p2 + xi; xarg = p2; f2 = feval(funfcn,xarg,varargin{:}); if itry == 10 error('problems in linmin --- itry is 10'); end;end; if f1 <= f2 pm = p1; fm = f1; f1 = f2; p1 = p2;else pm = p2; fm = f2;end;xd = pm - p1;p2 = pm + xd;xarg = p2;f2 = feval(funfcn,xarg,varargin{:});while (f2 <= fm) xd = 2*xd; p2 = pm + xd; xarg = p2; f2 = feval(funfcn,xarg,varargin{:});end;x1 = d1*p1 + d2*p2;x2 = d2*p1 + d1*p2;xarg = x1;fx1 = feval(funfcn,xarg,varargin{:});xarg = x2;fx2 = feval(funfcn,xarg,varargin{:});while (sqrt(sum(p1-p2).^2) >= tol) x1 = d1*p1 + d2*p2; x2 = d2*p1 + d1*p2; xarg = x1; fx1 = feval(funfcn,xarg,varargin{:}); xarg = x2; fx2 = feval(funfcn,xarg,varargin{:}); if (fx1 <= fx2) p2 = x2; else p1 = x1; end; end; if (fx1 < fx2) pout = x1;else pout = x2;end;xarg = pout; fout = feval(funfcn,xarg,varargin{:});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -