# 2. ZH 
# 2019. 04. 03.

# 1. Feladat
disp("\n=============================\n") 
disp("1. Feladat - reszleges foelemkivalasztasos\nGauss eliminacio")
A = [2 4 -2 -2; 1 2 4 -3; -3 -3 8 -2; -1 1 6 -3]
b = [-4; 5; 7; 7]

disp("Kibovitett matrix Ab:")
Ab = MatrixBovites(A, b)

disp("a -3 a reszleges foelem, igy 1 <-> 3. sor csereje")
temp = Ab(1,:)
Ab(1,:) = Ab(3,:)
Ab(3,:) = temp

disp("Elso oszlop atlo alatti elemeinek nullazasa:")
Ab(2,:) = Ab(2,:) - Ab(2,1) / Ab(1,1) * Ab(1,:)
Ab(3,:) = Ab(3,:) - Ab(3,1) / Ab(1,1) * Ab(1,:)
Ab(4,:) = Ab(4,:) - Ab(4,1) / Ab(1,1) * Ab(1,:)

disp("Masodik oszlopban barmelyik 2-es a foelem, igy 2 <-> 3. sor")
temp = Ab(2,:)
Ab(2,:) = Ab(3,:)
Ab(3,:) = temp

disp("Masodik oszlop atlo alatti elemeinek nullazasa:")
Ab(3,:) = Ab(3,:) - Ab(3,2) / Ab(2,2) * Ab(2,:)
Ab(4,:) = Ab(4,:) - Ab(4,2) / Ab(2,2) * Ab(2,:)

disp("Ab diagonalis alakra kerult igy a 3. oszlopban nem kell nullazni")

disp("\n\
Visszahelyettesites:\n")

disp("\n\
4. egyenlet: (4,4) latszatra 1 de gyozodjunk meg rola")
Ab(4,:) = Ab(4,:) / Ab(4,4)

disp("\n\
3. egyenlet: ")
Ab(3,:) = Ab(3,:) / Ab(3,3)
Ab(3,:) = Ab(3,:) - Ab(3,4) / Ab(4,4) * Ab(4,:)

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

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

disp("\n\
Leolvashato a megoldas az 5. oszlopbol:")
Ab(:,5)

disp("\n\
Ellenorzes:")
A * Ab(:,5)
b

# 2. Feladat
disp("\n=============================\n") 
disp("2. Feladat - Jacobi iteracio")
disp("\n\
Kezdeti becsles:")
X0 = [0; 0; 0]

disp("\n\
Egyenlet Ax = b:")

A = [8 2 4; 3 5 1; 2 1 4]
b = [-16; 4; -12]

disp("Igy a Jacobi iteracio egyenletei:")
JacX1 = @(x1, x2, x3) (-16 - 2 * x2 - 4 * x3)/8
JacX2 = @(x1, x2, x3) (4 - 3 * x1 - 1 * x3)/5
JacX3 = @(x1, x2, x3) (-12 - 2 * x1 - 1 * x2)/4

disp("\n\
Elso iteracio:")

X1 = [0;0;0];
X1(1) = JacX1(X0(1), X0(2), X0(3))
X1(2) = JacX2(X0(1), X0(2), X0(3))
X1(3) = JacX3(X0(1), X0(2), X0(3))

disp("\n\
Masodik iteracio:")

X2 = [0;0;0];
X2(1) = JacX1(X1(1), X1(2), X1(3))
X2(2) = JacX2(X1(1), X1(2), X1(3))
X2(3) = JacX3(X1(1), X1(2), X1(3))

# 3. Feladat
disp("\n=============================\n") 
disp("3. Feladat - Gersgorin korok")

A = [2 - i 2 1; 1 2*i 0; i 1 2]

disp("\n\
3x3-as matrix -> 3 db Gersgorin kor, soronkent egy")

disp("\n\
1. kor\n\
------")

disp("\n\
- kozeppontja:")
A(1,1)

disp("\n\
- sugara:")
abs(A(1,2)) + abs(A(1,3))

disp("\n\
2. kor\n\
------")

