# Kezdo parancsok minden script elejen

# Workspace kiuritese, valtozok torlese
clear

# Megnyitott abrak becsukasa
close all

# Euler
function eredmeny = EulerModszer(fgv, kezdetiErtek, idoracs)
  
  # Az idoracs(1) idoponthoz tartozo megoldas ertek a kezdeti ertek
  eredmeny = kezdetiErtek;

  # minden tovabbi idoracs ponthoz elvegezzuk az Euler lepest  
  for k = 1 : (length(idoracs) - 1)
    
    # Ekkora volt a lepeskoz a t_{k+1} es t_{k} idopillanatok kozott
    h = idoracs(k + 1) - idoracs(k);
    
    # Euler lepes: y_{k+1} = y_k + f(y_k, t_k) * h
    eredmeny(k + 1, :) = eredmeny(k, :) + fgv(eredmeny(k, :), idoracs(k)) * h;
  
  endfor
  
endfunction

# y''(t) = - y
# pl: sin(x)
# sin(x) -> cos(x) -> -sin(x)
# cos(x) -> -sin(x) -> - cos(x)
# altalanos: a * sin(x) + b * cos(x)
#
# nekunk csak y' = f(y, t)
#
# igazabol masodrendu egyenletnel nem 
# csak a fgv ertek az allapot, hanem
# a "sebesseg" is
#
# | y     y' |' = | y'    -y |
#
# ezt atirjuk: y-ra mint vektorra
#
# | y(1)  y(2) |' = | y(2)  -y(1) |
#
# ITT MOST SORVEKTOROKKAL DOLGOZUNK, DE LEHETNE OSZLOPVEKTORBA IS FELIRNI
f = @(y, t) [y(2), -y(1)];

figure;

t = 0 : 0.5 : 10;
plot(t, EulerModszer(f, [0, 1], t))

display("EulerModszer(f, [0 1], t)")
EulerModszer(f, [0, 1], t)

title("Euler Modszer 0.5-os lepeskoz: nem igazan jo az energia megmaradas...")
legend("y(t)", "y'(t)")

figure;
t = 0 : 0.125 : 10;
plot(t, EulerModszer(f, [0, 1], t))

title("Euler Modszer 0.125-es lepeskoz: nem igazan jo az energia megmaradas igy se...")
legend("y(t)", "y'(t)")

# az Octave-nak egy jol mukodo beepitett numerikus megoldo rutinjat az lsode-t hasznalhatjuk kozelito eredmenyek eleresere
# Itt igazabol a beadott idoracs tampontot ad csak az Octave-nak, hogy mikor akarjuk a kozelito eredmenyeket megkapni, 
# Ha ugy iteli meg akkor o kisebb lepeseket csinal az idoracs pontjai kozott es nekunk csak a kert helyeken adja vissza az eredmenyt
figure;
t = 0 : 0.5 : 10;
plot(t, lsode(f, [0, 1], t))
title("Beepitett lsode megoldo 0.5-os kirajzolasi!! (lasd .m file) lepeskozzel")

figure;
t = 0 : 0.125 : 10;
plot(t, lsode(f, [0, 1], t))
title("Beepitett lsode megoldo 0.125-os kirajzolasi!! (lasd .m file) lepeskozzel")

figure;
t = 0 : 0.5 : 10;
eulerEredmenye = EulerModszer(f, [0, 1], t);
plot(t, eulerEredmenye(:,1))
hold on

t = 0 : 0.25 : 10;
eulerEredmenye = EulerModszer(f, [0, 1], t);
plot(t, eulerEredmenye(:,1))

t = 0 : 0.125 : 10;
eulerEredmenye = EulerModszer(f, [0, 1], t);
plot(t, eulerEredmenye(:,1))

t = 0 : 0.0625 : 10;
eulerEredmenye = EulerModszer(f, [0, 1], t);
plot(t, eulerEredmenye(:,1))

lsodeEredmenye = lsode(f, [0, 1], t);
plot(t, lsodeEredmenye(:,1))

title("Euler vs lsode a poziciora")
legend("Euler - 0.5", "Euler - 0.25", "Euler - 0.125", "Euler - 0.0625", "lsode")
