Activité 8 - Python - Mandelbrot
Compétences évaluées |
---|
Concevoir des solutions algorithmiques |
Traduire un algorithme dans un langage de programmation |
Faire preuve d’autonomie, d’initiative et de créativité |
Créez un dossier et sauvegardez votre travail.
Quel est le point commun entre un chou romanesco, les côtes terrestres, une feuille de fougère ou bien encore un flocon de neige ? Tous ces éléments sont de nature fractale, c’est-à-dire qu’ils possèdent une propriété d’autosimilarité quelle que soit l’échelle à laquelle on les observe. Autrement dit, le tout est semblable à l’une de ses parties.
C’est en reprenant les travaux de Gaston Julia et Pierre Fatou que Benoît Mandelbrot a introduit et définit le terme « fractale ». Grâce aux moyens informatiques dont il disposait, il a pu obtenir une représentation « visuelle » de ces objets mathématiques que ces prédécesseurs ne pouvaient seulement qu’imaginer.
Nous allons tout d’abord définir l’ensemble de Mandelbrot, écrire un algorithme permettant de déterminer si un point du plan fait partie ou non de cet ensemble et enfin écrire un programme Python permettant de visualiser la fractale de Mandelbrot.
1) Définition de la fractale de Mandelbrot¶
Soit un point donné \(C(C_{x}, C{y})\) du plan muni d’un repère \((O, \vec{u}, \vec{v})\). Pour tout entier naturel n, on construit, à partir des coordonnées de ce point C, une suite de points défini par les relations de récurrence suivantes :
Pour déterminer si le point C appartient ou non à l’ensemble de Mandelbrot, on commence par calculer quelques termes des suites \((x_n)\) et \((y_n)\). Prenons deux exemples concrets (en arrondissant les résultats) :
- Soit C(1; 1), alors la suite des points \((M_n)\) construite à partir de ce point C est \(M_0(0; 0)\) ; \(M_1(1; 1)\) ; \(M_2(1; 3)\) ; \(M_3(-7; 7)\) ; \(M_4(1; -97)\) ; \(M_5(-9407; -193)\)
- Soit C(0,1; 0,2), alors la suite des points \((M_n)\) construite à partir de ce point C est \(M_0(0; 0)\) ; \(M_1(0,1; 0,2)\) ; \(M_2(0,07; 0,24)\) ; \(M_3(0,0473; 0,234)\) ; \(M_4(0,0477; 0,222)\) ; \(M_5(0,0529; 0,221)\)
Nous allons nous intéresser à la distance \(OM_{n} = \sqrt{x_{n}^2 + y_{n}^2}\), c'est à dire à la distance qui sépare le point \(M_{n}\) de l'origine du repère et nous pouvons constater que deux cas de figures peuvent se présenter :
- Soit la distance \(OM_{n}\) augmente infiniment, autrement dit les suites \((x_{n})\) et \((y_{n})\) divergent vers l'infini
- Soit la distance \(OM_{n}\) est bornée, autrement dit les suites \((x_{n})\) et \((y_{n})\) sont bornées.
Evidemment, tout ceci n’est que conjecture puisque nous n’avons calculé que les 6 premiers termes de chaque suite. Toutefois, un résultat que l’on admettra permet d’affirmer que si la distance \(OM_{n}\) devient supérieure à 2 à partir d’un certain rang, alors les suites divergent et la distance \(OM_{n}\) tend vers l’infini. En revanche, si pour une certaine valeur de n suffisamment grande, la distance \(OM_{n}\) reste inférieure à 2, alors on pourra considérer que les deux suites sont bornées et que cette distance \(OM_{n}\) est bornée (minorée par 0 et majorée par 2).
La règle de prise de décision quant à l’appartenance du point \(C(c_{x}, c_{y})\) à l’ensemble de Mandelbrot est alors la suivante :
- Soit le point \(M_n\) « s’éloigne » infiniment de l’origine auquel cas le point C n’appartient pas à l’ensemble de Mandelbrot, ce qui est le cas du point C de coordonnées (1; 1).
- Soit le point \(M_n\) « reste » au voisinage de l’origine c’est-à-dire dans un cercle de centre O et de rayon 2, auquel cas le point C appartient à l’ensemble de Mandelbrot, c’est le cas du point C de coordonnées (0,1; 0,2).
2) La fractale de Mandelbrot en Python¶
Maintenant que nous pouvons dire si un point du plan fait partie ou non de l’ensemble de Mandelbrot, nous allons pouvoir visualiser cet ensemble en utilisant l’outil informatique. L’algorithme est le suivant :
Affecter à MAX_ITERATION une valeur seuil
Pour chaque pixel C de coordonnées (i;j) de l'écran
Convertir (i;j) dans le système de coordonnées du repère
Tant Que la distance OMn < 2 et que n < MAX_ITERATION
Calculer les coordonnées de Mn
Affecter à n la valeur n + 1
Fin Tant Que
Si n = MAX_ITERATION Alors
Colorier le pixel en noir
Sinon
Colorier le pixel en blanc
Fin Si
Fin Pour
L’algorithme est relativement simple. Il balaye l’écran pixel par pixel en convertissant ses coordonnées dans le système de coordonnées de notre repère pour savoir si celui-ci fait partie ou non de l’ensemble de Mandelbrot. A la sortie de la boucle « Tant Que », deux cas de figures se présentent :
- Soit on est sorti de la boucle parce que la distance \(OM_{n}\) est devenue plus grande que 2 auquel cas le pixel (et donc le point C) ne fait pas partie de l’ensemble de Mandelbrot, on lui attribue alors la couleur blanche.
- Soit on est sorti de la boucle parce que le seuil du nombre d’itérations maximales est atteint, c’est-à-dire qu’on a calculé suffisamment de termes de la suite pour considérer que la distance \(OM_{n}\) restera toujours plus petite que 2 auquel cas le pixel (et donc le point C) fait partie de l’ensemble de Mandelbrot et on lui attribue la couleur noire.
On étudiera l'ensemble de Mandelbrot sur une partie du plan.
Vous pouvez utiliser les paramètres suivants, où LONGUEUR
et LARGEUR
correspondent aux dimensions de l'image.
# Longueur et largeur de l'image.
LONGUEUR = 600
LARGEUR = 400
# Réduire si les calculs sont trop longs.
MAX_ITERATION = 50
# On s'intéresse uniquement à une partie du plan.
X_DEBUT = -2
X_FIN = 1
Y_DEBUT = -1
Y_FIN = 1
Vous pouvez vous aider de la fonction suivante pour transformer les coordonnées du pixel correspondant à l'image en coordonnées ramenées à la restriction du plan délimité par X_DEBUT
et X_FIN
sur l'axe des abscisses et par Y_DEBUT
et Y_FIN
sur l'axe des ordonnées.
def changer_coordonnees(point):
"""
Args:
point (tuple): oordonnées du point par rapport aux dimensions de l'image
Returns:
tuple : nouvelles coordonnées du point par rapport à une partie du plan
"""
return (X_DEBUT + (point[0] / LONGUEUR) * (X_FIN - X_DEBUT),
Y_DEBUT + (point[1] / LARGEUR) * (Y_FIN - Y_DEBUT))
TRAVAIL A FAIRE |
---|
Réaliser un programme python permettant d’afficher l’ensemble de Mandelbrot. Vous utiliserez la bibliothèque d’image PIL.On découpera l’algorithme en fonctions judicieusement choisies et documentées. |