PANOMAND : Ensembles de Mandelbrot et de Julia

Dernière mise à jour : 4 Mars 2012


  1. Introduction
  2. L'ensemble de Mandelbrot
  3. Les ensembles de Julia
  4. Variation de l'exposant p
  5. Aspects théoriques
  6. La DLL FBMANDEL
  7. Le programme PANOMAND
  8. Exemples
  9. Conclusion
  10. Liens

I. Introduction

PANOMAND est un programme Windows permettant d'explorer les ensembles de Mandelbrot et de Julia. Ces figures fractales sont créées par itération d'une fonction complexe z → f(z) + c, où c est une constante complexe. La présente version est limitée à la fonction puissance f(z) = zp, où p est un exposant entier ou réel supérieur à 1. Ce programme est distribué dans l'archive panomand.zip.


II. L'ensemble de Mandelbrot

L'ensemble de Mandelbrot classique, nommé d'après le mathématicien Benoît Mandelbrot, correspond au cas p = 2. Plus précisément, il est défini comme l'ensemble des nombres complexes c pour lesquels la suite :

z0 = c
zn = (zn-1)2 + c

converge vers une valeur finie.

En pratique, la suite est évaluée en chaque point c du plan. Les points de l'ensemble sont colorés de la même couleur, et les points extérieurs à l'ensemble reçoivent une couleur fonction de leur vitesse de divergence.

Une vue générale de l'ensemble de Mandelbrot est donnée ici :



L'image est centrée en (-0,75, 0). L'échelle va de -2,35 à 0,85 horizontalement, et de -1,2 à 1,2 verticalement.


III. Les ensembles de Julia

Ces ensembles, nommés d'après le mathématicien Gaston Julia, sont définis d'une manière analogue à l'ensemble de Mandelbrot, sauf qu'ici le paramètre c est constant et la suite est initialisée avec les coordonnées zpixel du point considéré :

z0 = zpixel
zn = (zn-1)2 + c

Il y a donc un ensemble de Julia pour chaque valeur du paramètre c.

On montre que :


c = (-0,75 ; 0)

