par Antoine Houlou-Garcia
Par Antoine Houlou-Garcia,
Auteur de Le monde est-il mathématique ? [1]
Les fractales fascinent par leur formes étranges, variant entre surréalisme et futurisme, nous plongeant dans un vertige infiniment renouvelé. Benoît Mandelbrot (1924-2010) les a rendues célèbres dans les années 1970 et leur a donné ce nom issu du latin fractus qui signifie brisé, cassé. Il s’était d’ailleurs basé sur les travaux de Gaston Julia (1893-1978), lui-même « gueule cassée » de la première guerre mondiale !
Et c’est justement à l’une des fractales de Gaston Julia que nous allons ici nous intéresser en tentant de construire pas à pas, avec des outils simples, un voyage dans cet univers que les élèves de Terminale peuvent comprendre aisément tout en ayant une preuve que « ça sert à quelque chose d’apprendre les maths ».
Face aux nombreux articles qui exposent les applications botaniques, artistiques voire philosophiques de ces formes mathématiques, nous souhaitons ici exposer au lecteur leur fonctionnement technique en sorte qu’il soit capable d’inventer de nouvelles formes et de plonger dans le délice, même à petit niveau, d’entrevoir la recherche en mathématiques.
Cet article peut être librement diffusé et son contenu réutilisé pour une utilisation non commerciale (contacter l’auteur pour une utilisation commerciale) suivant la licence CC-by-nc-sa http://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode.
Rappels sur les complexes
Les fractales sont des représentations géométriques de suites définies dans le plan complexe. Pour rappel, les nombres complexes sont définis comme une extension des nombres réels, en particulier grâce au nombre imaginaire i, dont la spécificité réside dans sa définition même : i² = -1 ou encore i = √-1. Les nombres complexes s’écrivent sous la forme z = x + iy, où x et y sont des réels et i le nombre imaginaire défini précédemment. Les coordonnées d’un tel point z sont donc (x ; y).
Le module d’un nombre complexe est la distance entre le point associé à ce nombre et l’origine du repère : c’est la distance en bleu sur le schéma. L’application du théorème de Pythagore nous permet de déduire que la valeur du module de z, noté | z |, est égale à √(x²+y²).
Fractales de Julia
On s’intéresse aux suites complexes définies ainsi :
zn+1 = zn²+ k (avec k un nombre complexe défini a priori)
en posant le premier terme z0.
On peut montrer que si, pour un certain rang n, le module de zn est supérieur ou égal à 2, alors la suite divergera vers l’infini. C’est pourquoi on va s’intéresser au nombre maximal d’itérations (noté N) tel que :
| zN | ≥ 2 et que pour tout n < N, | zn | < 2.
En d’autres termes, N est le premier entier qui fasse franchir au module de (zn) la barre des 2.
On crée ainsi une application f de l’ensemble des suites complexes dans $\mathbb{N}$ qui à toute suite (zn) associe l’entier naturel N défini ci-dessus. De façon plus formelle :
$f :\mathbb{C}^{\mathbb{N}}\rightarrow \mathbb{N}$
$(z_{n})\rightarrow N$
On travaille donc sur la suite des modules :
| z1 | = | z0 |,
| z2 | = | z0² + k |,
| z3 | = | z04 + 2kz0² + k² + k | etc.
On remarque que la valeur de | zn | ne dépend que de z0 et de k. On va ici fixer a priori la valeur du nombre complexe k et faire varier la valeur de z0. Ainsi, on va décrire toutes les valeurs de N, le nombre maximal d’itérations possibles, en fonction de la seule variablez0, à paramètre k fixé. Notre fonction peut donc s’écrire sous la forme suivante :
$f :\mathbb{C}\rightarrow \mathbb{N}$
$z_{0}\rightarrow N$
Le lecteur attentif aura remarqué qu’il existe des valeurs de k pour lesquelles le module de la suite ne dépasse jamais 2. Par exemple pour z0 = 0,1i le module de la suite tendra vers 0 en décroissant. Dans ce cas, N devrait être égal à l’infini. Mais pour des raisons pratiques, on arrête arbitrairement les itérations à une valeur fixe Nmax : en général 50, 100 ou 300 itérations permises au plus. Dès lors, si N tend vers l’infini, on posera automatiquement N = Nmax.
Pour l’expliquer moins techniquement, c’est comme si on regardait une montagne du dessus. Si on regarde les Alpes à 6 000 m d’altitude, on distinguera assez bien les sommets mais tout ce qui sera à moins de 4 000 m sera trop loin pour être perçu. Alors, si on souhaite toujours regarder les Alpes du dessus mais à 1 000 m de hauteur, on doit faire un coupe de la montagne à cette hauteur. De cette manière, on obtiendra une étendue plus vaste à étudier et les hauteurs relatives seront plus nettes.
Dans les fractales, c’est le même principe : il suffit de considérer les valeurs prises par N comme des hauteurs. Si on pose Nmax = 300, tout ce qui est inférieur 50 sera relativement proche et donc de la même couleur ; on aura donc une perte d’information graphique. En contrepartie, on saura où se trouvent les sommets.
Mais si l’on souhaite voir un graphique où les hauteurs relatives sont bien visibles, on posera Nmax = 50. Ainsi, tout ce qui dépassait 50 dans le cas précédent sera écrêté à 50 ; on confondra donc les plus hauts sommets (de vraie hauteur 300 mais coupés à 50) avec les mini sommets de vraie hauteur 50 ; on verra ainsi tout l’assise du massif.
Construction d’une fractale en LibreOffice
Pour notre étude, nous allons nous intéresser au cas particulier k = -0.7927 + 0.1609i. Concrètement, sous LibreOffice, on va mettre en abscisse la partie réelle de z0 et en ordonnée sa partie imaginaire. Au croisement des deux composantes du nombre complexe z0, on trouvera la valeur de N correspondante.
Les valeurs possibles de la partie réelle de z0 sont notées dans la ligne 3 : on utilise une formule pour générer automatiquement les valeurs à partir d’une valeur de base et d’un « pas », écart systématique entre deux valeurs consécutives (en B2 ci-dessous). On fait de même pour la partie imaginaire, reportée en colonne C.
Puis on va coder notre fonction grâce à une « macro » permettant d’associer à tout couple de valeurs décrivant z0 le nombre N correspondant. Pour ce faire, il faut aller dans Outils puis Macros, Gérer les macros, LibreOffice Basic.
Il faut ensuite éditer une macro que voici présentée dans la colonne de gauche et expliquée dans la colonne de droite :
Function Julia (x, y) as integer Dim module, z_reel, z_imag, z_carre_reel, z_carre_imag as double Dim n as integer N = 0 module = 0 z_reel = x z_imag = y do while (n < 200 and module < 2) z_carre_reel = z_reel ^ 2 - z_imag ^ 2 z_carre_imag = 2 * z_reel * z_imag z_reel =z_carre_reel - 0.7927 z_imag =z_carre_imag + 0.1609 module = Sqr(z_reel ^ 2 + z_imag ^ 2) N = N + 1 loop Julia = N End Function |
Notre fonction dépend des deux valeurs qu’on peut lire en abscisse et en ordonnée et renvoie un nombre entier On déclare les variables réelles On déclare la variable entière On initialise N à 0 Le module vaut initialement 0 On initialise notre suite (zn) en indiquant que z0 est composé des deux valeurs qu’on lit en abscisse et ordonnée Tant que N < Nmax (ici fixé à 200) et $|$ z $|$ < 2 (x+iy)² = (x²-y²) + i(2xy) d’où l’expression de Re(z²)et de Im(z²) z reçoit la valeur z² + k en procédant sur chacune des composantes de z et on actualise la valeur du module. N reçoit la valeur N+ 1 Fin de la boucle ‘‘Tant que’’ N est le résultat final Fin de la fonction |
On utilise ensuite notre fonction Julia dans la feuille LibreOffice afin de calculer, pour chaque couple de valeurs (x,y) définissant chaque z0 le N correspondant :
Ainsi, dans la case D4, on a z0 = -1,6 + i, dont le module vaut 1,6² + 1² = 3,56. Le module de z1 est donc supérieur à 2, c’est pourquoi la valeur affichée est 1. Cette fonction est calculée pour tous les couples, faisant varier la partie réelle de z0 de -1,6 à + 1,6 et sa partie imaginaire de 1 à -1. On obtient donc près de 30 000 valeurs de notre fonction (216 colonnes multipliées par 135 lignes).
Enfin, on applique un format conditionnel pour colorier l’ensemble des cases comprenant les résultats de la fonction (Format -> Formatage conditionnel -> Échelle de couleur) puis on dé-zoome au maximum en sorte de diminuer la taille des cases et de pouvoir faire apparaître ce qui fera office de graphique :
Cette représentation s’établit à partir du programme tel que nous l’avons écrit plus haut, avec une valeur maximale de N fixée à 200 itérations. Mais si nous n’autorisons une valeur maximale que de 50, voici ce que nous obtenons [2] :
Et voici ce qu’une coupe à 20 permet d’obtenir :
C’est ainsi qu’on voit la notion de relief qu’une hauteur de vue plus basse permet de mettre en évidence. En effet, si nous passons de notre représentation plane à une représentation en trois dimensions de notre objet fractal, nous voyons clairement les différences de hauteur entre les couleurs. Ainsi, faire varier Nmax permet d’effectuer une coupe à un certain niveau et donc de voir de plus ou moins haut, avec plus ou moins de recul, notre objet. Le graphique suivant est réalisé en trois dimensions avec Excel car LibreOffice ne le permet pas. Il est d’ailleurs à noter que sous Excel on peut réaliser toutes les figures montrées ici en utilisant un graphique dit de surface, ce qui implique un traitement un peu plus lourd que sous LibreOffice.
On peut également procéder à une autre modification de la règle de calcul, non pas en changeant le nombre maximal d’itérations mais en « densifiant » notre fonction : on appose la fonction modulo à tous les résultats obtenus par la fonction initiale. Pour rappel, la fonction modulo correspond à l’opération de calcul du reste de la division euclidienne. Ainsi 13 modulo 4 est égal à 1 car, en enlevant le plus de fois possibles 4 à 13, on tombe sur 13-4=9, puis 9-4=5, puis 5-4 = 1. De même, 15 modulo 6 est égal à 3 etc.
Nous pouvons ici par exemple utiliser un modulo 4 dans notre fonction en changeant ainsi l’avant-dernière ligne du programme présenté plus haut : MOD(JULIA(D$3;$C4);4)
. Cette simple opération permet de faire apparaître des sortes de tubes là où nous avions des aplats qui pouvaient ne pas sembler a priori intéressants.
Mais revenons-en à la fonction basique que nous avions programmée et zoomons autour de 0,2 en abscisses et 0,3 en ordonnées. Pour ce faire, il suffit de changer les points de départ et le pas dans notre classeur : on fait un pas de 0.0002, un point de départ en abscisse de 0.2 et en ordonnée de 0.3. Le calcul s’actualise automatiquement ainsi que le graphique :
Si nous zoomons sur l’une de ces spirales, voici ce que nous obtenons :
Nous voyons alors que la spirale est en réalité constituée de millions de petites spirales qui sont elles-mêmes, vous l’aurez bien compris, constituées d’une infinité de spirales encore plus petites. C’est là tout le génie des fractales : à mesure que l’on zoome, on retombe sur des structures qui existaient à l’œil nu, et ce de façon infinie.
Pour finir, reprenons le premier zoom que nous avions effectué et utilisons l’opérateur modulo 4 sur ce zoom, apparaît alors une image vertigineuse où les « tubes » se divisent à l’infini pour nous entraîner dans un monde aussi mystérieux que fascinant.
Les autres fractales de Julia
Nous avons ici tenté de montrer les possibilités que l’on peut développer avec des outils simples et qu’un élève peut facilement manier. Il existe d’autres fractales de Julia que les élèves pourront s’amuser à découvrir. Pour ce faire, il suffit de modifier la valeur de z0 dans le programme que nous avons écrit.
Pour k= 0.285+ 0.01i, la fractale de Julia aura une forme de cerveau :
Pour k= 0.32+ 0. 043i, la fractale de Julia aura une forme de lion :
Pour k= -1, la fractale de Julia aura une forme d’OVNI :
Pour k= -1 + i, la fractale de Julia aura une forme de cellule :
Pour k= i, la fractale de Julia aura une forme d’éclair :
Pour
aller (encore) plus loin– René Grothmann
– Manuel de Maxima
– Guillaume Connan (pages 161 à 166)
– Eric Hakenholz
– Alain Busser
– Evgeny Demidov
– Le logiciel Gimp qui dessine les ensembles de Julia en quelques clics
– Et enfin un outil très interactif