%% Nyolcadik gyakorlat
%% Gauss elimináció, LU-felbontás
%
% 1. feladat: Írjunk programot, mely kiszámítja az alábbi egyenletrendszer megoldását a Cramer-szabály, illetve a Gauss-módszer segítségével!
% \left[\begin{array}{cccc}
% 8 & -6 & -7 & 5 \\
% 2 & -1 & -2 & 1 \\
% 6 & 1 & -9 & 2 \\
% -2 & -5 & 4 & 0 \\
% \end{array}\right]
% \left[ \begin{array}{c}
% x_1 \\ x_2 \\ x_3 \\ x_4
% \end{array} \right] = \left[ \begin{array}{c}
% -28 \\ -7 \\ -23 \\ 8
% \end{array} \right]

% Maga a mátrix:
A_eredeti = [8 -6 -7 5; 2 -1 -2 1; 6 1 -9 2; -2 -5 4 0]

% A jobb oldal:
b_eredeti = [-28 -7 -23 8]'

% A negoldásvektor:
x=zeros(4,1);

% Cramer szabály
for i=1:4
    A_modositott=A_eredeti;
    A_modositott(:,i)=b_eredeti;
    x(i) = det(A_modositott)/det(A_eredeti);
end
x


% Gauss elimináció
A = A_eredeti;
b = b_eredeti;
M = [A,b];
% U meghatározása
for i=1:3
    for j=i+1:4
        m= M(j,i)/M(i,i);
        M(j,:)=M(j,:) - m*M(i,:);
    end
    M
end

x = zeros(4,1);
x(4)=M(4,5)/M(4,4);
for i=3:-1:1
    sum = 0;
    for j=i+1:4
        sum = sum + M(i,j)*x(j);
    end
    x(i) = (M(i,5) - sum)/M(i,i);
end

disp('Végső megoldás a Gauss eliminációban:')
x

% Beépített Matlab parancs
x = zeros(4,1);
x = A_eredeti\b_eredeti;

x

%
% Tétel: Egy adott A mátrixnak pontosan akkor létezik LU-felbontása, ha egyik főminorja se zérus.
% 2. feladat: Adjuk meg az előző feladat mátrixának LU-felbontását!
% Megoldás: A Gauss-elimináció adja meg az U mátrixot, míg az adott lépésekben a szorzótényezők az L elemeit.
% Ellenőrizzük a főminoros tulajdonságot!

...

% Maga a felbontás:

...

% Ezt is szokás LU-felbontásnak nevezni, más könyvekben viszont az U van normálva, nem az L. Ezt a problémát úgy tudjuk megoldani, ha bevezetjük az alábbi felbontást:
% A = L D U,
% ahol D egy diagonális mátrix, főátlójában az U főátlójával, az U pedig így normált lesz (az L-el egyetemben). Ezután ha összeszorozzuk a D mátrixot az L mátrixszal, megkapjuk a "másik" LU-felbontást.

...

%
% 3. feladat: Oldjuk meg az alábbi rendszert részleges főelem-kiválasztás nélkül és kiválasztással úgy, hogy közben 4 tizedesjegy hosszú mantisszát tudunk csak tárolni. Mit tapasztalunk?
% \begin{cases}  10^{-5}x+y&=1,\\  x+y&=2.  \end{cases}
% Elméleti összefoglaló:
% Tétel: Tegyük fel, hogy az A
%  mátrix szimmetrikus, pozitív definit. Ekkor létezik pontosan egy olyan pozitív diagonálisú G alsó háromszögmátrix, amelyre A = G G^T. Ezt a felbontást Cholesky-felbontásnak nevezzük.
% A Cholesky-felbontást meghatározhatjuk az LU-felbontásból is, vagy kiszámíthatjuk direkten is.
%
% 4. feladat: Írjuk fel az alábbi mátrix LU- és Cholesky-felbontását!
% A =  \left[\begin{array}{ccc}
% 4 & 2 & 1\\
% 2 & 17 & 13/2 \\
% 1 & 13/2 & 23/2
% \end{array}\right]
% Megoldás: Az előző feladat segítségével az LU-felbontás alakja:

...

% Ellenőrizzük, hogy a mátrixnak valóban lesz Cholesky-felbontása! Látható, hogy a mátrix szimmetrikus, a sajátértékeket pedig matlab segítségével kaphatjuk meg:

eig(A)

% Egy másik lehetőség, ha a minorjait vizsgáljuk meg: ha mindegyik pozitív, akkor rendben vagyunk.

...

% A Cholesky-t megkaphatjuk az előzőkben megismert LDU felbontás segítségével úgy, hogy a D minden eleméből gyököt vonok, majd az egyik gyökös mátrixot L-el, míg a másikat U-val szorzom.

...

% A Cholesky-t direkten is meghatározhatjuk, ha felírjuk az alábbi összefüggést:
% A =  \left[\begin{array}{ccc}
% 4 & 2 & 1\\
% 2 & 17 & 13/2 \\
% 1 & 13/2 & 23/2
% \end{array}\right] =  \left[\begin{array}{ccc}
% a & 0 & 0\\
% b & c & 0 \\
% d & e & f
% \end{array}\right] \cdot  \left[\begin{array}{ccc}
% a & b & c\\
% 0 & d & e \\
% 0 & 0 & f
% \end{array}\right]
% Látható, hogy a bal felső elem miatt a^2=4, azaz a=2
% :
% A =  \left[\begin{array}{ccc}
% 4 & 2 & 1\\
% 2 & 17 & 13/2 \\
% 1 & 13/2 & 23/2
% \end{array}\right] =  \left[\begin{array}{ccc}
% 2 & 0 & 0\\
% b & c & 0 \\
% d & e & f
% \end{array}\right] \cdot  \left[\begin{array}{ccc}
% 2 & b & c\\
% 0 & d & e \\
% 0 & 0 & f
% \end{array}\right]
% Az első sor második elemére 2b=2 azaz b=1 adódik:
% A =  \left[\begin{array}{ccc}
% 4 & 2 & 1\\
% 2 & 17 & 13/2 \\
% 1 & 13/2 & 23/2
% \end{array}\right] =  \left[\begin{array}{ccc}
% 2 & 0 & 0\\
% 1 & c & 0 \\
% d & e & f
% \end{array}\right] \cdot  \left[\begin{array}{ccc}
% 2 & 1 & c\\
% 0 & d & e \\
% 0 & 0 & f
% \end{array}\right]
% Az első sor harmadik eleme miatt pedig 2c=1, azaz c=1/2. Így tovább haladva kapjuk az előzővel megegyező eredményt.