//Analyse Numérique Groupe B10
//Fichier de fonctions

function y=taylorApprox(fct, x, h) 
    //Calcule l'approximation de Taylor au premier ordre de la fonction fct. Renvoie f'(x).
  y = [fct(x+h)-fct(x)]/h;
endfunction

//Implémentation de Newton-Raphson. Retourne la racine de f.
//fct=f(x), dfct = f'(x);
function eps=NewtonRaphson(fct,x0,ctr,dfct)
    derx0=dfct(x0); //Nous utilisons la fonction dérivée de f.
    x1= 1/derx0 * (x0*derx0 - fct(x0)); //Calcule x1
    if fct(x1) < 1*10^(-7) then
        eps = x1; //Si x1 est assez proche de 0, nous le renvoyons.
        disp("Nombre d''itérations");
        disp(ctr); //Affichage du nombre d'itérations de l'algorithme.
        disp("Résultat");
        disp(eps); //Affichage du résultat.
    else          
        eps=NewtonRaphson(fct,x1,ctr+1,dfct); //Sinon, récursion sur x1. 
    end
endfunction

//Implémentation de Newton-Raphson. Retourne la racine de f. Version non analytique.
//fct=f(x).
function eps=NewtonRaphsonTaylor(fct,x0,ctr)
    derx0=taylorApprox(fct,x0,0.1); //Nous utilisons l'approximation de Taylor avec h=0.1
    x1= 1/derx0 * (x0*derx0 - fct(x0)); //Calcule x1
    if fct(x1) < 1*10^(-7) then
        eps = x1; //Si x1 est assez proche de 0, nous le renvoyons.
        disp("Nombre d''itérations");
        disp(ctr); //Affichage du nombre d'itérations de l'algorithme.
        disp("Résultat");
        disp(eps); //Affichage du résultat.
    else          
        eps=NewtonRaphsonTaylor(fct,x1,ctr+1); //Sinon, récursion sur x1. 
    end
endfunction

//Application de Newton-Raphson au calcul du minimum d'une fonction.
//dfct = f', ddfct= f''. 
function min=MinimumNR(dfct,x0,ddfct)
    min=NewtonRaphson(dfct,x0,0,ddfct); //Le minimum de f(x) est la racine de f'(x).
endfunction

//Application de Newton-Raphson au calcul du minimum d'une fonction. Version non analytique.
//dfct = f'. 
function min=MinimumNRT(dfct,x0)
    min=NewtonRaphsonTaylor(dfct,x0,0); //Le minimum de f(x) est la racine de f'(x).
endfunction

function y = fa(x) //Fonction de test 1
    y = x^2 - 5;
endfunction

function y = fad(x) //Dérivée de la fonction de test 1 (et 2)
    y = 2*x;
endfunction

function y = fb(x) //Fonction de test 2 
    y = x^2 + 17;
endfunction

function y = fc(x) //Fonction de test 3
    y = x-2*sin(x);
endfunction

function y = fcd(x) //Dérivée de la fonction de test 3
    y = 1-2*cos(x);
endfunction

function y = fd(x) //Fonction de test 4
    y = sin(3*x)+ x^2 - 2;
endfunction

function y = fdd(x) //Dérivée de la fonction de test 4
    y = 3*cos(3*x)+2*x;
endfunction

function y = fddd(x) //Dérivée seconde de la fonction de test 4
    y = 2-9*sin(3*x);
endfunction
    
function y = fe(x) //Fonction de test 5
    y = x*cos(x);
endfunction

function y = fed(x) //Dérivée de la fonction de test 5
    y = cos(x)-x*sin(x);
endfunction

function y = fedd(x) //Dérivée seconde de la fonction de test 5
    y = -2*sin(x)-x*cos(x);
endfunction
