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 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 |
|
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)})$ |
|
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 :
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]