© Copyright Franck CHEVRIER 2019-2022 https://www.python-lycee.com.
Les activités partagées sur Capytale sont sous licence Creative Commons.
Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.
Note : Cette activité ne nécessite pas la connaissance de l'écriture exponentielle d'un nombre complexe.
Pour tout $c \in \mathbb{C}$, on considère la suite de nombres complexes $(z_n)_{n \geq 0}$ définie par :
et on pose :
$\forall n \in \mathbb{N}$ ; $r_n = \lvert z_n \rvert$.
Pour chaque valeur de $c$, la suite $(r_n)_{n \geq 0}$ est soit bornée soit non bornée.
L'ensemble de Mandelbrot $\mathcal{M}$ est l'ensemble des nombres complexes $c$ tels que la suite $(r_n)_{n \geq 0}$ est bornée.
Dans cette partie, on pose $c=i$.
1.1. Déterminer les formes algébriques des termes $z_1$, $z_2$ , $z_3$ et $z_4$.
1.2. Émettre une conjecture sur la valeur de $z_n$ suivant les valeurs de $n$, et démontrer cette conjecture.
1.3. $i$ appartient-il à l'ensemble $\mathcal{M}$ de Mandelbrot ?
Dans cette partie, on pose $c=1+i$.
2.1. En langage Python, le nombre complexe $i$ se code 1j et la fonction abs permet de calculer le module d'un nombre complexe.
$\quad\;\;$a. Exécuter les cellules suivantes. Que permettent-elles de calculer ?
c = 1+1j ; z0 = 0
abs(z0)
z1 = z0**2 +c
z1
abs(z1)
$\quad\;\;$b. Effectuer des saisies pour calculer $z_2$ ; $z_3$, $r_2$ et $r_3$.
# Utiliser ces zones de saisie pour les calculs des termes
2.2. On souhaite maintenant automatiser le calcul des termes de la suite $(z_n)_{n \geq 0}$.
$\quad\;$a. Définir une fonction Python z qui reçoit en argument n et renvoie le nombre complexe $z_n$.
# Écrire ici la fonction Python z
$\quad\;$b. Effectuer des appels à la fonction z pour retrouver les valeurs de $z_1$ ; $z_2$ et $z_3$.
# Utiliser ces zones de saisie pour les calculs des termes
$\quad\;$c. À l'aide de la fonction Python z, déterminer $z_6$ puis $r_6$.
$\quad\quad$La suite $(r_n)_{n \geq 0}$ semble-t-elle bornée?
$\quad\quad$$1+i$ semble-t-il appartenir à l'ensemble $\mathcal{M}$ de Mandelbrot ?
# Utiliser ces zones de saisie pour les calculs
Dans cette partie, on revient au cas général où $c \in \mathbb{C}$ est quelconque.
3.1. Redéfinir la fonction Python z (vue en 2.2.a) pour qu'elle reçoive en arguments n et c (dans cet ordre) et renvoie le nombre complexe $z_n$.
# Écrire ici la fonction Python z
Pour la suite, on admettra et on utilisera le résultat suivant :
S'il existe un rang $N$ tel que $r_N>2$, alors la suite $(r_n)_{n \geq 0}$ n'est pas bornée, et le nombre $c$ n'appartient alors pas à l'ensemble $\mathcal{M}$ de Mandelbrot.
3.2. À l'aide de la fonction Python z, calculer $z_{10}$ puis $r_{10}$ dans le cas où $c=\displaystyle\frac{1+2i}{3}$.
$\quad\;$Le nombre $\displaystyle\frac{1+2i}{3}$ appartient-il à l'ensemble $\mathcal{M}$ de Mandelbrot ?
# Utiliser ces zones de saisie pour les calculs
3.3. Pour permettre de conjecturer si un nombre complexe $c$ appartient ou non à l'ensemble $\mathcal{M}$ de Mandelbrot, on considère la fonction Python app_M donnée ci-dessous. Décrire la méthode expérimentale utilisée : Quel critère est appliqué ?
def app_M(c,N=30):
"""
Fonction qui conjecture si c appartient à l'ensemble de Mandelbrot
"""
for n in range(N):
if abs(z(n,c))>2:
return False
return True
3.4. Effectuer des appels à la fonction app_M pour conjecturer si les nombres $\displaystyle\frac{1}{2}$ ; $\displaystyle\frac{i}{2}$ et $\displaystyle-\frac{3+2i}{5}$ appartiennent à $\mathcal{M}$.
# Utiliser ces zones de saisie pour les appels à la fonction app_M
3.5 Grâce à la fonction Python app_M, on peut approcher la représentation graphique de l'ensemble de Mandelbrot dans le plan complexe.
$\quad$Exécuter la fonction graph_M donnée ci-dessous pour visualiser $\mathcal{M}$ (patienter quelques instants pendant les calculs...).
#import des modules nécessaires
from PIL import Image, ImageDraw
def graph_M(app_M=app_M,profondeur=30,xmin=-2,xmax=1,ymin=-1,ymax=1,pix_unite=250,couleur_fond=(223,242,255),couleur_figure=(49,140,231),couleur_axes=(34,66,124),nom="Ensemble de Mandelbrot"):
"""
REPRESENTATION GRAPHIQUE D'UN ENSEMBLE DE COMPLEXES
app_M: fonction booléenne qui indique si un complexe appartient à l'ensemble représenté
profondeur: profondeur de la recherche pour la fonction app_M
xmin, xmax, ymin, ymax : paramètres de réglage de la fenêtre de visualisation
pix_unite: nombre de pixels par unité
couleur_fond: couleur du fond
couleur_figure: couleur de l'ensemble représenté
couleur_axes: couleur des axes
nom: nom de l'ensemble représenté
"""
# création du graphique
largeur=pix_unite*(xmax-xmin)+1 ; hauteur=pix_unite*(ymax-ymin)+1
Graphique = Image.new('RGB', (largeur,hauteur), color = couleur_fond )
Curseur = ImageDraw.Draw(Graphique)
# tracé de l'ensemble M
for X in range(largeur):
for Y in range(hauteur):
# création des coordonnées mathématiques correspondant aux coordonnées de l'image
x,y = xmin+X*(xmax-xmin)/largeur,ymin+(hauteur-Y)*(ymax-ymin)/hauteur
# construction du complexe c
c = complex(x,y)
# coloration du point si c appartient à M
if app_M(c,N=profondeur): Curseur.point([X, Y], couleur_figure)
def conv_coord(x,y):
"fonction qui convertit une coordonnée du repère mathématique en coordonnée sur l'image"
return (x-xmin)*pix_unite,(y-ymin)*pix_unite,
# tracé des axes
Curseur.line([conv_coord(xmin,0),conv_coord(xmax,0)],fill=couleur_axes)
Curseur.line([conv_coord(0,ymin),conv_coord(0,ymax)],fill=couleur_axes)
# création des graduations annotées
for x in range(int(xmin),int(xmax)+1):
Curseur.line([conv_coord(x,-0.02),conv_coord(x,0.02)], fill=couleur_axes)
Curseur.text(conv_coord(x+(-0.05 if x>=0 else 0.03),0.02),str(x),fill=couleur_axes)
for y in range(int(ymin),int(ymax)+1):
Curseur.line([conv_coord(-0.02,y),conv_coord(0.02,y)], fill=couleur_axes)
Curseur.text(conv_coord(0.02,y+(-0.07 if y>=0 else 0.03)),str(-y),fill=couleur_axes)
# écriture du titre / nom de la figure
Curseur.text((0,0),nom,fill=couleur_figure)
return Graphique
graph_M()
© Copyright Franck CHEVRIER 2019-2022 https://www.python-lycee.com.
Les activités partagées sur Capytale sont sous licence Creative Commons.
Dernière modification de l'activité : Juillet 2022