//
// Εργασία Αριθμητικής Ανάλυσης
// Χριστοπούλου Μαρία
// Α.Μ : 200600237
//
// Άσκηση 1b - Επίλυση Εξίσωσης με τη μέθοδο Newton
// 
function newton(x0)
    // Υπολογισμός ρίζας εξίσωσης με τη Μέθοδο Newton 
    // 
    // Δεδομένα
    //    Η εξίσωση που δίνεται στην εργασία είναι:
    //    f(x) = x^5-5*x^3+9*x-6
    //    Πρώτη Παράγωγος:
    //    f'(x) = 5*x^4-15*x^2+9
    // 
    // Παράμετροι Συνάρτησης
    //    x0 : πίνακας 1-επί-1 doubles, η εκτιμώμενη ρίζα από τη γραφική παράσταση της f(x)
    //    f : η δοσμένη συνάρτηση
    //    fd : η παράγωγος της συνάρτησης f
    //    x : η ρίζα της εξίσωσης
    //
    // Περιγραφή της συνάρτησης
    //    Η μέθοδος Newton υπολογίζει την ρίζα της εξίσωσης f(x) = 0, εφαρμόζοντας επαναληπτικά τον τύπο x(i+1) = xi - f(xi)/f'(xi).
    //    Σε κάθε επανάληψη υπολογίζουμε το σφάλμα μεταξύ εκτιμώμενης (x0) και υπολογιζόμενης τιμής (xn), καθώς και την τιμή της συνάρτησης στο σημείο αυτό.
    //    Αν η τιμή της ξεπερνά μια ορισμένη τιμή, τότε η συνάρτηση αποκλίνει και το πρόγραμμα τυπώνει το σχετικό μήνυμα.
    //    Αν το σφάλμα err είναι μικρότερο από μια ορισμένη τιμή ε, τότε η συνάρτηση τυπώνει τον αριθμό των επαναλήψεων, την εκτιμώμενη ρίζα, την τιμή της συνάρτησης και τη ρίζα της εξίσωσης.
    //
    // Αναφορές
    // http://mathworld.wolfram.com/NewtonsMethod.html
    //
    
    [lhs,rhs] = argn();
    // Έλεγχος εισόδου
    if (rhs ~= 1) then
        error("Wrong number of inputs. Input parameters should be 1.")
    end
    // Έλεγχος τύπου μεταβλητής
    if (length(x0)~=1) then
        error("x0 is a scalar, not a vector.")
    end
    // Ορισμός ακρίβειας
    e = 1.e-4;
    // Ορισμός μέγιστων επαναλήψεων
    N = 100;
    // Αρχικοποίηση αριθμού επαναλήψεων
    aux = 1;
    // Ορισμός ορίων σύγκλισης
    maxvalue1 = 100;
    maxvalue2 = -100;
    // Αρχικοποίηση ρίζας
    xx=x0;
    //
    // Newton
    while(aux<N)
        xn = xx-myfun(xx)/myfund(xx);
        fappr = myfun(xn);
        if ((fappr > maxvalue1) | (fappr < maxvalue2)) then
            error("Function diverges. Please choose another starting point.")
        end
        mprintf("\nxn = %.4f\tappr = %.4f",xn,fappr)
        if (abs(xn-xx)<e) then
            x = xn;
            mprintf("\n\nNo of iterations: %d\n",aux)
            return(x);
        end
        xx=xn;
        aux = aux+1;
     end
      
endfunction
