# -*- coding: utf-8 -*-
"""
Created on Mon Jul  4 10:19:30 2022

@author: starons
"""

"""
Recherche le zéro d'une fonction f dans un intervalle [a,b] par dichotomie
"""

# On importe les bibliothèques utiles
# -----------------------------------
import numpy as np

# On définit la fonction dont on cherche un zéro : il est recommandé de la tracer au préalable
# --------------------------------------------------------------------------------------------
def mafonction(x):
    return x-np.tan(x)

# On précise les bornes inférieure et supérieure de l'intervalle de recherche
# ---------------------------------------------------------------------------
inf = 4.0
sup = 4.7

# Implémentation de la méthode dichotomique (f monotone sur [a,b])
# ----------------------------------------------------------------
def dichotomie(f,a,b,epsilon):
    if f(a)*f(b)>0:
        print ("Pas de zéro de f dans cet intervalle")  # si a et b encadrent un zéro de f, f(a) et f(b) doivent être de signes contraires !
    else :
        largeur = b-a 
        while largeur>epsilon:  # on cherche le zéro de f tant que la précision souhaitée n'est pas atteinte 
            c = (a+b)/2         # on coupe l'intervalle en deux
            if f(a)*f(c)<0:     # si f change de signe à gauche du milieu 
                b = c           # le zéro doit être cherché à gauche : la borne de droite passe au milieu
            else:               # sinon
                a = c           # il doit être cherché à droite : la borne de gauche passe au milieu 
            largeur = b-a       # la largeur de l'intervalle de recherche se réduit à chaque itération 
        return c 

# On indique la précision souhaitée lors de l'appel de la fonction dichotomie
# ---------------------------------------------------------------------------
print("La fonction f s'annule en x =",dichotomie(mafonction,inf,sup,1e-4))

# Une fonction préprogrammée dans Python fait exactement la même chose !
# ---------------------------------------------------------------------- 
from scipy.optimize import bisect
print("Et en utilisant la fonction bisect, on trouve que :")
print("La fonction f s'annule en x =",bisect(mafonction,inf,sup,xtol=1e-4))