Mercurial > hg > ltpda
diff m-toolbox/test/test_ao_bilinfit.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_bilinfit.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,208 @@ +% Test ao/bilinfit for: +% - functionality +% - against lscov +% +% M Hueller and D Nicolodi 07-01-10 +% +% $Id: test_ao_bilinfit.m,v 1.5 2010/05/07 14:04:42 nicolodi Exp $ +% +function test_ao_bilinfit() + + + %% test bilinfit vs lscov + disp(' ************** '); + disp('Example with combination of noise terms'); + disp(' '); + fs = 10; + nsecs = 10; + x1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'T')); + x2 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'T')); + n = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'm')); + c = [ao(1,plist('yunits','m/T')) ao(2,plist('yunits','m/T'))]; + y = c(1)*x1 + c(2)*x2 + n; + y.simplifyYunits; + + % Get a fit for c, using lscov (no constant term) + disp('Using ao/lscov, no constant term'); + disp(' '); + p_lscov = lscov(x1, x2, y); + disp(' '); + p_lscov.y + disp(' '); + + % do linear combination + yfit_lscov = lincom(x1, x2, p_lscov); + + % Get a fit for c, using bilinfit + disp('Using ao/bilinfit'); + disp(' '); + p_b = bilinfit(x1, x2, y); + disp(' '); + p_b.y + disp(' '); + disp(' ************** '); + + % do linear combination: use direct sum + yfit_b1 = simplifyYunits(x1 * find(p_b, 'P1') + x2 * find(p_b, 'P2') + find(p_b, 'P3')); + % do linear combination: use eval + yfit_b2 = p_b.eval(plist('Xdata', {x1, x2})); + + % Plot (compare data with fit) + iplot(y, yfit_lscov, yfit_b1, yfit_b2, plist('Linestyles', {'all','-'})) + + %% test with uncertainties + fprintf('\n\n\n'); + + fs = 1; + nsecs = 50; + x1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'C')); + x2 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'm')); + n = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'N')); + c = ao(plist('xvals', x1.x, 'yvals', ones(size(x1.y)), 'type', 'tsdata')); + b = [ao(1,plist('yunits','N/C')) ao(2,plist('yunits','N/m'))]; + y = b(1)*x1 + b(2)*x2 + n; + y.simplifyYunits(); + + p_m = lscov(x1, x2, c, y, plist('weights', ao(plist('vals', 1./(ones(size(x1.x))))))); + fprintf('AO LSCOV: Fit results: A = %f +/- %f, B = %f +/- %f, Y0 = %f +/- %f\n', ... + p_m.y(1), p_m.dy(1)./sqrt(find(p_m.procinfo, 'mse')), ... + p_m.y(2), p_m.dy(2)./sqrt(find(p_m.procinfo, 'mse')), ... + p_m.y(3), p_m.dy(3)./sqrt(find(p_m.procinfo, 'mse'))); + + % do linear combination: using linear combination + yfit1 = simplifyYunits(x1 * find(p_m, 'C1') + x2 * find(p_m, 'C2') + find(p_m, 'C3')); + + % do linear combination: using eval + yfit2 = p_m.eval(plist('Xdata',{x1, x2, c})); + + % Plot (compare data with fit) + iplot(y, yfit1, yfit2, plist('Linestyles', {'-','--'})) + + fprintf('UTN BILINFIT:\n'); + try + [p, perr] = bilinfit(y.y, x1.y, x2.y, ones(size(x1.x))); + catch err + disp(err.message); + disp('UTN method bilinfit.m for double not available'); + end + [x,stdx,mse] = lscov([c.y, x1.y, x2.y], y.y, 1./(ones(size(x1.x)))); + fprintf('M LSCOV: Fit results: A = %f +/- %f, B = %f +/- %f, Y0 = %f +/- %f\n', ... + x(2), stdx(2)*sqrt(1/mse), ... + x(3), stdx(3)*sqrt(1/mse), ... + x(1), stdx(1)*sqrt(1/mse)); + + p_b = bilinfit(x1, x2, y, plist('dy', ao(plist('vals', ones(size(x1.x)), 'yunits', 'N')))); + fprintf('BILINFIT: Fit results: A = %f +/- %f, B = %f +/- %f, Y0 = %f +/- %f\n', ... + p_b.y(1), p_b.dy(1), ... + p_b.y(2), p_b.dy(2), ... + p_b.y(3), p_b.dy(3)); + + %% very simple test + x1 = ao(plist('xvals', [1 2 3], 'yvals', [1 2 3])); + x2 = ao(plist('xvals', [1 2 3], 'yvals', [6 4 7])); + y = x1 + x2; + c = ao(plist('xvals', x1.x, 'yvals', ones(size(x1.y)), 'type', 'tsdata')); + + % Fit with UTN double/bilinfit + fprintf('UTN BILINFIT:\n'); + try + [p, perr] = bilinfit(y.y, x1.y, x2.y, ones(size(x1.x))); + catch err + disp(err.message); + disp('UTN method bilinfit.m for double not available'); + end + + % Fit with Matlab lscov + [x,stdx,mse] = lscov([c.y, x1.y, x2.y], y.y, 1./(ones(size(x1.x)))); + fprintf('M LSCOV: Fit results: A = %f +/- %f, B = %f +/- %f, Y0 = %f +/- %f\n', ... + x(2), stdx(2)*sqrt(1/mse), ... + x(3), stdx(3)*sqrt(1/mse), ... + x(1), stdx(1)*sqrt(1/mse)); + + % Fit with LTPDA ao/bilinfit + [x] = bilinfit(x1, x2, y, plist('dy', ao(plist('vals', ones(size(x1.x)))))); + fprintf('BILINFIT: Fit results: A = %f +/- %f, B = %f +/- %f, Y0 = %f +/- %f\n', ... + x.y(1), x.dy(1), ... + x.y(2), x.dy(2), ... + x.y(3), x.dy(3)); + + %% More tests about format of inputs + + %% Make fake AO + nsecs = 100; + fs = 10; + + unit_list = unit.supportedUnits; + u1 = unit(cell2mat(utils.math.randelement(unit_list,1))); + u2 = unit(cell2mat(utils.math.randelement(unit_list,1))); + u3 = unit(cell2mat(utils.math.randelement(unit_list,1))); + + pl1 = plist('nsecs', nsecs, 'fs', fs, ... + 'tsfcn', 'randn(size(t))', ... + 'yunits', u1); + + pl2 = plist('nsecs', nsecs, 'fs', fs, ... + 'tsfcn', 'randn(size(t))', ... + 'yunits', u2); + + pl3 = plist('nsecs', nsecs, 'fs', fs, ... + 'tsfcn', 'randn(size(t))', ... + 'yunits', u3); + + x1 = ao(pl1); + x2 = ao(pl2); + x3 = ao(pl3); + + n = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'm')); + c = [ao(1,plist('yunits', unit('m')/u1)) ao(2,plist('yunits', unit('m')/u2)) ao(3,plist('yunits', unit('m')/u3))]; + y = c(1)*x1 + c(2)*x2 + c(3)*x3 + n; + y.simplifyYunits; + + %% Fit with bilinfit + + p11 = bilinfit(x1, x2, x3, y, plist(... + )); + p12 = bilinfit(x1, x2, x3, y, plist(... + 'dy', 0.1 ... + )); + p22 = bilinfit(x1, x2, x3, y, plist(... + 'dx', [0.1 0.1 0.1], ... + 'dy', 0.1, ... + 'P0', [0 0 0 0])); + p13 = bilinfit(x1, x2, x3, y, plist(... + 'dy', ao(0.1, plist('yunits', y.yunits)) ... + )); + p23 = bilinfit(x1, x2, x3, y, plist(... + 'dx', [ao(0.1, plist('yunits', x1.yunits)) ... + ao(0.1, plist('yunits', x2.yunits)) ... + ao(0.1, plist('yunits', x3.yunits))], ... + 'dy', ao(0.1, plist('yunits', y.yunits)), ... + 'P0', [0 0 0 0])); + p14 = bilinfit(x1, x2, x3, y, plist(... + 'dy', ao(0.1*ones(size(x1.y)), plist('yunits', y.yunits)) ... + )); + p24 = bilinfit(x1, x2, x3, y, plist(... + 'dx', [ao(0.1*ones(size(x1.x)), plist('yunits', x1.yunits)) ... + ao(0.1*ones(size(x2.x)), plist('yunits', x2.yunits)) ... + ao(0.1*ones(size(x3.x)), plist('yunits', x3.yunits))], ... + 'dy', ao(0.1*ones(size(x1.y)), plist('yunits', y.yunits)), ... + 'P0', [0 0 0 0])); + p25 = bilinfit(x1, x2, x3, y, plist(... + 'dx', [0.1 0.1 0.1], ... + 'dy', 0.1, ... + 'P0', ao([0 0 0 0]))); + p26 = bilinfit(x1, x2, x3, y, plist(... + 'dx', [0.1 0.1 0.1], ... + 'dy', 0.1, ... + 'P0', p11)); + + %% Compute fit: evaluating pest + + b11 = p11.eval(plist('XData', {x1, x2, x3})); + b12 = p12.eval(x1, x2, x3); + b22 = p22.eval(plist('XData', {x1.y, x2.y, x3.y})); + b23 = p23.eval(plist('XData', [x1 x2 x3])); + b24 = p24.eval(x1, x2, x3); + b25 = p25.eval(plist('XData', {x1, x2, x3})); + b26 = p26.eval([x1 x2 x3]); +end