srchbre_snn.m
来自「神经网络的工具箱, 神经网络的工具箱,」· M 代码 · 共 220 行
M
220 行
function [xmin,fmin] = srchbre_snn(func, x1, x2, varargin);%SRCHBRE_SNN Brent's linear search algorithm (Brent's method).%% Syntax%% [x_min,f_min] = srchbre_snn(func, x1, x2, varargin);%% Description%% SRCHBRE_SNN finds the minimum of the function func(x, varargin) % with respect to lambda on the line x = x1 + lambda*x2.%% SRCBRE_SNN(func, x1, x2, varargin) takes% func - name of the function% x1 - double array% x2 - double array% varargin - additional arguments voor func. % and returns% x_min - x which minimizes func(x, varargin)% f_min - func(x_min, varargin)%tol = 1e-7;[ax,bx,cx,dummy,fb] = mnbrak(func,x1,x2,0.01,1,varargin{:});ITMAX = 100;CGOLD = 0.3819660;a = min(ax,cx);b = max(ax,cx);x = bx;w = bx;v = bx;fx = fb;fw = fb;fv = fb;e = 0;iter = 0;klaar = 0;while (~klaar & iter < ITMAX), iter = iter+1; xm = (a+b)/2; tol1 = tol*abs(x)+1e-10; tol2 = 2*tol1; if (abs(x-xm) <= (tol2 - (b-a)/2)), xmin = x; fmin = fx; klaar = 1; end d = []; %onzin, to make mcc happy if (~klaar), if (abs(e) > tol1), r = (x-w)*(fx-fv); q = (x-v)*(fx-fw); p = (x-v)*q-(x-w)*r; q = 2*(q-r); if (q > 0), r = -r; end q = abs(q); etemp = e; e = d; if (abs(p) >= abs(0.5*q*etemp) | p <= q*(a-x) | p >= q*(b-x)), if (x >= xm), e = a-x; else e = b-x; end d = CGOLD*e; else d = p/q; u = x+d; if (u-a < tol2 | b-u < tol2), d = sign(xm-x)*tol1; end end else if (x >= xm), e = a-x; else e = b-x; end d = CGOLD*e; end if (abs(d) >= tol1), u = x+d; else u = x + sign(d)*tol1; end%#function wcf_snn fu = feval(func,x1+u*x2,varargin{:}); if (fu <= fx), if (u >= x), a = x; else b = x; end v = w; w = x; x = u; fv = fw; fw = fx; fx = fu; else if (u < x), a = u; else b = u; end if (fu <= fw | w == x), v = w; w = u; fv = fw; fw = fu; elseif (fu <= fv | v == x | v == w), v = u; fv = fu; end end endendif (~klaar), disp('WATCH OUT: not sufficient number of iterations'); xmin = x; fmin = fx;endxmin = x1+xmin*x2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [ax,bx,cx,fa,fb,fc] = mnbrak(func,x1,x2,ax,bx,varargin);% MNBRAK searches values [ax,bx,cx] such that% func(x1 + ax*x2) > func(x1 + bx*x2) and func(x1 + cx*x2) > func(x1 + bx*x2)% where either ax < bx < cx or ax > bx > cx.given = 0;if (nargin >= 2), if (length(x1)), given = 1; endendif (~given), x1 = 0;endgiven = 0;if (nargin >= 3), if (length(x2)), given = 1; endendif (~given), x2 = ones(size(x1));endgiven = 0;if (nargin >= 4), if (length(ax)), given = 1; endendif (~given), ax = 0;endgiven = 0;if (nargin >= 5), if (length(bx)), given = 1; endendif (~given), bx = 1; if (bx == ax), bx = 2; endendGOLD = 1.618034;GLIM = 100;fa = feval(func,x1+ax*x2,varargin{:});fb = feval(func,x1+bx*x2,varargin{:});if (fb > fa), % wissel ax en bx dummy = [ax,bx]; ax = dummy(2); bx = dummy(1); dummy = [fa,fb]; fa = dummy(2); fb = dummy(1);endcx = bx + GOLD*(bx-ax);fc = feval(func,x1+cx*x2,varargin{:});klaar = 0;while (fb > fc & ~klaar), r = (bx-ax)*(fb-fc); q = (bx-cx)*(fb-fa); u = (bx - (bx-cx)*q - (bx-ax)*r)/(2*sign(q-r)*max(abs(q-r),1e-20)); % parabolische schatting minimum ulim = bx + GLIM*(cx-bx); if ((bx-u)*(u-cx) > 0), % schatting tussen bx en cx fu = feval(func,x1+u*x2,varargin{:}); if (fu < fc), % inderdaad een minimum tussen bx en cx ax = bx; bx = u; fa = fb; fb = fu; klaar = 1; elseif (fu > fb), % minimum tussen ax en u cx = u; fc = fu; klaar = 1; else % geen minimum gevonden u = cx + GOLD*(cx-bx); fu = feval(func,x1+u*x2,varargin{:}); end elseif ((cx-u)*(u-ulim) > 0), % schatting tussen cx en ulim fu = feval(func,x1+u*x2,varargin{:}); if (fu < fc), bx = cx; cx = u; u = cx + GOLD*(cx-bx); fb = fc; fc = fu; fu = feval(func,x1+u*x2,varargin{:}); end elseif ((u-ulim)*(ulim-cx) >= 0) % schatting groter dan ulim u = ulim; fu = feval(func,x1+u*x2,varargin{:}); else % allemaal hopeloos u = cx + GOLD*(cx-bx); fu = feval(func,x1+u*x2,varargin{:}); end if (~klaar), ax = bx; bx = cx; cx = u; fa = fb; fb = fc; fc = fu; endend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?