Mercurial > hg > ltpda
diff m-toolbox/test/test_matrix_linfitsvd_ssm.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_matrix_linfitsvd_ssm.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,112 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Test linfitsvd with ssm +% +% Test with an harmonic hoscillator +% +% L Ferraioli 11-10-2010 +% +% $Id: test_matrix_linfitsvd_ssm.m,v 1.1 2010/11/22 16:57:54 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; + +%% input force and readout noise +% prepare the inputs for 2 experiments + +% input force +fc1 = ao(plist('waveform','sine wave','A',fAmp,'f',1e-1,'phi',0,'toff',cutbefore/fs,'nsecs',6e2,'fs',fs)); +in1 = zeropad(fc1,plist('Position','post','N',cutafter)); +% input readout noise +rn1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', in.nsecs)); +rn1 = rn1.*NAmp; + +% input force +fc2 = ao(plist('waveform','sine wave','A',fAmp,'f',1e-2,'phi',0,'toff',cutbefore/fs,'nsecs',6e2,'fs',fs)); +in2 = zeropad(fc2,plist('Position','post','N',cutafter)); +% input readout noise +rn2 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', in.nsecs)); +rn2 = rn2.*NAmp; + +iplot(in1,in2) + +%% Simulate the system + +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)); + +plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force','noise.readout'},... + 'RETURN OUTPUTS','HARMONIC_OSC_1D.position',... + 'AOS',[in1,rn1]); +out1 = simulate(sys,plsym); + +plsym = plist('AOS VARIABLE NAMES',{'COMMAND.Force','noise.readout'},... + 'RETURN OUTPUTS','HARMONIC_OSC_1D.position',... + 'AOS',[in2,rn2]); +out2 = simulate(sys,plsym); + +iplot(out1,out2) + +%% set input data and run fit with ssm + +mod = ssm(plist('built-in', 'HARMONIC_OSC_1D', 'SYMBOLIC PARAMS',{'M', 'K', 'VBETA'})); +mod = mod.setParameters(plist('names',{'M', 'K', 'VBETA'},'values',[1.8 0.2 0.1])); + +FitParams = {'M', 'K', 'VBETA'}; +InputNames = {{'COMMAND.Force'},{'COMMAND.Force'}}; +OutputNames = {{'HARMONIC_OSC_1D.position'},{'HARMONIC_OSC_1D.position'}}; +Input = collection(in1,in2); + +o1 = matrix(out1); +o2 = matrix(out2); + +plfit = plist(... + 'FitParams',FitParams,... + 'Model',mod,... + 'Input',Input,... + 'InputNames',InputNames,... + 'OutputNames',OutputNames,... + 'WhiteningFilter',[],... + 'tol',1,... + 'Nloops',5,... % number of fit iterations + 'Ncut',cutbefore); % number of data points to skip at the starting of the series to avoid whitening filter transient + +pars = linfitsvd(o1,o2,plfit); + +%% build smodel + +symmod = smodel('1./(M.*((2.*i.*pi.*f).^2)+VBETA.*(2.*i.*pi.*f)+K)'); +symmod.setParams({'M','VBETA','K'},{1.8,0.2,0.1}); +symmod.setXvar('f'); +symmod.setYunits('kg^-1 s^-2'); +smod = matrix(symmod); + +%% set input and fit + +FitParams = {'M', 'K', 'VBETA'}; +Input = collection(matrix(in1),matrix(in2)); +o1 = matrix(out1); +o2 = matrix(out2); + +plfit = plist(... + 'FitParams',FitParams,... + 'Model',smod,... + 'Input',Input,... + 'WhiteningFilter',[],... + 'tol',1,... + 'Nloops',5,... % number of fit iterations + 'Ncut',cutbefore); % number of data points to skip at the starting of the series to avoid whitening filter transient + +pars = linfitsvd(o1,o2,plfit);