1 Les flocons de Koch

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