# Gyakorlat 2019. 03. 06.
output_precision(5)

disp("Gyakorlat 2019. 03. 06.");
A = [1 2 3; 4 5 6]

disp("\n\
eye(n) : az n x n-es egysegmatrix");

disp("\n\
eye(2):");
eye(2)

disp("\n\
eye(3):");
eye(3)

disp("\n\
MatrixBovites.m fuggveny hasznalata\n\
azonos sorszamu matrixok egymas melle irasara");
MatrixBovites(A, eye(2))

disp("\n\
Egy linearis egyenletrendszer: Ax = b")
A = [1 -1 2; 2 -2 1; 3 -2 7]
b = [5; 1; 20]

disp("\n\
A kibovitett matrix")
Ab = MatrixBovites(A,b)

disp("\n\
Reszleges foelemkivalasztas miatt az elso oszlopban\n\
a 3-as a foelem igy sorcsere kovetkezik")

disp("\n\
Tipikusan ket elem (ket valtozo) csereje egy harmadik\n\ 
ideiglenes tarolasi helyet igenyel\n\
(hasznalhatnank permutacios matrixot is ebben a specialis esetben)")

disp("\n\
1. sor elmentese egy ideiglenes valtozoba")
elmentett=Ab(1,:)

disp("\n\
1. sor felulirasa a 3. sorral")
Ab(1,:) = Ab(3,:)

disp("\n\
3. sor felulirasa az elmentett 1. sorral")
Ab(3,:)=elmentett

disp("\n\
2.sor - 2/3 * 1. sor")
Ab(2,:)=Ab(2,:) - 2/3*Ab(1,:)

disp("\n\
3.sor - 1/3 * 1. sor")
Ab(3,:)=Ab(3,:) - 1/3*Ab(1,:)

disp("\n\
Kimasolni az ertekeket gyakran hibakhoz vezethet.\n\
Ha ugyis letezik eredmenykent a szam a gepben, celszeru\n\
a geptol kerni egyenesen.")

disp("\n\
Azaz az itt lathato -0.66667 beirasa helyett Ab(2,2)-kent\n\
hivatkozhatunk a pontos ertekre amit a gep nyilvan tart.")

disp("\n\
3.sor - (3,2) / (2,2) * 2. sor")
Ab(3,:)=Ab(3,:) - Ab(3,2)/Ab(2,2)*Ab(2,:)

disp("\n\
Megtortent az eliminacio.")

disp("\n\
A visszahelyettesites soran tulajdonkeppen\n\
az egyutthato matrixot hozzuk egysegmatrix alakra.\n\
Ezt csinalhatjuk a jelenlegi adatunkon is.")

disp("\n\
3. sor skalazasa")
Ab(3,:)=Ab(3,:)/1.5

disp("\n\
2. sor - 3. sor megfelelo tobbszorose\n\
(x3 behelyettesitese a 2. egyenletbe")
Ab(2,:)=Ab(2,:) - Ab(2,3)*Ab(3,:)

disp("\n\
2. sor skalazasa")
Ab(2,:)=Ab(2,:)/Ab(2,2)

disp("\n\
1. sor - 3. sor megfelelo tobbszorose\n\
(x3 behelyettesitese az 1. egyenletbe")
Ab(1,:)=Ab(1,:) - 7 * Ab(3,:)

disp("\n\
1. sor - 2. sor megfelelo tobbszorose\n\
(x2 behelyettesitese az 1. egyenletbe")
Ab(1,:)=Ab(1,:) + 2 * Ab(2,:)

disp("\n\
1. sor skalazasa")
Ab(1,:)=Ab(1,:)/3

disp("\n\
Leolvashato a megoldas a kibovitett matrix negyedik oszlopabol.")
Ab(:,4)

disp("\n\
Ha az Octave-val oldottuk volna meg A\b:")
A\b

disp("\n\
====================\n\
LU, LUP felbontas\n")

disp("\n\
1. Pelda")
A = [4 3; 6 3]

disp("[L, U, P] = lu(A) megadja az A matrix LUP felbontasat")
[L,U,P]=lu(A)

disp("P permutacios matrix, minden soraban ill oszlopaban\n\
pontosan egy darab 1-es van, a tobbi elem 0.")
P

disp("A P permutacios matrixszal valo balrol szorzas sorokat cserel")
A

disp("P * A")
P*A

disp("L * U")
L * U

disp("\n\
2. Pelda")
A=[1 2 4; 2 -1 3; 8 0 1]

disp("LUP felbontas")
[L, U, P] = lu(A)

A

disp("P * A -> sorcserek")
P * A

disp("A * P -> oszlopcserek")
A * P

disp("\n\
LUP felbontas hasznalata Ax = b megoldasara")

disp("\n\
Tipikus eset: A fix, Ax=b-t kell megoldani sok kulonbozo b vektorra")
b=[1;2;3]

disp("\n\
P * A = L * U\n\n\
Tehat: P * A * x = L * U * x\n\n\
De mivel Ax = B, igy\n\n\
P * b = L * U * x\n\n\
Innen ket lepcsos egyenletet kapunk:\n\
1) Ly = P * b, ahol y az ismeretlen\n\
2) Ux = y, ahol x az ismeretlen\n\n\
Elony: a lepcsos egyenletek megoldasa \"olcso\" (n^2-es komplexitas)\n\
egy altalanos egyenlethez kepest (n^3-os komplexitas)\n\
igy az egyszeri n^3-os koltseg az LUP felbontas, \n\
utana gyorsan oldhatoak meg kulonbozo b-kre az egyenletek")

disp("\n\
1. megoldasa Ly = P*b")
L
LPb = MatrixBovites(L,P*b)
LPb(2,:)=LPb(2,:)-0.125*LPb(1,:)
LPb(3,:)=LPb(3,:)-0.25*LPb(1,:)
LPb(3,:)=LPb(3,:)+0.5*LPb(2,:)

disp("\n\
A megoldas a 4. oszlopbol leolvashato:")
y=LPb(:,4)

disp("\n\
2. megoldasa Ux = y")
U
Uy = MatrixBovites(U,y)
Uy(3,:) = Uy(3,:) / Uy(3,3)
Uy(2,:) = Uy(2,:) - Uy(2,3) * Uy(3,:)
Uy(2,:) = Uy(2,:) / 2
Uy(1,:) = Uy(1,:) - Uy(3,:)
Uy(1,:) = Uy(1,:)/8

disp("\n\
Tehat a megoldas")
Uy(:,4)

disp("\n\
Valoban ezt kapjuk A\b-vel is")
A\b
