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:
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:
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).
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 ...
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.