function [x,%check]=solve(func,x,varargin) %check=[]; // Copyright (C) 2001 Michel Juillard // nn = size(x,1); fjac = zeros(nn,nn); g = zeros(nn,1); tolf = %eps^(2/3); tolmin = .000000000037; tolx = .000000000037; stpmx = 100; maxit = 2000; %check = 0; if argn(2) > 2 fvec = evstr(func+'(x,varargin)'); else fvec = evstr(func+'(x)'); end f = .5*fvec'*fvec; if max(abs(fvec))<.01*tolf then return end stpmax = stpmx*max([abs(sqrt(x'*x));nn]); if argn(2) > 2 func_call = func+'(xdh,varargin)'; else func_call = func+'(xdh)'; end for its = 1:maxit dh = max(abs(x),gstep_*ones(nn,1))*(%eps^(1/3)); for j = 1:nn xdh = x; xdh(j) = xdh(j)+dh(j); fjac(:,j) = (evstr(func_call)-fvec) ./ dh(j); g(j) = fvec'*fjac(:,j); end if debug_ then cond(fjac); end p = -fjac\fvec; xold = x; fold = f; if argn(2) > 2 [x,f,fvec,%check] = lnsrch(xold,fold,g,p,stpmax,func,varargin); else [x,f,fvec,%check] = lnsrch(xold,fold,g,p,stpmax,func); end if %check>0 then den = max([f;.5*nn]); if max(abs(g) .* max([abs(x');ones(1,nn)])')/den