Home > . > numgrad.m

numgrad

PURPOSE ^

function [g badg] = numgrad(fcn,xvarargin)

SYNOPSIS ^

function [g, badg] = numgrad(fcn,x,varargin)

DESCRIPTION ^

 function [g badg] = numgrad(fcn,xvarargin)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

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

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003