diff m-toolbox/test/utils/test_loglikehood_ssm_td.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/test/utils/test_loglikehood_ssm_td.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,335 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Test loglikehood_ssm_td
+% 
+% Test with an harmonic hoscillator and simplex parameters search
+% 
+% L Ferraioli 11-10-2010
+%
+% $Id: test_loglikehood_ssm_td.m,v 1.3 2010/11/26 13:52:32 luigi Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% set parameters
+
+m = 2; % kg
+k = 0.1; % kg s^-2
+damp = 0.05; % kg s^-1
+
+fAmp = 3;
+NAmp = 1;
+fs = 1;
+
+cutbefore = 100*fs;
+cutafter = 500*fs;
+
+f = logspace(-5+log10(fs),log10(fs/2),300);
+
+%% Load model
+
+sys = ssm(plist('built-in', 'HARMONIC_OSC_1D', 'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[m k damp]));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+pl = plist('inputs', 'COMMAND.Force', 'HARMONIC_OSC_1D.outputs', 'Position', 'f', f);
+h = bode(sys,pl);
+
+iplot(h)
+
+%% input force and readout noise
+
+% input force
+fc = ao(plist('waveform','sine wave','A',fAmp,'f',1e-1,'phi',0,'toff',cutbefore/fs,'nsecs',6e2,'fs',fs));
+in = zeropad(fc,plist('Position','post','N',cutafter));
+
+
+rn = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', in.nsecs));
+rn = rn.*NAmp;
+
+
+
+%% Simulate the system
+
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force','noise.readout'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in,rn]);
+out = simulate(sys,plsym);
+
+iplot(out,rn)
+
+
+
+
+%% Do chisquare parameter search
+
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'m', 'k', 'vbeta'};
+
+
+x0 = [1 1 1];
+x0 = [2.5 0.08 0.1];
+
+
+% loglk =
+% loglikehood_ssm_td(xp,in,out,parnames,model,inNames,outNames,varargin)
+
+xp2 = fminsearch(@(x)utils.math.chisquare_ssm_td(x,in,out,parnames,mod,inNames,outNames,'cutbefore',cutbefore,'cutafter',cutafter),x0,optimset('Display','iter'));
+
+
+
+%%
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',xp2));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+outfit2 = simulate(sys,plsym);
+
+iplot(out,outfit2)
+iplot(out-outfit2)
+iplot(out-outfit2-rn)
+
+% xp =
+% 
+%           2.22352087931512         0.588010809495998         0.195689637008003
+
+
+
+%% Do parameters search
+
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+inNoiseNames = {'noise.readout'};
+inNoise = rn;
+outNoiseNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'M', 'K', 'VBETA'};
+
+
+% x0 = xp2;
+x0 = [2.5 0.08 0.1];
+
+% loglk =
+% loglikehood_ssm_td(xp,in,out,parnames,model,inNames,outNames,varargin)
+
+
+
+xp = fminsearch(@(x)utils.math.loglikehood_ssm_td(x,in,out,parnames,mod,inNames,outNames,rn,'cutbefore',cutbefore,'cutafter',cutafter),x0,optimset('Display','iter'));
+
+
+
+%%
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',xp));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+outfit = simulate(sys,plsym);
+
+iplot(out,outfit)
+iplot(out-outfit)
+iplot(out-outfit-rn)
+
+
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% test covariace estimation
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'m', 'k', 'vbeta'};
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[m k damp]));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+modeout = simulate(sys,plsym);
+
+% get noise
+noise = out - modeout;
+nn = noise.y;
+% get covariance matrix
+cmat = utils.math.xCovmat(nn);
+cmatseq = cmat(1,:);
+
+% get covariance sequance
+[cseq,lags] = xcov(nn,'unbiased');
+cseq = ifftshift(cseq);
+lags=ifftshift(lags);
+cseqr = cseq(1:numel(cmatseq));
+lagsr = lags(1:numel(cmatseq));
+lagsr = lagsr.';
+
+% compare results
+figure
+plot(lagsr,cmatseq.','k')
+hold on
+plot(lagsr,cseqr,'r')
+
+figure
+plot(lagsr,cmatseq.'-cseqr,'k')
+
+[R,p] = chol(cmat);
+d = eig(cmat);
+% md = min(d);
+% cmat2 = cmat + abs(md).*eye(size(cmat));
+% [R,p] = chol(cmat2);
+
+ccmat = fliplr(flipud(cmat));
+[RR,pp] = chol(ccmat);
+
+%% correlation matrix
+
+[corr,sig] = utils.math.cov2corr(cmat);
+
+% test positive definiteness
+[R,p] = chol(corr);
+
+% get a valid correlation
+newcorr = validcorr(corr);
+
+%% 
+
+% get covariance sequance
+[cseq,lags] = xcov(nn,'unbiased');
+Num = numel(nn);
+for ii=1:Num
+  
+  ccmat(ii,:) = cseq(Num-ii+1:2*Num-ii);
+  
+end
+
+[R,p] = chol(ccmat);
+
+
+%% test the likelihood
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'m', 'k', 'vbeta'};
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[m k damp]));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+modeout1 = simulate(sys,plsym);
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[1 1 1]));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+modeout2 = simulate(sys,plsym);
+
+% xp = [1.1        0.6         0.01];
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',xp));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+modeout3 = simulate(sys,plsym);
+
+% xp2 = [2.22352087931512         0.588010809495998         0.195689637008003];
+
+sys = copy(mod,1);
+sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',xp2));
+sys.keepParameters();
+sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+  'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+  'AOS',[in]);
+modeout4 = simulate(sys,plsym);
+
+% get noise
+noise1 = out - modeout1; % true values
+noise2 = out - modeout2; % starting guess
+noise3 = out - modeout3; % fit values
+noise4 = out - modeout4; % chi2 fit values
+
+
+lik1 = utils.math.loglikehood_td(noise1,'cutbefore',cutbefore,'cutafter',cutafter)
+lik2 = utils.math.loglikehood_td(noise2,'cutbefore',cutbefore,'cutafter',cutafter)
+lik3 = utils.math.loglikehood_td(noise3,'cutbefore',cutbefore,'cutafter',cutafter)
+lik4 = utils.math.loglikehood_td(noise4,'cutbefore',cutbefore,'cutafter',cutafter)
+
+%% test a uniform grid
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'m', 'k', 'vbeta'};
+
+mm = [1.8:0.02:2.2];
+kc = [0.1:0.02:1];
+dd = [0.01:0.02:1];
+
+idx = 1;
+pars = struct;
+
+Ntot = numel(mm)*numel(kc)*numel(dd);
+
+lik = zeros(Ntot,1);
+%%
+
+for ii=1:numel(mm)
+  for jj=1:numel(kc)
+    for kk=1:numel(dd)
+      
+      fprintf('step %s of %s\n',num2str(idx),num2str(Ntot));
+      pars(idx).m = mm(ii);
+      pars(idx).k = kc(jj);
+      pars(idx).damp = dd(kk);
+      
+      sys = copy(mod,1);
+      sys = sys.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[mm(ii) kc(jj) dd(kk)]));
+      sys.keepParameters();
+      sys.modifyTimeStep(plist('newtimestep',1/fs));
+
+      plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force'},...
+        'RETURN OUTPUTS','HARMONIC_OSC_1D.position',...
+        'AOS',[in]);
+      modeout = simulate(sys,plsym);
+      
+      noise = out - modeout;
+      
+      lik(idx) = utils.math.loglikehood_td(noise,'cutbefore',cutbefore,'cutafter',cutafter);
+      
+      idx = idx +1;
+    end
+  end
+end
+