# ===================================================================================================================
#
# Dichotomie, Lagrange et Newton  :
# trois fonctions (informatiques) qui renvoient la valeur approchée du zero d'une fonction (mathematique) f.
#
# En paramètres ces fonctions reçoivent :
# - f : la fonction dont on cherche la racine;
# - MAXITER est le nombre maximal d'itérations qu'on autorise;
# - tol est la tolérance : c'est la précision que l'on recherche sur l'équation f(x)=0;
# - a et b sont les extrémités de l'intervalle de recherche pour les méthodes de dichotomie et de Lagrange;
# - df est la dérivée de f pour la méthode de Newton.
# - x_init est la donnée initiale pour la méthode de Newton.
#
# Pour utiliser ces fonctions, il sera pratique de définir les fonctions f et df par les déclarations :
#
# def f(x)
#	return VALEUR DE f EN x
#
# def df(x)
#	return VALEUR DE df EN x
#
# ===================================================================================================================

import sys
from math import *

#def f(x)
#	return VALEUR DE f EN x

#def df(x)
#	return VALEUR DE df EN x

def dichotomie(f,a,b,tol,MAXITER):
# initialisation
    fa = f(a)
    fb = f(b)
# erreur sur l intervalle
    if fa*fb > 0.0: 
        print("La racine n est pas encadree")
        sys.exit(0)
# boucle principale
    k=0
    while(k<MAXITER):
        c = (a+b)*0.5
        fc = f(c)
        if abs(b-a) <= tol:
            return c
        if fa*fc <= 0.0:
            b = c 
            fb = fc
        else:
            a = c	
            fa = fc
        k=k+1
# si on depasse MAXITER
    print("MAXIMUM D'ITERATION ATTEINT")
#    return c

# ===================================================================================================================
def lagrange(f,a,b,tol,MAXITER):
    print("A FAIRE VOUS MEME !!!")

# ===================================================================================================================    
def newton(f,df,x_init,tol,MAXITER):
# initialisation
    k = 0
    x = x_init
    fx = f(x)
    dfx = df(x)
    z = x+1
# boucle principale
    while ( (abs(x-z)>tol) and (k<MAXITER) ):
        z = x
        x = x - fx/dfx
        fx = f(x)
        dfx = df(x)
        k = k+1
# choix du message affiche
    if k<MAXITER :
        return x    
    else:
        print("Pas de convergence")
# ===================================================================================================================
