99 lines
2.7 KiB
Matlab
99 lines
2.7 KiB
Matlab
|
function [g, badg] = numgrad(fcn,x,varargin)
|
||
|
% function [g badg] = numgrad(fcn,xvarargin)
|
||
|
%
|
||
|
delta = 1e-6;
|
||
|
%delta=1e-2;
|
||
|
n=length(x);
|
||
|
tvec=delta*eye(n);
|
||
|
g=zeros(n,1);
|
||
|
%--------------------old way to deal with variable # of P's--------------
|
||
|
%tailstr = ')';
|
||
|
%stailstr = [];
|
||
|
%for i=nargin-2:-1:1
|
||
|
% tailstr=[ ',P' num2str(i) tailstr];
|
||
|
% stailstr=[' P' num2str(i) stailstr];
|
||
|
%end
|
||
|
%f0 = eval([fcn '(x' tailstr]); % Is there a way not to do this?
|
||
|
%---------------------------------------------------------------^yes
|
||
|
f0 = eval([fcn '(x,varargin{:})']);
|
||
|
% disp(' first fcn in numgrad.m ------------------')
|
||
|
%home
|
||
|
% disp('numgrad.m is working. ----') % Jiinil on 9/5/95
|
||
|
% sizex=size(x),sizetvec=size(tvec),x, % Jinill on 9/6/95
|
||
|
badg=0;
|
||
|
for i=1:n
|
||
|
scale=1; % originally 1
|
||
|
% i,tveci=tvec(:,i)% ,plus=x+scale*tvec(:,i) % Jinill Kim on 9/6/95
|
||
|
if size(x,1)>size(x,2)
|
||
|
tvecv=tvec(i,:);
|
||
|
else
|
||
|
tvecv=tvec(:,i);
|
||
|
end
|
||
|
g0 = (eval([fcn '(x+scale*tvecv'', varargin{:})']) - f0) ...
|
||
|
/(scale*delta);
|
||
|
% disp(' fcn in the i=1:n loop of numgrad.m ------------------')% Jinill 9/6/95
|
||
|
% disp(' and i is') % Jinill
|
||
|
% i % Jinill
|
||
|
% fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see below Jinill 9/6/95
|
||
|
% -------------------------- special code to essentially quit here
|
||
|
% absg0=abs(g0) % Jinill on 9/6/95
|
||
|
if abs(g0)< 1e15
|
||
|
g(i)=g0;
|
||
|
% disp('good gradient') % Jinill Kim
|
||
|
else
|
||
|
disp('bad gradient ------------------------') % Jinill Kim
|
||
|
% fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see above
|
||
|
g(i)=0;
|
||
|
badg=1;
|
||
|
% return
|
||
|
% can return here to save time if the gradient will never be
|
||
|
% used when badg returns as true.
|
||
|
end
|
||
|
end
|
||
|
%-------------------------------------------------------------
|
||
|
% if g0 > 0
|
||
|
% sided=2;
|
||
|
% g1 = -(eval([fcn '(x-scale*tvec(:,i)''' tailstr]) - f0) ...
|
||
|
% /(scale*delta);
|
||
|
% if g1<0
|
||
|
% scale = scale/10;
|
||
|
% else
|
||
|
% break
|
||
|
% end
|
||
|
% else
|
||
|
% sided=1;
|
||
|
% break
|
||
|
% end
|
||
|
% end
|
||
|
% if sided==1
|
||
|
% g(i)=g0;
|
||
|
% else
|
||
|
% if (g0<1e20)
|
||
|
% if (g1>-1e20)
|
||
|
% g(i)=(g0+g1)/2;
|
||
|
% else
|
||
|
% g(i)=0;
|
||
|
% badg=1;
|
||
|
% disp( ['Banging against wall, parameter ' int2str(i)] );
|
||
|
% end
|
||
|
% else
|
||
|
% if g1>-1e20
|
||
|
% if g1<0
|
||
|
% g(i)=0;
|
||
|
% badg=1;
|
||
|
% disp( ['Banging against wall, parameter ' int2str(i)] );
|
||
|
% else
|
||
|
% g(i)=g1;
|
||
|
% end
|
||
|
% else
|
||
|
% g(i)=0;
|
||
|
% badg=1;
|
||
|
% disp(['Valley around parameter ' int2str(i)])
|
||
|
% end
|
||
|
% end
|
||
|
% end
|
||
|
%end
|
||
|
%save g.dat g x f0
|
||
|
%eval(['save g g x f0 ' stailstr]);
|
||
|
|