====== 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 [[https://www.desmos.com/calculator/pduemy885m|desmos]]. Mais on peut aussi tracer la courbe avec Python et [[nsi:modules:matplolib_pyplot|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$. {{ :nsi:tds:maths:methode_newton.png?direct&400 |}} 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$