% inversio-ongelmien laskennallinen pk 2012
% harjoitus 2



A1 = [1 2 3;-1 0 2; 3 1 0];
A2 = [1 2 3;-1 2 1; 2 -3 1; 0 2 2];
A3 = [1 2 3; -1 2 1];
A4 = [1 2 3; -2 1 1; -1 3 4];

% tehtava 1

% A1
% neliomatriisi, det(A) ~= 0, siis kaantyva
det(A1)

% pseudoinverssi sama kuin normaali kaanteismatriisi
pA1 = inv(A1)


% A2
% Ylideterminoitu matriisi, det(A'*A) ~= 0
det(A2'*A2)

% psudoinverssi kaavalla
pA2 = (A2'*A2)\A2'

% MATLABin valmis pseudoinverssi
pA22 = pinv(A2);


% A3
% Alideterminoitu, det(A*A') ~= 0
det(A3*A3')

% psudoinverssi kaavalla
pA3 = A3'/(A3*A3')

% MATLAB
pA32 = pinv(A3);


% A4
% Neliomatriisi, det(A) = 0
det(A4)

% det(A'*A) = 0
det(A4'*A4)

% det(A*A') HYVIN PIENI, MELKEIN NOLLA!!
det(A4*A4')

% Pesudoinverssikaava antaa kuitenkin jarkevanoloisen vastauksen 
pA4 = A4'/(A4*A4')

% MATLAB antaa eri matriisin!!!
pA42 = pinv(A4)

% Pseudoinverssi yksikasitteinen, missa vika???



% Tehtava 2

% A1
max(max(A1*pA1*A1 - A1))
max(max(pA1*A1*pA1 - pA1))
max(max((A1*pA1)' - A1*pA1))
max(max((pA1*A1)' - pA1*A1))

% A2
max(max(A2*pA2*A2 - A2))
max(max(pA2*A2*pA2 - pA2))
max(max((A2*pA2)' - A2*pA2))
max(max((pA2*A2)' - pA2*A2))

% A3
max(max(A3*pA3*A3 - A3))
max(max(pA3*A3*pA3 - pA3))
max(max((A3*pA3)' - A3*pA3))
max(max((pA3*A3)' - pA3*A3))

% A4
max(max(A4*pA4*A4 - A4))
max(max(pA4*A4*pA4 - pA4))
max(max((A4*pA4)' - A4*pA4))
max(max((pA4*A4)' - pA4*A4))

% pA4 EI TOTEUTA kaikkia pseudoinverssin vaatimuksia??

% entas MATLABin antama pA42
max(max(A4*pA42*A4 - A4))
max(max(pA42*A4*pA42 - pA42))
max(max((A4*pA42)' - A4*pA42))
max(max((pA42*A4)' - pA42*A4))

% pA4 ei siis ole oikea pseudoinverssi, mutta pA42 on!



% tehtava 3 (tarkistetaan etta kaavat ja MATLAB antavat saman tuloksen)

% (a)
max(sum(abs(A1),1)) - norm(A1,1)
max(sum(abs(A2),1)) - norm(A2,1)
max(sum(abs(A3),1)) - norm(A3,1)
max(sum(abs(A4),1)) - norm(A4,1)

% (b)
max(sum(abs(A1),2)) - norm(A1,inf)
max(sum(abs(A2),2)) - norm(A2,inf)
max(sum(abs(A3),2)) - norm(A3,inf)
max(sum(abs(A4),2)) - norm(A4,inf)

% (c)
sqrt(max(eig(A1'*A1))) - norm(A1)
sqrt(max(eig(A2'*A2))) - norm(A2)
sqrt(max(eig(A3'*A3))) - norm(A3)
sqrt(max(eig(A4'*A4))) - norm(A4)

% (d)
sqrt(trace(A1'*A1)) - norm(A1,'fro')
sqrt(trace(A2'*A2)) - norm(A2,'fro')
sqrt(trace(A3'*A3)) - norm(A3,'fro')
sqrt(trace(A4'*A4)) - norm(A4,'fro')


% tehtava 4
norm(A1) * norm(pinv(A1)) - cond(A1)
norm(A2) * norm(pinv(A2)) - cond(A2)
norm(A3) * norm(pinv(A3)) - cond(A3)
norm(A4) * norm(pinv(A4)) - cond(A4)

% HUOM! A4 ei anna oikeaa vastausta!!!

% kayttaen singulaariarvoja
ss=svd(A1);
max(ss)/min(ss) - cond(A1)
ss=svd(A2);
max(ss)/min(ss) - cond(A2)
ss=svd(A3);
max(ss)/min(ss) - cond(A3)
ss=svd(A4);
max(ss)/min(ss) - cond(A4)

% Parempi kayttaa varmuuden vuoksi singulaariarvoja ehtoluvun laskemiseen!
