Informatique - TP n◦ 8 Claude Bernard 2013-2014 QUELQUES FRACTALES Une fractale est une figure g´eom´etrique dont la structure est invariante par changement d’´echelle, i.e. telle qu’un zoom sur une partie ressemble au tout (on parle d’auto-similarit´e). Le but de ce TP est d’obtenir, ` a l’aide de Python, des approximations de diff´erentes fractales. Vous travaillerez dans des fichiers scripts diff´erents pour chacune des deux parties de ce TP, enregistr´es sous un nom intelligible dans un sous-r´epertoire de votre r´epertoire de travail. 1 Les flocons de Koch On obtient une fractale, appel´ee flocon de Koch, en partant d’une ligne bris´ee L quelconque (souvent un triangle ´equilat´eral) et en r´ep´etant `a l’infini l’op´eration qui consiste `a ajouter au milieu de chaque arˆete AB de L un triangle ´equilat´eral de cˆot´e 31 AB : → → → ··· → Dans ce qui suit, on appellera flocon d’ordre k de L la ligne bris´ee obtenue `a partir de L apr`es k r´ep´etitions de l’op´eration d´ecrite ci-dessus. 1.1 Affichage d’une premi` ere ligne bris´ ee 1. Importer les librairies math et matplotlib.pyplot. 2. Affichage d’une ligne bris´ee en Python. a. D´efinir les listes X1 et Y1 respectivement des abscisses et des ordonn´ees des sommets d’un triangle ´equilat´eral. [On pourra penser aux racines cubiques de l’unit´e.] b. Afficher le triangle ainsi d´efini, ` a l’aide de la suite de commandes suivantes : X1, Y1 = ... plot(X1,Y1) axis(’equal’) show() # # # # Les listes X1 et Y1 demand´ ees en 2a On calcule les donn´ ees du dessin On ajoute une option pour orthonormaliser le rep` ere On ouvre une fen^ etre graphique contenant le dessin voulu Si le r´esultat est conforme ` a vos attentes, fermez la fenˆetre graphique, effacez (ou commentez) les trois derni`eres lignes relatives ` a ce dessin dans votre fichier script, et passez `a la suite. 1.2 Calcul d’un flocon 3. (Bonus) Pr´eliminaires math´ematiques. On munit le plan d’un rep`ere orthonormal direct. Soient AB une arˆete de L et CDE le triangle ´equilat´eral ajout´e au milieu de AB lors du calcul du flocon d’ordre un de L : B D E C A V´erifier que si A x1 y1 ,B x2 y2 et x y = x2 −x1 y2 −y1 , alors C x1 + x3 , y1 + y3 y √ 2 3 y x y1 + 2 − √ 2 3 x1 + x2 + et E x1 + 2x 3 . y1 + 2y 3 x − → − [On rappelle que le vecteur → v −y est directement orthogonal ` a u x y .] 1/4 D Informatique - TP n◦ 8 Claude Bernard 2013-2014 4. Impl´ementation Python. ´ a. Ecrire une fonction pointe(x1,y1,x2,y2) prenant en arguments les coordonn´ees de deux points A et B du plan, et renvoyant les deux listes respectivement des abscisses et des ordonn´ees des points C, D, E et B dans cet ordre, comme calcul´ees en 3. b. Tester cette fonction pointe sur quelques exemples. En particulier, on doit obtenir : >>> pointe(1,0,1,3) ([1.0, 1.8660254037844388, 1.0, 1], [1.0, 1.5, 2.0, 3]) ` l’aide de la fonction pointe de 4a et d’une boucle for, ´ecrire une fonction flocon(X,Y) c. A prenant en arguments les listes respectivement des abscisses et des ordonn´ees des sommets d’une ligne bris´ee L, et renvoyant les listes des abscisses et des ordonn´ees des sommets du flocon d’ordre un de L. d. Tester cette fonction sur les listes X1 et Y1 d´efinies en 2a. Si l’affichage du r´esultat de la commande flocon(X1,Y1) est conforme `a vos attentes, vous pouvez passer ` a la suite. 5. Affichage d’un flocon. a. Calculer (` a l’aide de Python) les listes X et Y des abscisses et des ordonn´ees du flocon d’ordre cinq du triangle ´equilat´eral d´efini par les listes X1 et Y1 de 2a. b. Afficher ce flocon. Rq. Vous pouvez donner un titre au dessin, et enregistrer l’image ainsi obtenue, en ajoutant les options title("Un joli flocon") et savefig("flocon.png") avant la commande show(). 6. Animation des premi`eres ´etapes de construction. Effacez (ou commentez) le code relatif `a 5b dans votre fichier script. En y reportant et en compl´etant le code ci-dessous, obtenir l’animation des cinq premi`eres ´etapes de construction du flocon de Koch. X,Y = ... p=plot(X,Y)[0] axis(’equal’) # on stocke dans p les donn´ ees du dessin for k in ... pause(1) X,Y = ... p.set_data(X,Y) # on admire le r´ esultat pendant 1s # on met ` a jour X et Y # on met a ` jour les donn´ ees du dessin show() 1.3 (Bonus) Des flocons carr´ es Reprendre la d´emarche de cette premi`ere partie en rempla¸cant les triangles par des carr´es, pour obtenir des flocons et une animation de type : → → → 2/4 ··· → Informatique - TP n◦ 8 Claude Bernard 2013-2014 2 Les ensembles de Mandelbrot et de Julia On consid`ere la suite complexe (zn )n∈N , d´ependant d’un param`etre c ∈ C, d´efinie par : z0 ∈ C et zn+1 = zn2 + c pour tout n ∈ N. On s’int´eresse dans ce qui suit au caract`ere born´e (ou non) de cette suite, en fonction de c et z0 . • L’ensemble de Mandelbrot est l’ensemble des nombres complexes c pour lesquels la suite (zn )n∈N de premier terme z0 = 0 et de param`etre c est born´ee. • L’ensemble de Julia associ´e ` a c ∈ C est l’ensemble des complexes z0 ∈ C pour lesquels la suite (zn )n∈N de premier terme z0 et de param`etre c est born´ee. 2.1 Pr´ eliminaires 7. (Bonus) Pr´eliminaires math´ematiques. On pose m = max(2, |c|) et D2 = {z ∈ C | |z| 6 2}. a. Montrer que s’il existe p ∈ N tel que |zp | > m, alors la suite (zn )n∈N n’est pas born´ee. [Fixer ε ∈ R∗+ tel que ε < |zp | − m et montrer que |zp+1 | > |zp |(1 + ε). En d´eduire que ∀ n ∈ N∗ , |zp+n | > |zp |(1 + ε)n , et conclure.] b. En d´eduire que l’ensemble de Mandelbrot, et les ensembles de Julia associ´es `a c ∈ D2 , sont inclus dans D2 . 8. Test du caract`ere born´e de la suite (zn )n∈N . Vu 7, la suite (zn )n∈N est born´ee si et seulement si tous ses termes sont de module inf´erieur ` a m = max(2, |c|). Comme il n’est bien sˆ ur pas possible, sur machine, de calculer l’infinit´e des termes zn , on consid`erera dans ce qui suit que la suite (zn )n∈N est born´ee si ses 100 premiers termes sont de module inf´erieur ` a m. ´ a. Ecrire une fonction rang_de_sortie(c,z0) prenant en argument deux complexes c et z0 et renvoyant, dans la suite (zn )n∈N de premier terme z0 et de param`etre c, le plus petit indice p ∈ [[0; 99]] tel que |zp | > m, s’il existe, ou renvoyant 100 sinon. b. Tester cette fonction sur quelques exemples. En particulier, on doit obtenir : >>> rang_de_sortie(1,0) 3 >>> rang_de_sortie(0,1j) 100 Ainsi, les suites (zn )n∈N born´ees ont un “rang de sortie” ´egal `a 100, et on consid`ere par abus dans ce qui suit que la r´eciproque est vraie. 9. Affichage graphique d’une matrice. La m´ethode utilis´ee en 2.2 et 2.3 ci-dessous pour visualiser les ensembles de Mandelbrot et de Julia, fait appel ` a la commande matshow de la librairie matplotlib.pyplot, qui permet de visualiser en couleurs le contenu d’une matrice (objet de type array en Python). a. Charger les librairies numpy et matplotlib.pyplot. Consulter l’aide sur la commande zeros de la librairie numpy. ` l’aide de la commande zeros et d’une boucle for, d´efinir la matrice diagonale D de b. A taille 100 dont le coefficient diagonal d’indice (j, j) vaut j + 1. [On acc`ede au coefficient (j, k) d’une matrice D par la commande D[j,k], en se rappelant que la num´erotation en Python commence ` a 0.] c. Visualiser la matrice D de 9b, par les commandes suivantes : D = ... matshow(D) show() # D´ efinition de D # On calcule les donn´ ees du dessin # On ouvre une fen^ etre graphique contenant le dessin voulu Interpr´eter : en quelle couleur est repr´esent´e un coefficient ´egal `a 0 ? `a 100 ? 3/4 Informatique - TP n◦ 8 Claude Bernard 2013-2014 2.2 L’ensemble de Mandelbrot Strat´ egie. Pour obtenir une repr´esentation (approximative) de l’ensemble de Mandelbrot : • On fixe l’entier N = 400, qui sera la r´esolution de notre dessin. • On cr´ee un quadrillage r´egulier de l’ensemble C des complexes de parties r´eelle et imaginaire dans [−2; 2] (dans lequel l’ensemble de Mandelbrot est inclus, par 7), i.e. un ensemble de N 2 complexes zj,k , o` u j, k ∈ [[0; N − 1]], r´eguli`erement r´epartis dans C. • On cr´ee la matrice M carr´ee de taille N dont le coefficient d’indice (j, k) est le “rang de sortie” de la suite (zn )n∈N de premier terme z0 = 0 et de param`etre c = zj,k . • On visualise cette matrice M comme en 9c : l’ensemble de Mandelbrot, correspondant aux coefficients ´egaux ` a 100 dans cette matrice M , apparaˆıtra en rouge sur le dessin. 10. a. Consulter l’aide relative ` a la commande linspace de la librairie numpy. ` b. A l’aide de la commande linspace, d´efinir deux listes X et Y de N points r´eguli`erement espac´es dans l’intervalle [−2; 2]. Les ´el´ements de X iront en croissant, et ceux de Y en d´ecroissant. ` 11. A l’aide de la commande zeros et de deux boucles for, cr´eer une matrice M carr´ee de taille N , dont le terme d’indice (j, k) ∈ [[0; N − 1]]2 vaut rang_de_sortie(complex(X[k],Y[j]),0). 12. a. Afficher la matrice M. b. (Bonus) Zoomer sur une partie du dessin, en red´efinissant les listes X et Y, pour observer la propri´et´e d’auto-similarit´e de l’ensemble de Mandelbrot. 2.3 (Bonus) Les ensembles de Julia Reprendre la d´emarche entreprise en 2.2 pour obtenir la repr´esentation (approximative) de diff´erents ensembles de Julia associ´es ` a diff´erents complexes c ∈ D2 . Voici quelques valeurs de c ` a essayer, en se rappelant que i se note 1j en Python : • c = 0 (deviner l’ensemble de Julia correspondant), • c = 0.25, c = 0.26, c = 0.5, c = −0.5, c = −0.75, c = −1, • c = 0.5i, c = 0.64i, c = 0.65i, c = i, • c = −0.74 + 0.1i, c = −0.85 + 0.2i, c = −0.05 + 0.7i, c = −0.29 − 0.64i, c = −0.57 + 0.48i ... 4/4
© Copyright 2024 ExpyDoc