1 Méthode par dichotomie

Transcription

1 Méthode par dichotomie
Informatique - TP n◦ 9
Claude Bernard 2013-2014
DEUX MÉTHODES D’APPROXIMATION D’UN ZÉRO D’UNE
FONCTION
But du TP. Si f : [a; b] → R est une fonction continue qui change de signe entre a et b, alors le
théorème des valeurs intermédiaires assure l’existence de c ∈ [a; b] tel que f (c) = 0. Le but du TP
est d’implémenter en Python deux méthodes de calcul de valeurs approchées d’un tel c.
a
b
1
Méthode par dichotomie
1.1
Rappels mathématiques
Il s’agit de la méthode utilisée dans la démonstration du théorème des valeurs intermédiaires,
i.e. la construction dichotomique de deux suites adjacentes (an )n∈N et (bn )n∈N , définies par
n
a0 = a, b0 = b, et pour tout n ∈ N tel que an et bn sont définis, en posant cn = an +b
:
2
• si f (an )f (cn ) < 0, alors an+1 = an et bn+1 = cn ,
• sinon, an+1 = cn et bn+1 = bn .
La limite commune de ces deux suites est un zéro c de f . De plus, pour tout n ∈ N, les réels an
et bn sont des approximations, respectivement par défaut et par excès, de c à la précision b−a
2n .
1.2
Implémentation de la méthode
Les fonctions demandées doivent être écrites dans un fichier script que vous enregistrerez
de façon intelligible dans votre répertoire de travail. Les exemples, quant à eux, peuvent être
directement tapés dans le terminal.
1. Dans votre ficher script, chargez la librairie math.
2. a. À l’aide d’une boucle for, écrire une fonction Python zero_dicho1(f,a,b,n) prenant en
arguments une fonction continue f, deux réels a et b, où il sera supposé que a < b et que
f change de signe entre a et b, et un entier n, et renvoyant le couple constitué des termes
an et bn définis ci-dessus.
b. Testez votre fonction sur quelques exemples. En particulier, on doit obtenir :
>>> zero_dicho1(cos,1.,2.,5)
(1.5625, 1.59375)
3. a. À l’aide d’une boucle while, écrire une fonction Python zero_dicho2(f,a,b,eps) où f,
a et b sont définis comme ci-dessus et où eps est un réel strictement positif, et renvoyant
un couple constituant un encadrement à eps-près d’un zéro c de f entre a et b.
b. En appliquant votre fonction zero_dicho2 à une fonction f et des réels a et b bien choisis,
calculez des encadrements à 10−10 près de π, de e, et du point fixe de la fonction cos.
Combien de décimales exactes de ces trois réels obtient-on ainsi ?
4. Que se passe-t-il si vous appliquez vos fonctions zero_dicho1 et zero_dicho2 à une fonction
f qui ne change pas de signe entre a et b (ou plus généralement telle que f(a)*f(b)>0) ?
Améliorez leur code pour qu’elles renvoient, dans un tel cas, un message d’erreur adapté.
1/3
Informatique - TP n◦ 9
Claude Bernard 2013-2014
5. (Bonus) On rappelle que tout réel x ∈ [2p ; 2p+1 [ , où p ∈ [[−1022; 1023]], est encodé en Python
par un float x̃ tel que |x − x̃| 6 2p−53 .
a. Écrire une fonction zero_dicho(f,a,b) où f, a et b sont comme ci-dessus, et renvoyant
une approximation d’un zéro c de f entre a et b à la meilleure précision possible.
b. Testez votre fonction sur les exemples précédents.
Rq. On rappelle qu’on peut interrompre un calcul à tout moment (par exemple en cas de
boucle infinie) par la combinaison de touches Ctrl+C.
1.3
Illustration graphique de la méthode
6. Chargez les librairies numpy et matplotlib.pyplot.
7. En complétant, puis en lançant, le script ci-dessous, observer le principe de recherche par
dichotomie du (mystérieux) zéro de la fonction cos entre 1 et 2.
a, b, X = 1., 2., linspace(0.,3.14,100)
plot(X,cos(X))
p = plot([a,b],[0.,0.],’ro-’)[0]
for k ... ...(8):
m = ...
if ...*cos(m)<0:
b = ...
else:
a = ...
pause(1)
p.set_xdata([a,b])
show()
8. a. Analyser et interpréter chacun des éléments de ce script.
b. (Bonus) Adapter ce script pour observer le principe de recherche par dichotomie des
valeurs approchées de π, de e et du point fixe de la fonction cos, obtenues en 3b.
2
2.1
Méthode de Newton
Préliminaires mathématiques
On suppose dans cette partie que la fonction f = [a; b] → R est de classe C 1 sur [a; b], et que
ne s’annule pas sur [a; b]. Soit alors c l’unique zéro de f sur [a; b].
L’idée de la méthode de Newton est la suivante. Soient c0 ∈ [a; b] et T0 la tangente au graphe
de f au point d’abscisse c0 . Alors dans les bons cas, l’abscisse c1 du point d’intersection de T0
avec l’axe (Ox) est plus proche de c que c0 .
f0
“mauvais cas”
“bon cas”
a c0
a
c1
c0 b
b
c1
En itérant ce raisonnement à partir du point c1 , et ainsi de suite, on construit une suite
(cn )n∈N convergeant, dans les bons cas, vers le zéro c de f sur [a; b]. Elle est définie par :
c0 ∈ [a; b] et pour tout n ∈ N, cn+1 = cn −
2/3
f (cn )
.
f 0 (cn )
Informatique - TP n◦ 9
Claude Bernard 2013-2014
9. (Bonus mathématique) On suppose dans cette question que f est de classe C 2 sur [a; b].
M
On pose m = min |f 0 |, M = max |f 00 | et A = 2m
(b − a), et on suppose que A < 1.
[a;b]
[a;b]
a. Montrer à l’aide de l’inégalité de Taylor-Lagrange 1 à l’ordre 2 en cn , que si cn ∈ [a; b],
M
alors |cn+1 − c| 6 2m
|cn − c|2 .
En déduire que cn+1 appartient à [a; b] et est strictement plus proche de c que cn .
b. Montrer que pour tout n ∈ N, cn est bien défini dans [a; b], et que
En déduire que la suite (cn )n∈N tend vers c.
2.2
M
2m |cn
n
− c| 6 A2 .
Implémentation de la méthode
Les fonctions demandées doivent être écrites dans un fichier script que vous enregistrerez
de façon intelligible dans votre répertoire de travail. Les exemples, quant à eux, peuvent être
directement tapés dans le terminal.
10. a. Écrire une fonction Python zero_newton1(f,fp,c0,n), où f est une fonction supposée
vérifier les hypothèses de 2.1, fp sa dérivée, c0 un réel et n un entier, et renvoyant le
terme cn défini ci-dessus.
b. Testez votre fonction sur quelques exemples, en faisant attention à la pertinence des
résultats trouvés. En particulier, on doit obtenir :
>>> zero_newton1(lambda x:x**2-3.,lambda x:2*x,1.,3)
1.7321428571428572
>>> zero_newton1(lambda x:1./x-1.,lambda x:-1./x**2,3.,3)
-255.00000000000023
11. a. Écrire une fonction zero_newton2(f,fp,c0,eps), où f, fp et c0 sont définis comme cidessus et où eps est un réel strictement positif, et renvoyant le premier terme cn tel que
|f (cn )| 6 ε.
b. En utilisant votre fonction zero_newton2, calculez des valeurs approchées de π, de e, et
du point fixe de la fonction cos.
Comparer les résultats avec ceux de la question 3b. Commenter.
12. (Bonus) Même question avec le test d’arrêt |cn+1 − cn | 6 ε.
2.3
(Bonus) Comparaison des vitesses de convergence
13. a. Modifier les fonctions zero_dicho2 et zero_newton2 pour qu’elles renvoient, en plus du
résultat, le nombre de passages en boucle nécessaires pour l’obtenir.
b. Comparer alors, sur les exemples vus plus haut, les vitesses de convergence relatives des
deux méthodes, pour une précision ε fixée.
14. Expliquer ce résultat mathématiquement, à l’aide des rappels et préliminaires ci-dessus.
1. L’inégalité de Taylor-Lagrange à l’ordre 2 en un point a est l’inégalité |f (x) − f (a) − f 0 (a)(x − a)| 6
que l’on déduit de la formule de Taylor avec reste intégral en majorant le reste.
3/3
M |b−a|2
,
2