Table des matières
Méthode de Newton
La méthode de Newton consiste à chercher une racine de fonction. La seule condition est que la fonction soit dérivable sur tout l'intervalle considéré. C'est une méthode très efficace.
Exemple
Considérons la fonction $f: x \mapsto 0,5\,x^4 - 2\,x^3 + x^2 + x +1$
Tracé de la fonction
Commençons par tracer la fonction. On peut bien sûr utiliser un grapheur comme desmos. Mais on peut aussi tracer la courbe avec Python et matplotlib.pyplot.
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 0.5*x**4 - 2*x**3 + x**2 + x + 1
# tracé du graphique de f sur [-1;3.5]
liste_x = np.linspace(-1, 3.5 , num = 100) # 100 valeurs de x sur [-1;3.5]
liste_y = [f(x) for x in liste_x] # valeurs y correspondantes
plt.plot(liste_x, liste_y)
Principe de la méthode
Il s'agit en gros de suivre le sens de la pente. La dérivée d'une fonction me dit comment la fonction varie. Par exemple, supposons que $x = 1$, alors $y = f(1) = 1,5$. Si je veux diminuer $y$, je dois diminuer $f(x)$ et pour savoir comment diminuer $f(x)$ j'ai besoin de $f'(x)$.
$f'(x) = 2\,x^3 - 6\,x^2 + 2\,x + 1 \Rightarrow f'(1) = -1 < 0$
On voit donc que $f$ décroît en $x = 1$ et donc pour diminuer $f(x)$ il faut augmenter $x$.
La figure ci-dessous vous montre la situation pour l'exemple $x_0 = 1$, $f(1) = 1,5$ et $f'(1) = -1$.
L'équation de la tangente est $\mathcal{T_1}: y = -1\times (x - 1) + 1,5$
On veut $y = 0$ donc $x_1 = x = 1 - \frac{1,5}{-1}$.
Si on généralise, ce sera : $x_{1} = x_{0} - \frac{f\left(x_{0}\right)}{f'\left(x_{0}\right)}$
Retenez : j'essaie une racine $x_0$.
Si elle n'est pas suffisamment bonne, je change de valeur de $x$ en prenant $x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}$ et je recommence.
Calcul de la dérivée
Plutôt que calculer $f'(x)$ de façon exacte, on va se contenter d'une approximation. On se fixe un $\varepsilon$ petit, par exemple $\varepsilon = 1E-6$, et on calcule :
$$f'(x) \approx \frac{f(x+\varepsilon) - f(x)}{\varepsilon}$$
EPSILON = 1e-6
# définition de la dérivée approximative
def der_f(fonction, x):
'''
x: réel, antécédent de la fonction
fonction: fonction de x
renvoie une approximation de fonction'(x)
'''
return (fonction(x + EPSILON) - fonction(x)) / EPSILON
Algorithme
ENTRÉES : réel x0, fonction f, réel positif seuil_erreur
SORTIE : estimation d'une racine x de la fonction f
DÉBUT
soit x = x0
TANT QUE l'écart entre f(x) et 0 est supérieur à seuil_erreur RÉPÉTER
x prend la valeur x - f(x) / f'(x)
FIN
RENVOYER x
FIN
À vous
Reprenons ce que nous avons déjà :
EPSILON = 1e-10
# définition de la dérivée approximative
def der_f(fonction, x):
"""
x: réel, antécédent de la fonction
fonction: fonction de x
renvoie une approximation de fonction'(x)
"""
return (fonction(x + EPSILON) - fonction(x)) / EPSILON
# Votre travail
def newton(x0, fonction, seuil_erreur = 1e-5):
"""
x0: réel, valeur initiale de la recherche
fonction: fonction de x
seuil_erreur: réel positif, par défaut = 1e-5
si écart entre f(x) et 0 < seuil_erreur, on considère x comme une racine
renvoie une racine approximative de la fonction
"""
# à vous
# Exemple d'utilisation
def f(x):
return 0.5*x**4 - 2*x**3 + x**2 + x + 1
r = newton(1, f)
print(f"Une racine approximative de f est {r}")
Autres exemples
Modifiez le code pour résoudre $3x\cdot \exp(-x) = 1$

