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 :

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 :

$$m = (a + b) / 2$$

On remplace alors $b$ par $m$ (ou dans le second cas $a$ par $m$) et on continue jusqu'à trouver une valeur de $m$ telle que $f(m)$ 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
$m$ le milieu de l'intervalle $[a..b]$
Description On calcule le milieu de l'intervalle $m = (a+b)/2$ et si $f(a) × f(m) < 0$ on remplace $b$ par $m$, sinon on remplace $a$ par $m$
  1. fonction zero_dichotomie(a, b sont des réels) : réel
  2.  
  3.   m = (a + b) / 2
  4.  
  5.   tant que f(m) n_est_pas_proche_de_zero faire
  6.     si f(a) * f(m) < 0 alors
  7.       b = m
  8.     sinon
  9.       a = m
  10.     fin si
  11.     m = (a + b) / 2
  12.   fin tant que
  13.  
  14.   retourner m
  15.  
  16. fin fonction 
  17.  

La seule difficulté réside dans l'expression $f(m)$ n'est pas proche de 0. Ce qui en informatique se traduit par $| f(m) | < ε$, 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 $m$ pour lequel la droite $y = vx +w$ passant par les points $(a,f(a))$ et $(b,f(b))$ s'annule

$$m = (a + b) / 2$$

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

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
$m$ point de croisement de l'axe des $x$ avec la droite qui passe par $(a,f(a))$ et $(b, f(b))$
Description On calcule le nombre de diviseurs de n,
s'il en existe deux alors le nombre est premier
  1. fonction zero_secante(a, b sont des réels) : réel
  2.  
  3.   m = (a * f(b) - b * f(a)) / (f(b) - f(a))
  4.  
  5.   tant que f(m) n_est_pas_proche_de_zero faire
  6.     si f(a) * f(m) < 0 alors
  7.       b = m
  8.     sinon
  9.       a = m
  10.     fin si
  11.     m = (a * f(b) - b * f(a)) / (f(b) - f(a))
  12.   fin tant que
  13.  
  14.   retourner m
  15.  
  16. fin fonction
  17.  

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 $m$ pour lequel la tangente à la courbe s'annule.

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

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

On commencera en prenant $m = (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
$m$ point qui évolue et se rapproche de $x_0$
Description On commence avec $m = (a+b)/2$ puis on itère en utilisant
$m = m - ({f(m)} / {f'(m)})$
  1. fonction zero_tangente(a, b sont des réels) : réel
  2.  
  3.   variable m est un réel
  4.  
  5.   m = (a + b) / 2
  6.  
  7.   tant que m n_est_pas_proche_de_zero faire
  8.     m = m - ( f(m) / f_prime(m) )
  9.   fin tant que
  10.  
  11.   retourner m
  12.  
  13. fin fonction
  14.  

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 :

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 :

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 :

  1. import math
  2. from scipy.optimize import fsolve
  3.  
  4. def f(x):
  5.   return x*x*math.sin(x)
  6.  
  7.  
  8. # provoque une erreur
  9. x_initial = 5
  10. print("valeur initiale pour la recherche = ", x_initial)
  11. x_0 = fsolve(f, x_initial)
  12. print("x_0=", x_0)
  13.  

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]