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