%% Harmadik labor: Lineáris egyenletrendszerek

%% A kondíciószám
% Egy mátrix kondíciószámát a cond() függvénnyel kérdezhetjük le, például
% nem meglepő módon 
cond(eye(5),1)
%%
% illetve
cond(eye(5),2)
%%
% A Matlabban sok nevezetes mátrixcsalád megtalálható beépített
% függvényként, például a Hilbert-mátrixok is. Ezeknek (i, j)-edik eleme
% 1/(i+j+1). 
H=hilb(4)
%%
% A Hilbert-mátrixok nevezetesek a magas kondiciószámukról, például
cond(H)
%% 
% Ugyanakkor a 0 közeli determináns is mutatja, hogy ezek közel szinguláris
% mátrixok:
det(H)
%%
% A magas kondiciószám nem feltétlen jelent 0 közeli determinánst. Vegyük
% például azt az A mátrixot, amit úgy kapunk, hogy az egységmátrix bal felső
% elemét kicseréljük egy nagy, pozitív 'a' konstansra. Ekkor det(A)=a és
% cond(A)=a (hiszen A szimmetrikus, a legnagyobb séje a, a legkisebb 1), például:
A=eye(10); A(1,1)=100; cond(A)
%%
det(A)
%%
% Másfelől léteznek 0 közeli determinánssal alacsony kondiciószámú
% mátrixok. Megkeresésükhöz csak annyit kell kihasználni, hogy a
% determináns nem skálainvariáns, a kondiciószám viszont igen.
A=eye(10)*0.01; cond(A) 
%%
det(A)

%% Sajátértékek
% Az eig() polimorf függvény szolgál a sajátértékek meghatározására:
C=[1 0 3; 4 3 -1; 3 -5 8]
eig(C)
%%
% viszont a sajátvektorok lekérdezhetőek:
[Vc,Lc]=eig(C)
%%
% ennek segítségével a spektálfelbontása:
Vc*Lc*inv(Vc)
%% 
% Mivel C nem szimmetrikus mátrix, ezért V nem ortogonális, így
Vc*Lc*Vc'
%%
% nem a C-t adja vissza. Viszont tudjuk, hogy valós szimmetrikus mátrixokra
% létezik ortogonális bázis, így például
D=[1 2 3; 2 4 5; 3 5 7]
%%
[V,L]=eig(D)
%%
V*L*V'
%%
% mert a Matlab normálja V-t, így
V'*V
%%
% de
Vc'*Vc
%%
% ami mutatja, hogy bár a sajátvektorok egy hosszúak, de nem merőlegesek.
%% LER-ek megoldása
% A linsolve() parancs segítségével oldhatjuk meg a lineáris egyenletrendszereket. 
% Ha nincs speciális tulajdonsága a mátrixnak, akkor a linsolve() Gauss-eliminációt 
% csinál részleges főelemkiválasztással:
A=[1 1 1; 2 4 4; -1 5 8]
%%
b=[3 ;4 ; 3]
%%
x=linsolve(A,b)
%%
% Az lu() parancs segítségével meg is kaphatjuk a módosított Gauss-elimináció folyamán
% keletkező P, L, U mátrixokat. Figyeljük meg, hogy L normált mátrix, azaz
% minden eleme 1-nél kisebb abszolútértékű. A P mátrixból kiderül, hogy
% volt sorcsere a Gauss-elmináció folyamán.
[L,U,P]=lu(A)


%% Órai feladat
% Írjunk olyan függvényt Matlabban, amelynek bemente egy tetszőleges
% négyzetes mátrix, és végrehajtja a sorcsere nélküli Gauss-eliminációt A-n, 
% a kibővített együtthatómátrixszal most nem foglalkozunk. A kimenet legyen 
% az így kapott L és U mátrix, vagy egy hibaüzenet ha az eljárás elakadt.

%%
% <include>simaGauss.m</include>