disp("\n\
- kozeppontja:")
A(2,2)

disp("\n\
- sugara:")
abs(A(2,1)) + abs(A(2,3))

disp("\n\
3. kor\n\
------")

disp("\n\
- kozeppontja:")
A(3,3)

disp("\n\
- sugara:")
abs(A(3,1)) + abs(A(3,2))

disp("\n\
A 3 kor felrajzolasa utan latszik, hogy 1 es 2 + 2i nem kizarhato,\n\
de -2 es -2-2i egyik korben sincs benne igy nem lehet sajatertek.")

# 4. Feladat
disp("\n=============================\n") 
disp("4. Feladat - Felezo modszer")

f = @(x) x.^2 - 3
disp("\n\
Alacsony hossz es ertektoleranciaval az eddig hasznalt program biztosan lep 7-et,\n\
de amugy kezzel se nehez megcsinalni a lepeseket.")
Bisection(f, 1, 2, 0.000000001, 0.0000000001, 7)

# +. Feladat
disp("\n=============================\n") 
disp("+. Feladat - Gauss-Seidel iteracio")
disp("\n\
Kezdeti becsles:")
X0 = [0; 0; 0]

disp("\n\
Egyenlet Ax = b:")

A = [8 2 4; 3 5 1; 2 1 4]
b = [-16; 4; -12]

disp("A Gauss-Seidel iteracio egyenletei ugyanazok mint a Jacobie:")
JacX1 = @(x1, x2, x3) (-16 - 2 * x2 - 4 * x3)/8
JacX2 = @(x1, x2, x3) (4 - 3 * x1 - 1 * x3)/5
JacX3 = @(x1, x2, x3) (-12 - 2 * x1 - 1 * x2)/4

disp("\n\
A kulonbseg, hogy a reszeredmenyeket folyamatosan felhasznaljuk")

disp("\n\
Elso iteracio:")

X1 = [0;0;0];
X1(1) = JacX1(X0(1), X0(2), X0(3))

disp("\n\
X1(2) kiszamitasanal mar hasznaljuk X1(1)-et")
X1(2) = JacX2(X1(1), X0(2), X0(3))
disp("\n\
X1(3) kiszamitasanal mar hasznaljuk X1(1)-et es X1(2)-t")
X1(3) = JacX3(X1(1), X1(2), X0(3))

disp("\n\
Masodik iteracio:")

X2 = [0;0;0];
X2(1) = JacX1(X1(1), X1(2), X1(3))
X2(2) = JacX2(X2(1), X1(2), X1(3))
X2(3) = JacX3(X2(1), X2(2), X1(3))

disp("\n\
Tobb Gauss-Seidel iteracio elvegzese:")

X = [0; 0; 0]
for i = 1:10
  printf("%d. iteracio:\n", i) % C programozasi nyelv stilusu formazott szoveg
  X(1) = JacX1(X(1), X(2), X(3))
  X(2) = JacX2(X(1), X(2), X(3))
  X(3) = JacX3(X(1), X(2), X(3))
endfor
% figyeljuk meg ismetelten, hogy helyben modosithatjuk a becslest
% viszont koordinatankent sorban szamolhato csak ki az

disp("Az 5. iteracio utan mar minden ertek 0.01-nel kozelebb van a megoldashoz,\n\
ami [-1; 2; 3]")

disp("\n\
Tobb Jacobi iteracio elvegzese:")

X = [0; 0; 0]
for i = 1:10
  printf("%d. iteracio:\n", i)
  Xuj = X
  Xuj(1) = JacX1(X(1), X(2), X(3))
  Xuj(2) = JacX2(X(1), X(2), X(3))
  Xuj(3) = JacX3(X(1), X(2), X(3))
  X = Xuj
endfor
% figyeljuk meg ismetelten, hogy kulon kell tarolni az uj es a regi becslest
% viszont koordinatankent fuggetlenul is elvegezheto volna az iteracio

disp("A 10. iteracio utan sincsen meg egyik ertek sem 0.01-nel kozelebb a megoldashoz.")
