#########################################
######## TP informatique bio-sép ########
########        2025-2026        ########
#########################################


#########################################
##### Thème 2 : Résolution approchée ####
######## d'une équation f(x) = 0 ########
#########################################


import numpy as np
import matplotlib.pyplot as plt

## Q1 : Identification de l'intervalle I

def f(x) :
    return np.cos(x)-x

def graphe(f,a,b) :
    X = np.linspace(a,b,100)
    Y = f(X)
    plt.plot(X,Y)
    plt.plot([a,b],[0,0])
    plt.show()

# graphe(f,0,np.pi/2)
# Pour l'équation (E) : cos(x) - x = 0
# on peut travailler sur l'intervalle :
#     I = [0,pi/2]


## Q2 : technique par balayage

def balayage(f,a,eps) :
    n = 0
    while f(a)*f(a+eps) > 0 :
        n += 1
        a += eps
    return a,n

# print(balayage(f,0,10**-7))
# on trouve une valeur approchée
# après plus de 7 millions de tests


## Q3 : technique de dichotomie

def dichotomie(f,a,b,eps) :
    n = 0
    while b-a > eps :
        c = (a+b)/2
        n += 1
        if f(a)*f(c) < 0 :
            b = c
        else :
            a = c
    return a,n

# print(dichotomie(f,0,np.pi/2,10**-7))
# seulement 24 tests pour arriver
# à une précision de 10**-7


## Q4/Q5 : méthode de Newton

def fprime(x) :
    return -np.sin(x)-1


def Newton(f,fprime,a,eps) :
    n = 1
    x0 = a
    x1 = x0 - f(x0)/fprime(x0)
    while abs(x1-x0) > eps :
        x0 = x1
        x1 = x0 - f(x0)/fprime(x0)
        n += 1
    return x0,n

# print(Newton(f,fprime,0,10**-7))
# même précision avec seulement 5 tests !

## Q6 : tests avec une autre équation

def g(x) :
    return x**3-x-1

def gprime(x) :
    return 3*x**2-1

L = [1,0.6,0.57]
# for a in L :
#     print(Newton(g,gprime,a,10**-6))

# selon la pente de la première tangente, le nombre
# d'opérations peut varier de façon significative.
# Si la dérivée s'annule, la méthode de Newton
# ne fonctionne plus !!!




















































