Approfondissement sur les suites numériques/Travail pratique/Fractale de Mandelbrot
Dans ce TP, on se propose de tracer la représentation d'un objet mathématique célèbre : la fractale de Mandelbrot. Tout langage peut être utilisé pour réaliser ce TP, s'il permet :
- d’utiliser des procédures ;
- de gérer des nombres complexes ;
- de dessiner une image.
Puisqu’il permet de réaliser ces opérations, et malgré sa lenteur, nous utiliserons ici le langage Maple.
Définitions et objectif
modifier- Voir l'exercice mathématique : Ensemble de Mandelbrot.
On définit la suite (un) par la relation de récurrence suivante :
et u₀ = 0. L'ensemble de Mandelbrot est l’ensemble des complexes C tels que cette suite ne diverge pas.
On peut alors classer les points en deux catégories : ceux pour qui la suite diverge, et les autres. Mais cela n’est pas très intéressant. Pour obtenir un résultat plus convaincant, on voudrait savoir « à quelle vitesse » la suite diverge. On pose une valeur réelle umax, et on dit :
- que la suite diverge s'il existe un rang nmax tel que ;
- que la suite ne diverge pas sinon.
En pratique, on prendra umax > 2. D'autre part, dire que la suite « ne diverge pas » demande de calculer tous les termes… on s'arrêtera en pratique à n = max_iter, où max_iter est un entier.
On se propose alors de tracer une image dont la couleur de chaque pixel dépend de nmax.
Une fractale en nuances de gris
modifierDans cette première partie, on essaie de tracer la fractale, de façon sommaire.
- Question 1 — Écrire une procédure
sortie(C)
qui renvoie l'indice nmax à partir duquel la suite diverge pour C.
- Question 2 — Vérifier que les points ci,j définis par les coordonnées :
- où i et j sont des entiers compris entre 0 et r, sont dans le rectangle compris entre les points ( , ) et ( , ).
- Question 3 — Écrire une procédure
dessin(x0,y0,x1,y1)
qui renvoie un tableau de r+1 × r+1 éléments, comprenant les nmax associés aux points du plan complexe ci,j.
- Indication : on pourra définir le tableau par l'instruction
tableau := array(0..r, 0..r)
.
- Indication : on pourra définir le tableau par l'instruction
- Question 4 — Écrire la procédure
MandelbrotNB(x0,y0,x1,y1)
qui dessine la fractale de Mandelbrot en nuances de gris.
- Indication : on pourra utiliser la fonctionnalité
densityplot
de la bibliothèqueplots
de Maple.
- Indication : on pourra utiliser la fonctionnalité
- Question 5 — Tracer la fractale entre (-2.5, -1.5) et (1, 1.5).
- Indication : les paramètres recommandés sont les suivants.
umax := 3 ;
max_iter := 30 ;
r := 80 ;
- Indication : les paramètres recommandés sont les suivants.
Remarque : bien que ce rendu soit relativement rapide, Maple est extrêmement lent. Pour comparaison, il existe de nombreux logiciels gratuits capable de faire une animation en temps réel et plein écran de la fractale, avec plus de 1024 itérations. Cela correspondrait approximativement, dans notre programme, à des paramètres :
max_iter := 1024 ;
r := 1024 ;
umax := 255 ;
Lancer un programme Maple avec ces paramètres n'aboutirait qu’à son plantage.
Une fractale en couleurs
modifierMaintenant, nous souhaitons la mettre en couleurs. En particulier, nous utiliserons un dégradé de couleur.
- Question 6 — Écrire trois fonctions
d_R(x)
,d_G(x)
etd_B(x)
qui, à tout réel x compris entre 0 et 1 associe un réel compris entre 0 et 1. Si possible, qu’elles soient différentes.
- Indication : on pourra essayer des procédures linéaires de la forme
d_R := x → 1 - x ;
- Indication : on pourra essayer des procédures linéaires de la forme
- Question 7 — Écrire une procédure
couleur(x)
qui, pour tout réel x entre 0 et 1, renvoie une couleur.
- Indication : on pourra utiliser la fonctionnalité
COLOR
et utiliser les trois fonctions préparées précédemment pour chacune des composantes rouge, vert, bleu.
- Indication : on pourra utiliser la fonctionnalité
- Question 8 — Dessiner la fractale de Mandelbrot en couleurs.
- Indication : on pourra utiliser la fonctionnalité
polygonplot
de la librairieplots
de Maple, avec le paramètrecolor=couleur(...)
afin de dessiner chaque pixel. Il existe un exemple d'une telle chose dans l'aide de Maple.
- Indication : on pourra utiliser la fonctionnalité
Accélérer le calcul
modifierLe calcul de la fractale est relativement lent, comme on a pu s'en rendre compte. Nous allons essayer d'accélérer un peu les choses.
- Question 9 — Exprimer le temps d'exécution du programme précédent, en fonction de r et de max_iter.
- Question 10 — On montre que la fractale de Mandelbrot est symétrique par rapport à l'axe des abscisses. Adapter le programme précédent pour exploiter cette propriété lorsque c’est possible.
- Question 11 — On remarque que le calcul est d'autant plus long qu'on est proche de la « pomme » centrale. Il s'agit en fait d'une cycloïde appelée « cycloïde principale » caractérisée par :
- son centre situé en (1/4, 0) ;
- son équation polaire ρ = 2r(1 - cos θ) ;
- Écrire une procédure qui ne calcule pas les points situés dans la cardioïde principale, dont on sait qu’ils convergent (donc pour lesquels
sortie
vaut max_iter).
Des accélérations ultérieures nécessitent d’utiliser des fonctionnalités de calcul du processeur, ce que Maple ne permet pas de faire. De même, la précision des calculs est limitée, si bien qu'un zoom profond révèlerait des erreurs d'approximation — cela peut être corrigé en augmentant la précision de calcul de Maple, ou en utilisant des astuces de calcul.
Pour aller plus loin
modifierPour en savoir plus sur cet objet mathématique, vous êtes invités à lire l’article de Wikipédia : « Ensemble de Mandelbrot ».
Si, au lieu de faire varier la constante C, on la fixe et on fait varier u₀, la figure obtenue est appelée ensemble de Julia — il s'agit également d'une fractale, et elle possède un lien avec celle de Mandelbrot. En particulier, il n’est pas difficile de l'animer (bien que ce soit extrêmement long avec Maple). Vous pouvez également consulter l’article de Wikipédia à ce sujet : « Ensemble de Julia ».
On peut, enfin, effectuer le rendu de la fractale de Mandelbrot par une autre méthode, appelée « Buddhabrot » :
- si pour un point C la suite converge, on ne fait rien ;
- sinon, on ajoute 1 au points du plan représentés par les éléments de la suite.
On observe ainsi les valeurs les plus souvent obtenues. Remarquez que ce calcul est encore plus intensif que celui de la fractale traditionnelle — une implémentation Maple n'est même pas envisageable.