Cette page fait partie du cours de polytech PeiP1 et 2 Bio
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$.
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$ |
Variableslocales | $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$ |
|
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 :
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$ |
Variableslocales | $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 |
|
Exercice 3.2
Implantez en Python l'algorithme de la sécante pour la recherche du zéro d'une fonction.
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$ |
Variableslocales | $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)})$ |
|
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 :
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 :
Ecrire un programme qui permet de rechercher les zéros d'une fonction dans un intervalle donné. Par exemple dans l'intervalle $[0..10]$.
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 :
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]