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.
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$ |
Afficher le code ens/polytech/zero_dichotomie.algo
|
|
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 epsilon (petit) donné.
Exercice 4.1
Créez un fichier
Exercice 4.2
Créez un fichier
Exercice 4.3
Créez un fichier
On affichera le résultat obtenu sous la forme nombre d'itérations, $x_0$, $f(x_0)$ :
27 6.283 -9.596572464037597e-09
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 |
Afficher le code ens/polytech/zero_secante.algo
|
|
Exercice 4.4
Créez un fichier
Exercice 4.5
Modifiez le fichier
On affichera le résultat obtenu sous la forme nombre d'itérations, $x_0$, $f(x_0)$ :
10 6.283 -1.2606612952820044e-09
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)})$ |
Afficher le code ens/polytech/zero_tangente.algo
|
|
Exercice 4.6
Créez un fichier
Pour le calcul de la dérivée on pourra utiliser l'une des méthodes suivantes :
Exercice 4.7
Modifiez le fichier
Exercice 4.8
Modifiez le fichier
On affichera le résultat obtenu sous la forme nombre d'itérations, $x_0$, $f(x_0)$ :
4 6.283 -9.669423550915769e-15
On va chercher à déterminer les zéros de la fonction $f(x) = 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 $[1,10]$ en créant un échantillon de la fonction.
Exercice 4.9
Créez le fichier
# couples pour lesquels on a un changement de signe
couples=
[3.1149999999999967,3.1599999999999966]
[6.264999999999992,6.309999999999992]
[9.414999999999987,9.459999999999987]
-------
21 3.141592653990 -3.947792666575956e-09
3 3.141592653105 4.78155713480832e-09
2 3.141592653663 -7.231299248703638e-10
-------
22 6.283185307384 8.051428253826363e-09
3 6.283185307089 -3.5600101956497364e-09
2 6.283185307191 4.354837022944175e-10
-------
19 9.424777960777 -7.00701446781003e-10
3 9.424777960742 2.3924060045678592e-09
3 9.424777960769 3.263430448434072e-14
On a trouvé trois racines dans l'intervalle $[1,10]$, soit $π$, $2π$, $3π$ :
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 qui utilise le package scipy (pour Scientific Python et la fonctionalité fsolve qui recherche les racines d'une fonction) :
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]