function [g badg] = numgrad(fcn,xvarargin)
0001 function [g, badg] = numgrad(fcn,x,varargin) 0002 % function [g badg] = numgrad(fcn,xvarargin) 0003 % 0004 delta = 1e-6; 0005 %delta=1e-2; 0006 n=length(x); 0007 tvec=delta*eye(n); 0008 g=zeros(n,1); 0009 %--------------------old way to deal with variable # of P's-------------- 0010 %tailstr = ')'; 0011 %stailstr = []; 0012 %for i=nargin-2:-1:1 0013 % tailstr=[ ',P' num2str(i) tailstr]; 0014 % stailstr=[' P' num2str(i) stailstr]; 0015 %end 0016 %f0 = eval([fcn '(x' tailstr]); % Is there a way not to do this? 0017 %---------------------------------------------------------------^yes 0018 f0 = eval([fcn '(x,varargin{:})']); 0019 % disp(' first fcn in numgrad.m ------------------') 0020 %home 0021 % disp('numgrad.m is working. ----') % Jiinil on 9/5/95 0022 % sizex=size(x),sizetvec=size(tvec),x, % Jinill on 9/6/95 0023 badg=0; 0024 for i=1:n 0025 scale=1; % originally 1 0026 % i,tveci=tvec(:,i)% ,plus=x+scale*tvec(:,i) % Jinill Kim on 9/6/95 0027 if size(x,1)>size(x,2) 0028 tvecv=tvec(i,:); 0029 else 0030 tvecv=tvec(:,i); 0031 end 0032 g0 = (eval([fcn '(x+scale*tvecv'', varargin{:})']) - f0) ... 0033 /(scale*delta); 0034 % disp(' fcn in the i=1:n loop of numgrad.m ------------------')% Jinill 9/6/95 0035 % disp(' and i is') % Jinill 0036 % i % Jinill 0037 % fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see below Jinill 9/6/95 0038 % -------------------------- special code to essentially quit here 0039 % absg0=abs(g0) % Jinill on 9/6/95 0040 if abs(g0)< 1e15 0041 g(i)=g0; 0042 % disp('good gradient') % Jinill Kim 0043 else 0044 disp('bad gradient ------------------------') % Jinill Kim 0045 % fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see above 0046 g(i)=0; 0047 badg=1; 0048 % return 0049 % can return here to save time if the gradient will never be 0050 % used when badg returns as true. 0051 end 0052 end 0053 %------------------------------------------------------------- 0054 % if g0 > 0 0055 % sided=2; 0056 % g1 = -(eval([fcn '(x-scale*tvec(:,i)''' tailstr]) - f0) ... 0057 % /(scale*delta); 0058 % if g1<0 0059 % scale = scale/10; 0060 % else 0061 % break 0062 % end 0063 % else 0064 % sided=1; 0065 % break 0066 % end 0067 % end 0068 % if sided==1 0069 % g(i)=g0; 0070 % else 0071 % if (g0<1e20) 0072 % if (g1>-1e20) 0073 % g(i)=(g0+g1)/2; 0074 % else 0075 % g(i)=0; 0076 % badg=1; 0077 % disp( ['Banging against wall, parameter ' int2str(i)] ); 0078 % end 0079 % else 0080 % if g1>-1e20 0081 % if g1<0 0082 % g(i)=0; 0083 % badg=1; 0084 % disp( ['Banging against wall, parameter ' int2str(i)] ); 0085 % else 0086 % g(i)=g1; 0087 % end 0088 % else 0089 % g(i)=0; 0090 % badg=1; 0091 % disp(['Valley around parameter ' int2str(i)]) 0092 % end 0093 % end 0094 % end 0095 %end 0096 %save g.dat g x f0 0097 %eval(['save g g x f0 ' stailstr]); 0098