# 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

    Voir l'exercice mathématique : Ensemble de Mandelbrot.
On définit la suite (u$_n$) par la relation de récurrence suivante :
$\forall n\in \mathbb {N} ,\qquad u_{n+1}=u_{n}^{2}+C$
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 u$_{max}$, et on dit :
* que la suite diverge s'il existe un rang n$_{max}$ tel que $\left|u_{n_{\rm {max}}}\right|\geq u_{\rm {max}}$ ;
* que la suite ne diverge pas sinon.
En pratique, on prendra u$_{max}$ > 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 n$_{max}$.

## Une fractale en nuances de gris

Dans 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 n$_{max}$ à partir duquel la suite diverge pour C.
    Question 2 — Vérifier que les points c$_{i,j}$ définis par les coordonnées :
${\begin{cases}x={\frac {i}{r}}\left(x_{1}-x_{0}\right)+x_{0}\\y={\frac {j}{r}}\left(y_{1}-y_{0}\right)+y_{0}\end{cases}}$
    où i et j sont des entiers compris entre 0 et r, sont dans le rectangle compris entre les points ($x_{0}$, $y_{0}$) et ($x_{1}$, $y_{1}$).
    Question 3 — Écrire une procédure dessin(x0,y0,x1,y1) qui renvoie un tableau de r+1 × r+1 éléments, comprenant les n$_{max}$ associés aux points du plan complexe c$_{i,j}$.
       Indication : on pourra définir le tableau par l'instruction tableau := array(0..r, 0..r).
    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èque plots de Maple.
    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 ;
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

Maintenant, 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) et d_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 ;
    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.
    Question 8 — Dessiner la fractale de Mandelbrot en couleurs.
       Indication : on pourra utiliser la fonctionnalité polygonplot de la librairie plots de Maple, avec le paramètre color=couleur(...) afin de dessiner chaque pixel. Il existe un exemple d'une telle chose dans l'aide de Maple.

## Accélérer le calcul

Le 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

Pour 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.
* Sommaire