Outils pour utilisateurs

Outils du site


bts:python:newton

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$

bts/python/newton.txt · Dernière modification : de goupillwiki