Mercurial > hg > ltpda
diff m-toolbox/test/test_ao_polynomfit.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_polynomfit.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,199 @@ +% TEST_AO_POLYNOMFIT tests the polynomfit method of the AO class: +% - functionality +% - against lscov +% +% M Hueller and D Nicolodi 07-01-10 +% +% $Id: test_ao_polynomfit.m,v 1.2 2010/04/08 04:30:02 mauro Exp $ +% + +function test_ao_polynomfit() + %% test polynomfit vs lscov + disp(' ************** '); + disp('Example with combination of noise terms'); + disp(' '); + + fs = 1; + nsecs = 10; + n = [0 1 -2]; + + X = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'm')); + N = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', 'm')); + C = [ao(1, plist('yunits', 'm')) ao(4, plist('yunits', 'm/m')) ao(2, plist('yunits', 'm/m^(-2)'))]; + Y = C(1) * X.^0 + C(2) * X.^1 + C(3) * X.^(-2) + N; + Y.simplifyYunits; + + % Fit with UTN double/polynom_fit + fprintf('UTN POLYNOM_FIT:\n'); + try + out = polynom_fit(X.y, Y.y, n, 'nopl'); + catch err + disp(err.message); + disp('UTN method polynom_fit.m for double not available'); + end + + % Fit with Matlab lscov + fprintf('LSCOV:\n'); + x = X.y; + y = Y.y; + m = zeros(length(x), length(n)); + for k = 1:length(n) + m(:,k) = x .^ n(k); + end + + [p, stdx, mse] = lscov(m, y); + p + stdx + mse + + % Fit with LTPDA ao/polynomfit + fprintf('AO/POLYNOMFIT:\n'); + out = polynomfit(X, Y, plist('orders', n)) + + + %% More tests + %% Make fake AO from polyval + nsecs = 5; + fs = 10; + n = [0 1 -2]; + + unit_list = unit.supportedUnits; + u1 = unit(cell2mat(utils.math.randelement(unit_list,1))); + + pl1 = plist('nsecs', nsecs, 'fs', fs, ... + 'tsfcn', sprintf('t.^%d + t.^%d + t.^%d + randn(size(t))', n), ... + 'xunits', 's', 'yunits', u1); + a1 = ao(pl1); + + C = [ao(1, plist('yunits', a1.yunits)) ao(4, plist('yunits', '')) ao(2, plist('yunits', simplify(a1.yunits/(a1.yunits.^-2))))]; + N = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', nsecs, 'yunits', u1)); + a2 = C(1) * a1.^n(1) + C(2) * a1.^n(2) + C(3) * a1.^n(3) + N; + a2.simplifyYunits; + + %% Fit with a polynomial function + + p11 = polynomfit(a1, plist('orders', n ... + )); + p12 = polynomfit(a1, plist('orders', n, ... + 'dy', 0.1)); + p22 = polynomfit(a1, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', zeros(size(n)))); + p13 = polynomfit(a1, plist('orders', n, ... + 'dy', 0.1*ones(size(a1.y)))); + p23 = polynomfit(a1, plist('orders', n, ... + 'dx', 0.1*ones(size(a1.x)), 'dy', 0.1*ones(size(a1.y)), 'P0', zeros(size(n)))); + p14 = polynomfit(a1, plist('orders', n, ... + 'dy', ao(0.1, plist('yunits', a1.yunits)))); + p24 = polynomfit(a1, plist('orders', n, ... + 'dx', ao(0.1, plist('yunits', a1.xunits)), 'dy', ao(0.1, plist('yunits', a1.yunits)), 'P0', zeros(size(n)))); + p15 = polynomfit(a1, plist('orders', n, ... + 'dy', ao(0.1*ones(size(a1.y)), plist('yunits', a1.yunits)))); + p25 = polynomfit(a1, plist('orders', n, ... + 'dx', ao(0.1*ones(size(a1.x)), plist('yunits', a1.xunits)), 'dy', ao(0.1*ones(size(a1.y)), plist('yunits', a1.yunits)), 'P0', zeros(size(n)))); + p26 = polynomfit(a1, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', ao(zeros(size(n))))); + p27 = polynomfit(a1, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', p11)); + + %% Compute fit: evaluating pest + + b11 = p11.eval(plist('type', 'tsdata', 'XData', a1)); + b11.removeVal(plist('value', Inf)); + b12 = p12.eval(plist('type', 'tsdata', 'XData', a1)); + b12.removeVal(plist('value', Inf)); + b22 = p22.eval(a1, plist('type', 'tsdata')); + b22.removeVal(plist('value', Inf)); + b13 = p13.eval(plist('type', 'tsdata', 'XData', a1)); + b13.removeVal(plist('value', Inf)); + b23 = p23.eval(a1, plist('type', 'tsdata')); + b23.removeVal(plist('value', Inf)); + b14 = p14.eval(plist('type', 'tsdata', 'XData', a1)); + b14.removeVal(plist('value', Inf)); + b24 = p24.eval(a1, plist('type', 'tsdata')); + b24.removeVal(plist('value', Inf)); + b15 = p15.eval(a1, plist('type', 'tsdata')); + b15.removeVal(plist('value', Inf)); + b25 = p25.eval(plist('type', 'tsdata', 'XData', a1)); + b25.removeVal(plist('value', Inf)); + b26 = p26.eval(plist('type', 'tsdata', 'XData', a1.x)); + b26.removeVal(plist('value', Inf)); + b27 = p27.eval(plist('type', 'tsdata', 'XData', a1.x)); + b27.removeVal(plist('value', Inf)); + + %% Plot fit + iplot(a1, b11, b12, b13, b14, b15, b26, b27, ... + plist('LineStyles', {'', '--'})); + + %% Remove linear trend + c = a1.removeVal(plist('value', Inf))-b11; + iplot(c) + + plot(c.hist) + + %% Reproduce from history + disp('Try rebuilding') + a_out = rebuild(c); + iplot(a_out) + plot(a_out.hist) + + %% Fit with a polynomial function + + p11 = polynomfit(a1, a2, plist('orders', n ... + )); + p12 = polynomfit(a1, a2, plist('orders', n, ... + 'dy', 0.1)); + p22 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', zeros(size(n)))); + p13 = polynomfit(a1, a2, plist('orders', n, ... + 'dy', 0.1*ones(size(a1.x)))); + p23 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', 0.1*ones(size(a1.x)), 'dy', 0.1*ones(size(a1.x)), 'P0', zeros(size(n)))); + p14 = polynomfit(a1, a2, plist('orders', n, ... + 'dy', ao(0.1, plist('yunits', a2.yunits)))); + p24 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', ao(0.1, plist('yunits', a1.yunits)), 'dy', ao(0.1, plist('yunits', a2.yunits)), 'P0', zeros(size(n)))); + p15 = polynomfit(a1, a2, plist('orders', n, ... + 'dy', ao(0.1*ones(size(a2.y)), plist('yunits', a2.yunits)))); + p25 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', ao(0.1*ones(size(a1.y)), plist('yunits', a1.yunits)), 'dy', ao(0.1*ones(size(a2.y)), plist('yunits', a2.yunits)), 'P0', zeros(size(n)))); + p26 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', ao(zeros(size(n))))); + p27 = polynomfit(a1, a2, plist('orders', n, ... + 'dx', 0.1, 'dy', 0.1, 'P0', p11)); + + %% Compute fit: evaluating pest + + b11 = p11.eval(plist('type', 'xydata', 'XData', a1.y)); + b12 = p12.eval(plist('type', 'xydata', 'XData', a1)); + b22 = p22.eval(a1, plist('type', 'xydata')); + b13 = p13.eval(plist('type', 'xydata', 'XData', a1.y)); + b23 = p23.eval(a1, plist('type', 'xydata')); + b14 = p14.eval(plist('type', 'xydata', 'XData', a1.y)); + b24 = p24.eval(a1, plist('type', 'xydata')); + b15 = p15.eval(plist('type', 'xydata', 'XData', a1.y)); + b25 = p25.eval(plist('type', 'xydata', 'XData', a1.y)); + b26 = p26.eval(plist('type', 'xydata', 'XData', a1.y)); + b27 = p27.eval(plist('type', 'xydata', 'XData', a1.y)); + + % Build reference object + a12 = ao(plist('xvals', a1.y, 'yvals', a2.y, ... + 'xunits', a1.yunits, 'yunits', a2.yunits)); + %% Plot fit + iplot(a12, b11, b12, b23, b14, b25, b26, b27, ... + plist('LineStyles', {'', '--'})); + + %% Remove linear trend + c = a12-b27; + iplot(c) + + plot(c.hist) + + %% Reproduce from history + disp('Try rebuilding') + a_out = rebuild(c); + iplot(a_out) + plot(a_out.hist) + + % end + % END +end