Ce point appartient à l'ensemble de Mandelbrot.
(il s'agit du point de jonction entre la cardioïde et le cercle principal)
L'ensemble de Julia est connecté.

c = (-0,75 ; 0,1)

Ce point est en-dehors de l'ensemble de Mandelbrot. L'ensemble de Julia est discontinu.



IV. Variation de l'exposant p

IV.A. Cas d'un exposant entier

Pour les valeurs entières de p (> 2) l'ensemble de Mandelbrot est centré en (0,0) et comporte (p - 1) lobes symétriques. Quand p est impair, l'un de ces lobes est situé sur l'axe des x négatifs. Ce lobe est absent quand p est pair.


p = 3

2 lobes (symétrie d'ordre 2). Pas de lobe sur l'axe des x.

p = 4

3 lobes (symétrie d'ordre 3). Un lobe sur l'axe des x.


Les ensembles de Julia correspondants ont une symétrie d'ordre p.

Exemple avec p = 5 et c = (-0,5 ; 0,64) :




IV.B. Cas d'un exposant non entier

Les figures présentent des discontinuités. En effet pour les valeurs non entières de p, zp est évalué comme exp(p ln z). Or le logarithme d'un nombre complexe est une fonction à valeurs multiples. Les discontinuités s'expliquent par la nécessité de choisir une valeur unique en chaque point de l'image.

Exemple avec p = 3,5 :



Il est intéressant d'étudier la transition d'un entier impair p vers un entier pair, en passant par les valeurs intermédiaires. Cela se traduit par la formation progressive du lobe situé sur l'axe des x. Ce lobe se forme par fusion de multiples "bourgeons" qui se développent progressivement en s'entourant de motifs complexes.


p = 3,85

Une étape de la formation du lobe situé sur l'axe des x, à partir de plusieurs fragments.

p = 3,85

Agrandissement (× 10) de l'image ci-contre, montrant quelques fragments et les motifs qui les entourent.



V. Aspects théoriques

Nous verrons ici quelques bases mathématiques du calcul de l'ensemble de Mandelbrot. Une connaissance élémentaire des nombres complexes est requise. Toutefois, on peut passer ce chapitre si l'on ne s'intéresse qu'aux images.

V.A. Itération de la fonction complexe

La suite zn = (zn-1)p + c est évaluée jusqu'à ce que le module |zn| soit supérieur au rayon d'échappement, ou que le nombre d'itérations soit supérieur à une valeur fixée à l'avance. Dans ce dernier cas, le point est considéré comme appartenant à l'ensemble.

V.B. L'estimateur de distance

Comme son nom l'indique, ce paramètre estime la distance entre le point testé et l'ensemble. Pour le calculer, on utilise le fait que le nombre d'itérations requis pour atteindre le rayon d'échappement augmente de plus en plus vite lorsqu'on s'approche de l'ensemble. Cette vitesse est estimée par la dérivée de la fonction itérée.

En fin d'itérations, l'estimateur de distance est donné par :

D = ( p |zn| ln |zn| ) / |z'n|

Cette valeur est d'autant plus faible que l'on est proche de l'ensemble.

V.C. La méthode du continuous dwell

Comme nous l'avons vu précédemment, la coloration des points extérieurs à l'ensemble dépend du nombre d'itérations requis pour atteindre le rayon d'échappement. A proximité de l'ensemble, ce nombre varie beaucoup d'un point à l'autre et le mélange de couleurs qui en résulte donne à la figure un aspect brouillé. Pour y remédier, on peut "lisser" la distribution du nombre d'itérations en lui appliquant une transformation logarithmique. La formule utilisée ici est la suivante :

Dwell = Iter - logp ( ln |zn| ) + logp ( ln Esc )

où Iter désigne le nombre d'itération et Esc le rayon d'échappement. La fonction logp est le logarithme de base p, tel que logp z = ln z / ln p


VI. La DLL FBMANDEL

Les calculs précédents sont implantés dans la DLL fbmandel.bas écrite en FreeBASIC et basée sur la bibliothèque fbcomplex de calcul des nombres complexes. Nous présentons ici les principaux algorithmes utilisés ainsi que les fonctions exportées par la DLL.

VI.A. Format de l'image

L'image est en 640 × 480, 32 bits. Elle est centrée en (x0 , y0). La résolution est définie par le paramètre ZoomFact, tel que la valeur ZoomFact = 1 corresponde à une échelle verticale de 4 (soit une échelle horizontale de 4 × 4 / 3 = 5,333 ...). L'échelle verticale pour une valeur quelconque de ZoomFact est donc 4 / ZoomFact. Si Scale désigne l'échelle en pixels, on en déduit un facteur d'échelle :

  ScaleFact = 4 / (Scale * ZoomFact)

Ce facteur représente la distance entre 2 pixels. Il permet de passer des coordonnées (Nx, Ny) d'un point, exprimées en pixels, à ses coordonnées algébriques (x, y) par :

  x = x0 + ScaleFact * (Nx - HalfPicWidth) 
  y = y0 - ScaleFact * (Ny - HalfPicHeight) 

HalfPicWidth et HalfPicHeight désignent la demi-largeur et la demi-hauteur de l'image (soit 320 et 240 dans notre cas).

Le balayage complet de l'image est alors assuré par les deux boucles suivantes :

  for Ny = 0 to PicHeight - 1
    yt = y0 - ScaleFact * (Ny - HalfPicHeight)  
    for Nx = 0 to PicWidth - 1
      xt = x0 + ScaleFact * (Nx - HalfPicWidth)    
      pset (Nx, Ny), Mandelbrot(xt, yt)
    next Nx
  next Ny  

PicWidth et PicHeight désignent la largeur et la hauteur de l'image (soit 640 et 480 dans notre cas). La fonction Mandelbrot retourne la couleur du point.

VI.B. Calcul des itérations

Les itérations au point de coordonnées algébriques (xt, yt) se font dans la fonction Mandelbrot et portent simultanément sur la fonction complexe et sa dérivée, au moyen du code suivant :

  if Julia then
    c = cJulia
    z = Cmplx(xt, yt)
    dz = C_one
  else
    c = Cmplx(xt, yt)
    z = C_zero
    dz = C_zero
  end if
  
  Iter = 0
  Module = CAbs(z)
  
  do while Iter < MaxIter and Module < Esc
    
    zp1 = z ^ p1      
    zn = z * zp1 + c  
    
    dzn = p * zp1 * dz               
    if not Julia then dzn = dzn + 1  
   
    Module = CAbs(zn) 
    
    z = zn
    dz = dzn
    Iter = Iter + 1
    
  loop

On sort de la boucle de deux manières :

VI.C. Attribution des couleurs

Nous utilisons une version simplifiée d'un algorithme décrit par Robert Munafo, et dont nous ne donnerons ici que les grandes lignes :

VI.D. Fonctions exportées par la DLL

La DLL exporte 4 fonctions:


VII. Le programme PANOMAND

Ce programme écrit en PANORAMIC fournit une interface graphique à la DLL précédente.




Les valeurs des différents paramètres sont saisis dans les cases correspondantes. Les coordonnées X et Y sont celles du centre de l'image. Le bouton "Graph" lance le calcul. L'image est générée dans une fenêtre secondaire, puis transférée dans la fenêtre principale. L'image est sauvegardée dans le fichier fractal.bmp. Les paramètres sont enregistrés dans le fichier texte fractal.par. Le bouton "Save file" permet de sauvegarder sous un autre nom, tandis que le bouton "Open file" permet de charger une image déjà créée.

Pour passer de l'ensemble de Mandelbrot à l'ensemble de Julia, cliquez sur le bouton "Mandelbrot". Il prendra le titre "Julia" et les coordonnées du centre de l'image deviendront celles du paramètre c pour l'ensemble de Julia, apparaissant dans les cases "c_X" et "c_Y". Les anciennes coordonnées seront remplacées par zéro, de manière à centrer l'ensemble en (0, 0).

En cliquant sur un point de l'image, on obtient ses coordonnées dans les cases X et Y. On peut ainsi faire des agrandissements en augmentant progressivement le facteur de zoom.


VIII. Exemples

Nous présentons ici quelques images réalisées avec PANOMAND et montrant l'une des parties les plus célèbres de l'ensemble classique de Mandelbrot : la vallée des hippocampes.

Cette région, également appelée seahorse valley, se trouve entre la cardioïde et le disque principal. Son versant "est" contient des structures en forme d'hippocampe, tandis que son versant "ouest" contient des structures en forme de double spirale.


Fig. 01

Vue générale de la vallée des hippocampes



Fig. 02a

Agrandissement du versant "ouest" de la vallée,
montrant un motif en double spirale.

Fig. 02b

Agrandissement du versant "est" de la vallée, montrant un motif en hippocampe.



Fig. 03

Partie supérieure de la "queue" de l'hippocampe,
montrant des motifs en forme de "double crosse".

Fig. 03a

Agrandissement d'une "double crosse".
Au centre, un mini-ensemble de Mandelbrot.



Fig. 04

Agrandissement du mini-ensemble de la figure précédente.

Fig. 05

Plongée dans la "vallée des hippocampes" de ce mini-ensemble.



Fig. 06

A l'intérieur de cette vallée, on retrouve les motifs en "double crosse" ...

Fig. 07

... mais au lieu d'un mini-ensemble de Mandelbrot, on y trouve une structure
ressemblant à un ensemble de Julia : c'est un embedded Julia set (EJS).



Fig. 08

Agrandissement de l'EJS. Noter la symétrie d'ordre 2.

Fig. 09

Agrandissement du centre de l'EJS. Le motif central est appelé "noyau".



Fig. 10

Agrandissement du noyau, avec au centre : le "nucléole" ...

Fig. 11

... qui contient un mini-ensemble de Mandelbrot.


L'agrandissement de la dernière image atteint pratiquement la limite de ce que l'on peut faire avec PANOMAND. Nous sommes donc obligés d'arrêter notre exploration ici. Heureusement, il y a beaucoup d'autres régions intéressantes dans l'ensemble de Mandelbrot, en particulier :


IX. Conclusion

Nous espérons que ces quelques exemples vous auront donné l'envie d'explorer plus avant l'ensemble de Mandelbrot.

N'hésitez pas à générer vos propres images. Il y a encore beaucoup de choses à découvrir !


X. Liens




Retour au sommaire