Site de Jean-Michel RICHER

Maître de Conférences en Informatique à l'Université d'Angers

Ce site est en cours de reconstruction certains liens peuvent ne pas fonctionner ou certaines images peuvent ne pas s'afficher.


Cette page fait partie du cours de polytech PeiP1 et 2 Bio

3. Mise en pratique : zéro d'une fonction

3.1. Introduction

Dans ce TP on cherche une valeur pour laquelle une fonction réelle d'une variable s'annule.

Soit $f(x)$ de $ℝ$ dans $ℝ$, on cherche $x_0$ tel que $f(x_0) = 0$.

Il existe plusieurs méthodes pour résoudre ce problème, nous allons étudier les méthodes suivantes :

  • méthode par dichotomie
  • méthode de la sécante
  • méthode de la tangente

Pour chacune de ces méthodes on considérera que l'on est dans un intervalle $[a..b]$ sur lequel la fonction s'annule et que le produit $f(a) × f(b) < 0$.

3.2. Méthode par dichotomie

Cette méthode consiste à prendre le milieu de l'intervalle $[a..b]$ défini par :

$$x_0 = (a + b) / 2$$
  • si $f(a) × f(x_0) < 0$ alors cela signifie que le zéro de la fonction est dans l'intervalle $[a,x_0]$
  • si $f(x_0) × f(b) < 0$ alors cela signifie que le zéro de la fonction est dans l'intervalle $[x_0,b]$

On remplace alors $b$ par $x_0$ (ou dans le second cas $a$ par $x_0$) et on continue jusqu'à trouver une valeur de $x_0$ telle que $f(x_0)$ soit proche de 0.

Fonction zero_dichotomie(a,b)
Entrée a (réel) : borne inférieure
b (réel) : borne supérieure
Sortie Le zéro de la fonction $x_0$, tel que $f(x_0) = 0$
Variables
locales
$x_0$ le milieu de l'intervalle $[a,b]$
Description On calcule le milieu de l'intervalle $x_0 = (a+b)/2$ et si $f(a) × f(x_0) < 0$ on remplace $b$ par $x_0$, sinon on remplace $a$ par $x_0$

Warning: file_get_contents(polytech/zero_dichotomie.algo): Failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/ez_web.php on line 397
Afficher le code    polytech/zero_dichotomie.algo
  1.  

La seule difficulté réside dans l'expression $f(x_0)$ n'est pas proche de 0. Ce qui en informatique se traduit par $| f(x_0) | < ε$, c'est à dire que la valeur absolue est inférieure à un espilon (petit) donné.

Exercice 3.1

Ecrire le code Python correspondant et tester sur la fonction $x × x × sin(x)$ dans l'intervalle $[6,7]$. On créera :

  • un fichier function.py qui contiendra la définition de la fonction $f(x)$
  • puis un fichier zero_dichotomie.py qui contiendra une fonction recherche_zero(a,b)
  • et enfin un fichier zero.py qui recherchera $x_0$ dans l'intervalle $[6,7]$

3.3. Méthode de la sécante

Cette méthode consiste à trouver le point $x_0$ pour lequel la droite $y = vx +w$ passant par les points $(a,f(a))$ et $(b,f(b))$ s'annule

En ce qui concerne la sécante, elle vérifie : $$f(a) = a × v + w$$ et $$f(b) = b × v + w$$

On a donc :

$$v = (f(b) - f(a)) / (b-a)$$

et

$$w = (b × f(a) - a × f(b))/ (b-a)$$

Elle coupe donc l'axe des $x$ lorsque $y = 0 = v × x + w$, soit $x = -w / v:

$$ x = (a × f(b) - b × f(a)) / (f(b) - f(a)) $$
Fonction zero_secante
Entrée a (entier) : borne inférieure
b (entier) : borne supérieure
Sortie Le zéro de la fonction $x_0$, tel que $f(x_0) = 0$
Variables
locales
$x_0$ point de croisement de l'axe des $x$ avec la droite qui passe par $(a,f(a))$ et $(b, f(b))$
Description

Warning: file_get_contents(polytech/zero_secante.algo): Failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/ez_web.php on line 397
Afficher le code    polytech/zero_secante.algo
  1.  

Exercice 3.2

Implantez en Python l'algorithme de la sécante pour la recherche du zéro d'une fonction.

3.4. Méthode de la tangente

Cette méthode consiste à trouver le point $x_0$ pour lequel la tangente à la courbe s'annule.

L'équation de la tangente en un point $x_0$ est $y = f(x_0) + f'(x_0)(x-x-0)$, où $f'$ est la dérivée de $f$.

La tangente en un point d'abscisse $x_0$ coupe donc l'axe des $x$ en un point $x_t = x_0 - {f(x_0)} / {f'(x_0)}$.

On commencera en prenant $x_0 = (a + b) / 2$.

Fonction zero_tangente
Entrée a (entier) : borne inférieure
b (entier) : borne supérieure
Sortie Le zéro de la fonction $x_0$, tel que $f(x_0) = 0$
Variables
locales
$x_0$ point qui évolue et se rapproche du zéro de la fonction
Description On commence avec $x_0 = (a+b)/2$ puis on itère en utilisant
$x_0 = x_0 - ({f(x_0)} / {f'(x_0)})$

Warning: file_get_contents(polytech/zero_tangente.algo): Failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/ez_web.php on line 397
Afficher le code    polytech/zero_tangente.algo
  1.  

Implantez en Python l'algorithme de la tangente pour la recherche du zéro d'une fonction.

Pour le calcul de la dérivée on pourra utiliser l'une des méthodes suivantes :

  • la formule de la dérivée : $$f'(x) = {f(x + ε) - f(x)}/ ε$$
  • le calcul par Python en utilisant sympy (Symbolic Python) :
    Warning: file_get_contents(polytech/calcul_derivee.py): Failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/ez_web.php on line 397
    Afficher le code    polytech/calcul_derivee.py
    1.  

3.5. Recherche des zéros de la fonction x*x*sin(x)

On va chercher à déterminer les zéros de la fonction $x × x × sin(x)$.

On voit sur le graphe de la fonction qu'elle possède sur l'intervalle $[0..10]$ plusieurs valeurs qui l'annulent :

  • en 0
  • entre 3 et 4 : $x_0 = π$
  • entre 6 et 7 : $x_0 = 2π$
  • entre 9 et 10: $x_0 = 3π$
  • etc

x*x*sin(x)

3.5.1. Programme de recherche

Ecrire un programme qui permet de rechercher les zéros d'une fonction dans un intervalle donné. Par exemple dans l'intervalle $[0..10]$.

3.5.2. Anomalie

Dans le cas de la méthode de la tangente il faut être proche du zéro pour en obtenir la valeur exacte. En d'autres termes, l'intervalle de recherche initial $[a..b]$ doit se situer proche de $x_0$.

Essayez de trouver un des $x_0$ de la fonction $x × x × sin(x)$ en partant de la valeur 5. Quel résultat obtenez vous et pourquoi ?

Par exemple le programme suivant :


Warning: file_get_contents(polytech/zero_tangente_anomalie.py): Failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/ez_web.php on line 397
Afficher le code    polytech/zero_tangente_anomalie.py
  1.  

donne comme résultat :

..scipy/optimize/minpack.py:162: RuntimeWarning: The number of calls to function has reached maxfev = 400. warnings.warn(msg, RuntimeWarning) x_0= [-6.09065521e-50]