# =============================================================================
# Minta program a regula falsi algoritmusra.
#
# A program celja az algoritmus bemutatasa es 
# nem valamilyen "helyes" programozasi stilus tanitasa
# -> tipikusan nem ertekelunk ki tobbszor egy fuggvenyt lasd f(a) f(b) f(c)
#    hanem az egyszer kiszamolt erteket elmentjuk es ujra felhasznaljuk
# =============================================================================

# =============================================================================
# REGULA FALSI Algoritmus
# =============================================================================
# f      - fuggveny aminek a zero helyet keressuk
# [a, b] - intervallum amin zero helyet keresunk
# hosszTolerancia - Ha |b - a| ennel kisebb nem keresunk tovabb
# ertekTolerancia - Ha |f(b)| v. |f(a)| ennel kisebb nem keresunk tovabb
# maxIteracio     - Ennel tobb iteraciot nem csinalunk
function retval = RegulaFalsi(f, a, b, hosszTolerancia, ertekTolerancia, maxIteracio)
  # f(a) es f(b) elojele kulonbozik (v. nulla valamelyik)
  assert ((f(a) * f(b)) <= 0)
  
  # Ha a v. b jo becsles alljunk meg
  if (abs(f(a)) < ertekTolerancia)
    retval = a;
  elseif (abs(f(b)) < ertekTolerancia)
    retval = b;
  else
    
    # Tablazaat fejlece
    disp("\n")
    disp("Iteracio    | a      | f(a)    | b      | f(b)   | b - a  | c      | f(c)    |")
    disp("------------------------------------------------------------------------------")
    
    # Indul az iteracio
    retval = RegulaFalsiBelseje(f, a, b, 1, hosszTolerancia, ertekTolerancia, maxIteracio);
  endif
endfunction

# k - iteracio szama
function retval = RegulaFalsiBelseje(f, a, b, k, hosszTolerancia, ertekTolerancia, maxIteracio)
  
  # KULCSLEPES: az uj becsles szamitasa
  c = (f(a) * b - f(b) * a) / (f(a) - f(b));

  # Tablazat nyomtatasa  
  disp(sprintf("%6.0f        %2.4f   %2.4f   %2.4f   %2.4f   %2.4f   %2.4f   %2.4f   ", 
               k, a, f(a), b, f(b), b - a, c, f(c)))
  
  # ======================
  # MEGALLASI FELTETELEK
  # ======================
  # Ha c jo becsles
  if ( abs(f(c)) < ertekTolerancia )
    retval = c;
  
  # Ha a keresesi intervallum [a, b] mar eleg kicsi
  elseif ( (b - a) / 2 < hosszTolerancia )
    retval = c;
    
  # Ha elerjuk a maximalis iteraciok szamat
  elseif ( k + 1 > maxIteracio )
    retval = c;
    
  # =======================
  # Nem allunk meg, megyunk tovabb f(c) elojeletol fuggoen
  elseif ( f(c) * f(a) <= 0 )
    retval = RegulaFalsiBelseje(f, a, c, k + 1, hosszTolerancia, ertekTolerancia, maxIteracio);
  else
    retval = RegulaFalsiBelseje(f, c, b, k + 1, hosszTolerancia, ertekTolerancia, maxIteracio);
  endif
endfunction
