© 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$.
$z_1=z_0^2+i=0^2+i=i$
$z_2=z_1^2+i=i^2+i=-1+i$
$z_3=z_2^2+i=(-1+i)^2+i=-i$
$z_4=z_3^2+i=(-i)^2+i=-1+i$
1.2. Émettre une conjecture sur la valeur de $z_n$ suivant les valeurs de $n$, et démontrer cette conjecture.
Au vu des valeurs précédemment calculées, on peut conjecturer que $\forall k \geq 1$ ; $z_{2k}=-1+i\;$ et $\;z_{2k+1}=-i$, qui se démontre par une récurrence immédiate.
1.3. $i$ appartient-il à l'ensemble $\mathcal{M}$ de Mandelbrot ?
D'après ce qui précède, la suite $(r_n)$ est bornée : $\forall n \in \mathbb{N}$ ; $r_n = \lvert z_n \rvert \leq \text{max}( \lvert i \rvert;\lvert -1+i \rvert;\lvert -i \rvert ) =\displaystyle\frac{\sqrt{2}}{2}$ et on en déduit donc que $i \in \mathcal{M}$
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 ?
Les saisies permettent de calculer successivement $z_0$ ; $r_0$ ; $z_1$ et $r_1$.
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
z2 = z1**2+c
z2
z3 = z2**2+c
z3
abs(z2)
abs(z3)
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
def z(n):
"""
Fonction qui calcule le terme de rang n de la suite (zn) pour c=1+i
"""
m = 0
c = 1+1j
for k in range(n):
m = m**2+c
return m
$\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
z(1)
z(2)
z(3)
$\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 ?
Au vu de la valeur de $r_6=\lvert z_6 \rvert$, on peut conjecturer que $1+i \notin \mathcal{M}$.
# Utiliser ces zones de saisie pour les calculs
z(6)
abs(z(6))
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
def z(n,c):
"""
Fonction qui calcule le terme de rang n de la suite (zn)
"""
m = 0
for k in range(n):
m = m**2+c
return m
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 ?
Comme $r_{10}=\lvert z_{10} \rvert >2$, on en déduit que $\displaystyle\frac{1+2i}{3} \notin \mathcal{M}$.
# Utiliser ces zones de saisie pour les calculs
z(10,(1+2j)/3)
abs(z(10,(1+2j)/3))
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é ?
L'algorithme teste si $\lvert z_n \rvert>2$ pour toutes les valeurs entières $n$ de $0$ à $29$. Dès qu'une de ces conditions est vérifiée, l'algorithme renvoie False qui signifie que $c \notin \mathcal{M}$. Dans le cas où aucune de ces conditions n'est vérifiée, on fait l'approximation que $c \in \mathcal{M}$ et l'algorithme renvoie True.
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
app_M(1/2)
app_M(1j/2)
app_M(-(3+2j)/5)
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