% EX 4.7

% a)
% Bestäm längdutvidgningskoeff för metall: L = L0 + L1*t, lambda = L1/L0
disp('a)')

% Mätningar
t = [20.0 25.5 30.2 36.8 41.0]';
L = [8.78 8.93 9.06 9.25 9.40]';

% Minstakvadratanpassa, hitta c = [L0 L1]' som bäst passar A*c = L
A = [ones(length(t), 1) t];

% Minstakvadratanpassning av A*x = b fås genom att lösa Normalekvationerna
% A'*A*x = A'*L (Detta gör egentligen \ åt oss)
AA = A'*A
AL = A'*L
c = AA\AL
disp(['Lambda = ', num2str(c(2)/c(1), '%0.1e')]);
pause

% Avrunda alla Normalekvationernas element till 3 värdesiffror
AA3 = chop(AA, 3)
AL3 = chop(AL, 3)
c3 = AA3\AL3
disp(['Lambda med 3 gällande siffor = ', num2str(c3(2)/c3(1), '%0.1e')]);
% FEL! PROBLEMET ILLAKONDITIONERAT, cond(AA) = 18000
pause

% Avrunda alla Normalekvationernas element till 2 värdesiffror
AA2 = chop(AA, 2)
AL2 = chop(AL, 2)
c2 = AA2\AL2
disp(['Lambda med 2 gällande siffor = ', num2str(c2(2)/c2(1), '%0.1e')]);
% MER FEL!
pause

% b)
% Ansätt istället L = c1 + c2*(t - tm), lambda = c(2)/(c(1) - c(2)*tm)
disp('b)')

tm = mean(t);
A = [ones(length(t), 1) t-tm];

AA = A'*A
AL = A'*L
c = AA\AL
disp(['Lambda = ', num2str(c(2)/(c(1) - c(2)*tm), '%0.1e')]);

AA3 = chop(AA, 3)
AL3 = chop(AL, 3)
c3 = AA3\AL3
disp(['Lambda med 3 gällande siffor = ', num2str(c3(2)/(c(1) - c(2)*tm), '%0.1e')]);
% GANSKA RÄTT! PROBLEMET NU BÄTTRE KONDITIONERAT, cond(AA) = 57

AA2 = chop(AA, 2)
AL2 = chop(AL, 2)
c2 = AA2\AL2
disp(['Lambda med 2 gällande siffor = ', num2str(c2(2)/(c(1) - c(2)*tm), '%0.1e')]);
% GANSKA RÄTT! 