jeudi 15 juin 2017

Tracer l'ensemble de Mandelbrot

Quand on parle de fractale on pense immédiatement à l'ensemble de Mandelbrot. Si cet ensemble a été découvert au début du XXième siècle par Gaston Julia et Pierre Fatou, mais c'est Benoît Mandelbrot qui va en donner les premières représentation graphiques dans les années 1980 ! Aujourd'hui on peut tracer ce mystérieux ensemble en quelques lignes de code (avec Scilab par exemple) et un joli argument mathématique  ...



L'ensemble de Mandelbrot  est défini de manière très simple : c'est l'ensemble des points du plan complexe $z_0\in{\mathbb C}$ tels que la suite récurrente $(z_n)_{n\in{\mathbb N}}$ ci-dessous reste bornée :
$$ z_{n+1}=z_n^2+z_0$$
Le théorème qui permet de tracer facilement l'ensemble de Mandelbrot est le suivant :


Théorème si pour un certain $k$  on a $|z_k|>2$ alors la suite $(z_n)_{n\in{\mathbb N}}$  diverge avec $|z_n|\mathop{\longrightarrow}_{n\to\infty}+\infty$

Soit $c=z_0$ un nombre complexe  alors  on appelle  $\alpha$ la racine positive de l'équation du second degré
$$\alpha=\alpha^2-|c|\Leftrightarrow  \alpha^2-\alpha -|c|=0$$
le discriminant du trinôme étant   $\Delta= 1+4|c|\geq 1$ on a  $\alpha=(1+\sqrt{\Delta})/2\geq 1>0$ . En  soustrayant cette équation avec la relation de récurrence pour $|z_{n+1}|$ on trouve

$$\begin{align*}
|z_{n+1}|-\alpha&=|z_n^2+c|-\alpha\\
&\geq |z_n|^2-|c|+|c|-\alpha^2 \\
&\geq (|z_n|+\alpha)(|z_n|-\alpha)
\end{align*} $$
Maintenant si $|z_n|\geq \alpha$ alors
$$|z_{n+1}|-\alpha\geq (|z_n|+\alpha)(|z_n|-\alpha)\geq 2\alpha(|z_n|-\alpha)\geq (2\alpha)^{n+1-k} (|z_n|-\alpha)$$
on obtient donc que la suite $|z_n|-\alpha$ diverge comme une suite géométrique de raison $2\alpha>1$ et de même pour $|z_n|$.  Maintenant on peut démontrer le théorème car
  • si $|z_0|= |c| > 2$ alors comme $P(x)=x^2-x- |c| $  est une fonction croissante (au moins pour $x>1/2$  car $P'(x)=2x-1$)  et  comme  $P( |c| )= |c| ^2-2 |c| >0$ on en déduit que la racine $\alpha \leq |c| $  donc on a bien $|z_0|>\alpha$ et la suite $(z_n)_{n\in{\mathbb N}}$  diverge.
  • inversement  si$|z_0|= |c| \leq 2$ alors $\alpha \leq{1+\sqrt{1+8}\over 2}=2$  donc si pour un certain $k$ on a $|z_k|\geq 2(\geq \alpha)$   on en déduit bien que  la suite $(z_n)_{n\in{\mathbb N}}$  diverge.

    De là on déduit  un algorithme  assez simple pour approcher les points de l'ensemble de Mandelbrot, qui consiste  à calculer pour une quadrillage de points les termes de la suite $(z_n)_{n\in{\mathbb N}}$ jusqu'à ce que $|z_k|>2$  . A chaque étape les points de l'ensemble de Mandelbrot  appartient forcément à l'ensemble des points pour lesquels on continue le calcul :

    tracé de l'ensemble de Mandelbrot
    z_0 = discrétisation du carré [-2.5;1.5]x[-1.5;1.5]
    z=z_0 et J=0*z
    pour k=1 à n
         calculer  z=z^2+z_0
         pour chaque (i,j)
              si | z(i,j)|>2  et J(i,j)=0  alors  J(i,j)=k
         fin
          afficher l'image des points (i,j) tels que  J(i,j)=0
    fin
        

    Si on conserve la valeur de $k$ à partir de laquelle  la suite $(|z_n|)_{n\in{\mathbb N}}$  franchit le seuil de 2  on peut tracer le graphe en associant une couleur à cette valeur $k$. En Scilab cela s'écrit assez rapidement à l'aide de la fonction Matplot :

    function mandelbrot()
        n=20 
        //initialisations
        dt=0.001
        t=[-1:dt:1]*1.5
        [x,y]=meshgrid(t-0.5,t)
        z0=x+%i*y
        z=0*z0
        J=zeros(z)
        //ouverture fenêtre graphique
        clf
        F=gcf()
        F.color_map=hotcolormap(steps+1)
        for k=1:n 
            // calcul de z_{k+1}
            z=z.^2+z0
            //si |z_k|>2 pour la 1er fois alors on affecte la couleur k dans J(z_0)
            J(find((abs(z)>2)&(J==0)))=k 
            //affichage  de la matrice J sous forme de couleurs
            drawlater 
            clf
            Matplot(J)
            A=gca();A.isoview="on"
            A.axes_visible=["off" "off"]
            drawnow 
            sleep(100) // pause pour voir la figure
        end
    endfunction
    

    Le théorème précédent s'applique aussi à la construction de l'ensemble de Julia :

    $$J(c) =\{z_0\in{\mathbb C}~|~ \text{la suite}~z_{n+1}=z_n^2+c~\text{reste bornée}\}$$

    il suffit de remplacer $z_0$ par $c$ dans la formule de récurrence, Pour c=-0.9  on obtient la figure suivante :

    ensemble de Julia pour c=-0.9
    Les points de l'ensemble de Mandelbrot  ont une interprétation géométrique étonnante du point de vu de l'ensemble de Julia: ce sont les complexes  pour lesquelles l'ensemble de Julia J(c)  est connexe. En prenant des valeurs de c proche du bord de l'ensemble de Mandelbrot on obtiendra donc des ensembles de Julia d'un seul tenant mais  avec un découpage proche de le séparer en plusieurs composantes.Vous pouvez essayer en cherchant des valeurs à partir de la figure suivante où on a affiché les coordonnées des points de l'ensemble de Mandelbrot.



     Si vous adorez l'ensemble de Mandelbrot sachez qu'on peut trouver de splendide poster du meilleur effet dans le bureau d'un prof de maths! J'ai acheté le mien via un projet financé sur Kickstarter

    Vintage Mandelbrot Map









    1 commentaire:

    Pour écrire des formules mathématiques vous pouvez utiliser la syntaxe latex en mettant vos formules entre des "dollars" $ \$....\$ $ par exemple :
    - $\sum_{n=1}^\infty {1\over n^2}={\pi^2\over 6}$ s'obtient avec \sum_{n=1}^\infty {1\over n^2}={\pi^2\over 6}
    - $\mathbb R$ s'obtient avec {\mathbb R} et $\mathcal D$ s'obtient avec {\mathcal D}
    - pour les crochets $\langle .,. \rangle$ dans les commentaires utilisez \langle .,. \rangle
    vous pouvez écrire du html dans les commentaires :
    - italique <i> ... </i> gras <b> ... </b>
    - lien <a href="http://adresse "> .... </a>