Les fractals par le calcul d'un ensemble de Julia

Présentation

Considérons la transformation zi+1 = zi2 + c, où toutes les quantités sont complexes.

Suivant la valeur de c et z0, la suite des zi va soit rester bornée ou diverger vers l'infini. On peut montrer que le rayon critique qui différencie ces deux comportements est donné par R(c) = max (2,|c|): dès qu'un zi dépasse ce rayon, les termes suivants tendent inexorablement vers l'infini. Pour un c donné, on peut donc cartographier les z0 qui donneront une suite bornée ou divergente. La frontière entre ces deux ensembles définit l'ensemble de Julia associé à la constante c.

Pour affiner cette description, on peut en fait distinguer les points z0 dont la suite dépasse le rayon critique R(c) après une itération, deux itérations, etc. Cette distinction nous conduit à définir les ensembles suivants:

Qc(-k)={z0 tq |zk| <= R(c)}

L'ensemble des points prisonniers (i.e., les z0 qui donnent une suite bornée) correspond à la limite où k tend vers l'infini.

Dans la figure suivante, nous avons illustré (par un niveau de gris "k+1") les ensembles Qc(-k) associés à la constante c=i:

Exercice

Vous allez reproduire la figure précédente. Vous allez pour cela considérer une grille reprenant la valeur des z0 ainsi qu'une grille reprenant les niveaux de gris correspondants. Vous attribuerez le niveau de gris "1" à tous les points tels que |z0| <= R(c). Il faut ensuite réaliser la transformation z1 = z02 + c et attribuer le niveau de gris "2" aux points tels que |z1| <= R(c). Vous continuerez ainsi jusqu'à z14.

Pour visualiser vos graphiques, vous pourrez utiliser le programme GetMap.exe. Le fichier de données doit respecter ce format.

Vous êtes libres de tester plusieurs valeurs de c (c=0.375+0.2 i et c=0.5+0.25 i sont d'autres valeurs intéressantes).

Calcul direct du fractal

On peut voir l'ensemble de Julia comme une limite séparant des trajectoires qui partent vers l'infini et d'autres trajectoires qui partent vers l'intérieur et resteront bornées. Intuitivement, en parcourant ces trajectoires à l'envers, on doit retomber sur l'ensemble de Julia. Dans un langage plus mathématique, l'ensemble de Julia est en fait un invariant de la transformation zi+1 = zi2 + c et de son inverse zi-1 = +/- sqrt ( zi - c). Il est un répulseur de la transformation directe et un attracteur de la transformation inverse.

Une méthode rapide pour calculer l'ensemble de Julia est de partir d'un point z quelconque et de lui appliquer itérativement la transformation inverse zi-1 = +/- sqrt ( zi - c). Puisque deux racines existent, on choisira à chaque itération l'une de celles-ci au hasard. La suite des points ainsi générés couvre le fractal, comme illustré sur la figure suivante:

Vous allez recalculer cette figure, en prenant une suite d'un million de points. Pour éviter tout effet transitoire, on peut partir d'un point fixe de l'équation z = z2 + c (la solution instable telle que |2z|>1 appartient au fractal). Afin de générer des nombres aléatoires, il suffit de faire call random_number(rnd), où rnd est un réel simple précision qui sera compris entre 0 et 1. Pour obtenir une série différente à chaque itération, il faut ajouter la sous-routine init_random_seed.f90 à votre projet et faire call init_random_seed() au début du programme.

Notez que le gfortran dérappe lorsqu'on prend la racine carrée d'un nombre complexe. Le mieux est de programmer vous-même cette racine carrée en utilisant la routine sqrt_cmplx.f90.

Pour mieux visualiser le caractère répétitif du fractal, vous pouvez exécuter JuliaAnimated.exe. L'animation zoome sur le point fixe du fractal associé à c=i. Le programme s'arrête au moment où il devient impossible de distinguer, en simple précision, le haut du bas de l'écran. On rencontre en quelque sorte les pixels du numérique ...

Quelques liens ...

Si l'on prend c=-2, le fractal se réduit à l'intervalle dense [-2,2] et il existe une correspondance exacte avec le systéme chaotique xi+1 = 4 xi (1-xi). Pour des valeurs plus petites de c (-3 par exemple), on obtient un ensemble de Cantor sur l'intervale [-|c|/2,|c|/2]. Quelque soit la valeur de c, l'ensemble de Julia correspondant est soit complètement connecté (comme pour -2 ou i) ou complètement disjoint (comme pour -3 ou 0.5+0.25 i). On peut montrer que tout dépend du comportement de z0=0: si la suite partant de ce point diverge, l'ensemble de Julia sera disjoint ; si cette suite reste bornée, l'ensemble de Julia sera connecté. L'ensemble de Mandelbrot est un autre fractal qui répertorie les valeurs de c associées à des ensembles de Julia connectés.

Afin de zoomer sur ce nouveau fractal, vous pouvez exécuter le programme MandelbrotAnimated.exe. L'animation zoome sur le point c = (-0.04288163, 0.98979723). Le programme s'arrête ici aussi au moment où les limites de la simple précision sont atteintes. Notez que dans un système physique où le fractal aurait une taille d'un millimètre, les pixels numériques de la simple précision correspondent aux dimensions atomiques.