© 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.
Pour tout $c \in \mathbb{C}$ et tout $a \in \mathbb{C}$, on considère la suite de nombres complexes $(z_n)_{n \geq 0}$ définie par :et on pose :
- $z_0=a$ ;
- $\forall n \in \mathbb{N}$ ; $\displaystyle z_{n+1}=z_n^2+c$.
$\forall n \in \mathbb{N}$ ; $r_n = \lvert z_n \rvert$.
On considère que $c$ est fixé.
Pour chaque valeur de $a$, la suite $(r_n)_{n \geq 0}$ est soit bornée soit non bornée.
L'ensemble de Julia $\mathcal{J}_c$ est l'ensemble des nombres complexes $a$ tels que la suite $(r_n)_{n \geq 0}$ est bornée.
1.1. Écrire une fonction Python z qui reçoit en arguments n,a,c (dans cet ordre) et qui renvoie le terme $z_n$.
# Écrire ici la fonction Python z
def z(n,a,c):
m = a
for k in range(n):
m = m**2 + c
return m
1.2. Dans cette question, on fixe $c=0,25+0,5i$.
$\quad\;$Exécuter la cellule suivante. Que représentent les valeurs obtenues dans la liste ?
$\quad\;$Le nombre $a=i$ semble-t-il appartenir à $\mathcal{J}_{0,25+0,5i}$ ? Justifier.
$\quad\;$Aide : La fonction Python abs permet de calculer le module d'un nombre complexe.
Les valeurs obtenues dans la liste sont les valeurs $r_n=\lvert z_n \rvert$ pour $0 \leq n \leq 20$.
La suite $(r_n)_{n \geq 0}$ ne semble pas bornée, donc on peut conjecturer que $a=i \notin \mathcal{J}_{0,25+0,5i}$.
c = 0.25+0.5j
a = 1j
[abs(z(n,a,c)) for n in range(21)]
1.3. Effectuer une(des) saisie(s) permettant de conjecturer si le nombre $a=0,25$ appartient à $\mathcal{J}_{0,25+0,5i}$.
$\quad\;\;$Faire de même pour conjecturer si $a=0,9i$ appartient à $\mathcal{J}_{0,25+0,5i}$.
c = 0.25+0.5j
a = 0.25
[abs(z(n,a,c)) for n in range(21)]
c = 0.25+0.5j
a = 0.9j
[abs(z(n,a,c)) for n in range(21)]
Dans cette partie, on souhaite représenter dans le plan complexe un ensemble de Julia $\mathcal{J}_c$.
Pour cela, pour chaque valeur de $a$, on calcule $M=r_{20}=\lvert z_{20} \rvert$.
On fait l'approximation que plus la valeur $M$ est élevée, plus la probabilité que $a$ appartienne à $\mathcal{J}_c$ est faible.
2.1. Dans cette question, on pose $c=0,25+0,5i$.
$\quad\;\;$Effectuer une saisie Python pour calculer $M$ dans le cas où $a=0,2+0,3i$.
$\quad\;\;$Le nombre $a=0,2+0,3i$ semble-t-il appartenir à $\mathcal{J}_{0,25+0,5i}$ ?
La valeur de $M$ obtenue est faible, et on peut donc conjecturer que $a=0,2+0,3i \in \mathcal{J}_{0,25+0,5i}$.
c = 0.25+0.5j
a = 0.2+0.3j
M =abs(z(20,a,c))
M
2.2. Écrire une fonction Python M qui reçoit en arguments a,c (dans cet ordre) et renvoie la valeur de $M=r_{20}$ correspondante. Effectuer un appel à cette fonction pour retrouver la valeur de $M$ de la question 2.1.
# Écrire ici la fonction Python M
def M(a,c):
"""
fonction de calcul de r20
"""
return abs(z(20,a,c))
# Tester ici la fonction M
M(0.2+0.3j,0.25+0.5j)
2.3. Exécuter la cellule ci-dessous. La fonction Python graph_Julia ci-dessous permettra la représentation graphique d'un ensemble de Julia (elle utilise les valeurs fournies par la fonction Python M).
#import des modules nécessaires
from PIL import Image, ImageDraw
def graph_Julia(c,M=M,xmin=-2,xmax=2,ymin=-2,ymax=2,pix_unite=150,couleur_fond=(240,245,255),couleur_figure=(80,0,80),couleur_axes=(50,10,10)):
"""
REPRESENTATION GRAPHIQUE D'UN ENSEMBLE DE COMPLEXES
M: fonction booléenne qui indique si un complexe appartient à l'ensemble représenté
xmin, xmax, ymin, ymax : paramètres de réglage de la fenêtre de visualisation
pix_unite: nombre de pixels par unité
couleur_figure: couleur de l'ensemble représenté
couleur_axes: couleur des axes
"""
# fonction pour le dégradé de couleur de la figure
def couleur(t,r,g,b,rmax,gmax,bmax,coeff=100):
degrad=int(t*coeff)
return min(degrad+r,rmax),min(degrad+g,gmax),min(degrad+b,bmax)
# 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 a
a = complex(x,y)
# coloration du point si a appartient à Jc
try:
Curseur.point([X, Y], couleur(M(a,c),*couleur_figure,*couleur_fond))
except:
Curseur.point([X, Y], couleur_fond)
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),"Ensemble de Julia\navec c="+str(c),fill=couleur_figure)
return Graphique
a. Exécuter la cellule ci-dessous pour obtenir une représentation de $\mathcal{J}_{0,25+0,5i}$.
$\quad$Vérifier graphiquement vos réponses aux questions 1.2 , 1.3 et 2.1.
graph_Julia(0.25+0.5j)
b. Exécuter les cellules ci-dessous pour obtenir des représentations d'autres ensembles de Julia.
$\quad$Tester ensuite d'autres valeurs pour $c$...
graph_Julia(0.285+0.01j)
graph_Julia(-0.8+0.156j)
graph_Julia(0.35+0.2j)
graph_Julia(0.3+0.5j)
graph_Julia(0.25-0.005j)
© 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