view m-toolbox/classes/+utils/@math/getjacobian.m @ 14:6d43f39633b8
database-connection-manager
Remove unused functions from utils.jmysql
author
Daniele Nicolodi <nicolodi@science.unitn.it>
date
Mon, 05 Dec 2011 16:20:06 +0100 (2011-12-05)
parents
f0afece42f48
children
line source
+ − % GETJACOBIAN Calculate Jacobian of a given model function.
+ − %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ − %
+ − % DESCRIPTION
+ − %
+ − % Calculate Jacobian of a given model function for the given set of
+ − % coefficients. Jacobian is approximated with finite difference method.
+ − %
+ − % CALL:
+ − %
+ − % J = getjacobian(coeff,model,X)
+ − %
+ − % INPUT:
+ − %
+ − % J - fit coefficients
+ − % model - model function
+ − % X - x vactor (abscissa)
+ − %
+ − %
+ − % OUTPUT:
+ − %
+ − % J - Jacobian
+ − %
+ − % Note: Look at nlinfit.m of the stats toolbox. Model should be a matlab
+ − % function calculating Model values as a function of X and of coefficients
+ − % NOTE: The function prefer to work with column objects. Therefore it is
+ − % good practise to directly input coeff and X as column objects
+ − %
+ − % Examples:
+ − %
+ − % Use @ to specify MODELFUN:
+ − % load reaction;
+ − % J = getjacobian(coeff,@mymodel,X);
+ − %
+ − % where MYMODEL is a MATLAB function such as:
+ − % function yhat = mymodel(beta, X)
+ − % yhat = (beta(1)*X(:,2) - X(:,3)/beta(5)) ./ ...
+ − % (1+beta(2)*X(:,1)+beta(3)*X(:,2)+beta(4)*X(:,3));
+ − % or
+ − %
+ − % mymodel = @(beta,X)(beta(1).*X(:,1)+beta(2).*X(:,2)+...)
+ − %
+ − %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ − % VERSION: $Id: getjacobian.m,v 1.1 2009/03/26 16:26:05 luigi Exp $
+ − %
+ − % HISTORY: 26-03-2009 L Ferraioli
+ − % Creation
+ − %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ −
+ − function J = getjacobian(coeff,model,X)
+ − % checking size, willing to work with columns
+ − [a,b] = size(coeff);
+ − if a<b
+ − coeff = coeff.';
+ − end
+ − [a,b] = size(X);
+ − if a<b
+ − X = X.';
+ − end
+ −
+ − % finite difference relative step
+ − fdiffstep = eps^(1/3);
+ − % evaluate model on the input coefficients
+ − yfit = model(coeff,X);
+ − % check for NaNs
+ − nans = isnan(yfit(:));
+ −
+ − % initialization
+ − p = numel(coeff);
+ − delta = zeros(size(coeff));
+ − J = zeros(numel(yfit),p);
+ − for k = 1:p
+ − if (coeff(k) == 0)
+ − nb = sqrt(norm(coeff));
+ − delta(k) = fdiffstep * (nb + (nb==0));
+ − else
+ − delta(k) = fdiffstep*coeff(k);
+ − end
+ − yplus = model(coeff+delta,X);
+ − dy = yplus(:) - yfit(:);
+ − dy(nans) = [];
+ − J(:,k) = dy/delta(k);
+ − delta(k) = 0;
+ − end
+ − end