diff m-toolbox/test/test_ao_mcmc_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/test_ao_mcmc_td.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,162 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Test loglikehood_ssm_td
+% 
+% Test with an harmonic hoscillator and simplex parameters search
+% 
+% L Ferraioli 11-10-2010
+%
+% $Id: test_ao_mcmc_td.m,v 1.1 2010/11/26 13:52:21 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)
+
+
+%% test parameters search with simplex only
+
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+inNoise = rn;
+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,inNoise,'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)
+
+%% Optimal covariance (taken from smodel)
+
+smod = smodel('1./(M.*((2.*i.*pi.*f).^2)+VBETA.*(2.*i.*pi.*f)+K)');
+smod.setParams({'M','VBETA','K'},{m,k,damp});
+%smod.setParams({'M','VBETA','K'},{2.5, 0.08, 0.1});
+smod.setXvar('f');
+smod.setXvals(f);
+smod.setYunits('kg^-1 s^-2');
+
+% get derivatives
+dsmod_M = diff(smod,plist('var','M'));
+dsmod_K = diff(smod,plist('var','K'));
+dsmod_VBETA = diff(smod,plist('var','VBETA'));
+
+% eval first order term
+eM = fftfilt(in,dsmod_M);
+eK = fftfilt(in,dsmod_K);
+eVBETA = fftfilt(in,dsmod_VBETA);
+
+% information matrix
+bm = [eM.y eK.y eVBETA.y];
+Im = bm'*bm;
+
+% covariance matrix
+Cm = inv(Im);
+
+%% test mcmc_td
+
+mod = ssm(plist('built-in', 'HARMONIC_OSC_1D',...
+  'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'}));
+inNames = {'COMMAND.Force'};
+outNames = {'HARMONIC_OSC_1D.position'};
+inNoise = rn;
+outNoiseNames = {'HARMONIC_OSC_1D.position'};
+parnames = {'M', 'K', 'VBETA'};
+
+% c = (1/sqrt(9))^2;
+c=0.8;
+
+ranges = {[1 3],[0 2],[0 1]};
+
+x0 = [2.5 0.08 0.1];
+
+
+
+pl = plist('N',6000,...
+  'Input',in,...
+  'cov',c*Cm,... 
+  'range',ranges,...
+  'parnames',parnames,...
+  'noise',inNoise,...
+  'model',mod,...
+  'inNames',inNames,...
+  'outNames',outNames,...
+  'search',true,...
+  'Tc',[2000 4000],...
+  'heat',4,...
+  'jumps',[2e0 1e2 1e3 1e4],...
+  'x0',x0,...
+  'simplex',true,...
+  'plot',[1 2 3],...
+  'debug',true);
+
+%  metropolis(measurement,noise,model,plist)
+b = mcmc_td(out,pl);
+% save(b,'stoc6_mcmc_all_9p_23061300_ssm.mat');
+
+