diff m-toolbox/test/test_ao_xfit.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_xfit.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,167 @@
+% Tests for xfit
+%
+% $Id: test_ao_xfit.m,v 1.7 2011/05/12 07:58:57 mauro Exp $
+%
+
+%% Case 1: Fit with function in plist
+% Fit to a frequency-series
+
+% Create a frequency-series
+datapl = plist('fsfcn', '0.01./(0.0001+f) + 5*abs(randn(size(f))) ', 'f1', 1e-5, 'f2', 5, 'nf', 1000, ...
+  'xunits', 'Hz', 'yunits', 'N/Hz');
+data = ao(datapl);
+data.setName;
+
+% Do fit
+fitpl = plist('Function', 'P(1)./(P(2) + Xdata) + P(3)', ...
+  'P0', [0.1 0.01 1]);
+params = xfit(data, fitpl);
+
+% Evaluate model
+BestModel = eval(params, plist('type','fsdata','xdata',data,'xfield','x'));
+BestModel.setName;
+
+% Display results
+iplot(data,BestModel)
+
+%% Case 2: Fit with function in plist
+
+% Create a noisy sine-wave
+fs    = 10;
+nsecs = 500;
+datapl = plist('waveform', 'Sine wave', 'f', 0.01, 'A', 0.6, 'fs', fs, 'nsecs', nsecs, ...
+  'xunits', 's', 'yunits', 'm');
+sw = ao(datapl);
+noise = ao(plist('tsfcn', '0.01*randn(size(t))', 'fs', fs, 'nsecs', nsecs));
+data = sw+noise;
+data.setName;
+
+% Do fit
+fitpl = plist('Function', 'P(1).*sin(2*pi*P(2).*Xdata + P(3))', ...
+  'P0', [1 0.01 0]);
+params = xfit(data, fitpl);
+
+% Evaluate model
+BestModel = eval(params, plist('type','tsdata','xdata',data,'xfield','x'));
+BestModel.setName;
+
+% Display results
+iplot(data,BestModel)
+
+%% Case 3: Fit with smodel
+
+% Fit an smodel of a straight line to some data
+
+% Create a noisy straight-line
+datapl = plist('xyfcn', '2.33 + 0.1*x + 0.01*randn(size(x))', 'x', 0:0.1:10, ...
+  'xunits', 's', 'yunits', 'm');
+data = ao(datapl);
+data.setName;
+
+% Model to fit
+mdl = smodel('a + b*x');
+mdl.setXvar('x');
+mdl.setParams({'a', 'b'}, {1 2});
+
+% Fit model
+fitpl = plist('Function', mdl, 'P0', [1 1]);
+params = xfit(data, fitpl);
+
+% Evaluate model
+BestModel = eval(params,plist('xdata',data,'xfield','x'));
+BestModel.setName;
+
+% Display results
+iplot(data,BestModel)
+
+%% Case 4: Fit with smodel:
+% Fit a chirp-sine firstly starting from an initial guess (quite close
+% to the true values) (bad convergency) and secondly by a Monte Carlo
+% search (good convergency)
+
+% Create a noisy chirp-sine
+fs    = 10;
+nsecs = 1000;
+
+% Model to fit and generate signal
+mdl = smodel(plist('name', 'chirp', 'expression', 'A.*sin(2*pi*(f + f0.*t).*t + p)', ...
+  'params', {'A','f','f0','p'}, 'xvar', 't', 'xunits', 's', 'yunits', 'm'));
+
+% signal
+s = mdl.setValues({10,1e-4,1e-5,0.3});
+s.setXvals(0:1/fs:nsecs-1/fs);
+signal = s.eval;
+signal.setName;
+
+% noise
+noise = ao(plist('tsfcn', '1*randn(size(t))', 'fs', fs, 'nsecs', nsecs));
+
+% data
+data = signal + noise;
+data.setName;
+
+% Fit model from the starting guess
+fitpl_ig = plist('Function', mdl, 'P0',[8,9e-5,9e-6,0]);
+params_ig = xfit(data, fitpl_ig);
+
+% Evaluate model
+BestModel_ig = eval(params_ig,plist('xdata',data,'xfield','x'));
+BestModel_ig.setName;
+
+% Display results
+iplot(data,BestModel_ig)
+
+% Fit model by a Monte Carlo search
+fitpl_mc = plist('Function', mdl, ...
+  'MonteCarlo', 'yes', 'Npoints', 1000, 'LB', [8,9e-5,9e-6,0], 'UB', [11,3e-4,2e-5,2*pi]);
+params_mc = xfit(data, fitpl_mc);
+
+% Evaluate model
+BestModel_mc = eval(params_mc,plist('xdata',data,'xfield','x'));
+BestModel_mc.setName;
+
+% Display results
+iplot(data,BestModel_mc)
+
+%% Case 5: Fit multichannel with smodel
+
+% Ch.1 data
+datapl = plist('xyfcn', '0.1*x + 0.01*randn(size(x))', 'x', 0:0.1:10, 'name', 'channel 1', ...
+  'xunits', 'K', 'yunits', 'Pa');
+a1 = ao(datapl);
+% Ch.2 data
+datapl = plist('xyfcn', '2.5*x + 0.1*sin(2*pi*x) + 0.01*randn(size(x))', 'x', 0:0.1:10, 'name', 'channel 2', ...
+  'xunits', 'K', 'yunits', 'T');
+a2 = ao(datapl);
+
+% Model to fit
+mdl1 = smodel('a*x');
+mdl1.setXvar('x');
+mdl1.setParams({'a'}, {1});
+mdl1.setXunits('K');
+mdl1.setYunits('Pa');
+
+mdl2 = smodel('b*x + a*sin(2*pi*x)');
+mdl2.setXvar('x');
+mdl2.setParams({'a','b'}, {1,2});
+mdl2.setXunits('K');
+mdl2.setYunits('T');
+
+% Fit model
+params = xfit(a1,a2, plist('Function', [mdl1,mdl2]));
+
+% evaluate model
+b = eval(params, plist('index',1,'xdata',a1,'xfield','x'));
+b.setName('fit Ch.1');
+r = a1-b;
+r.setName('residuals');
+iplot(a1,b,r)
+
+b = eval(params, plist('index',2,'xdata',a2,'xfield','x'));
+b.setName('fit Ch.2');
+r = a2-b;
+r.setName('residuals');
+iplot(a2,b,r)
+
+
+