import matplotlib.pyplot as plt4 Représentations graphiques
Représenter graphiquement des résultats issus de calculs numériques ou symboliques est indispensable pour les analyser ou les interpréter. Le module Matplotlib permet de faire des représentations graphiques très variées. La documentation de Matplotlib est disponible ici.
Pour l’utiliser, il est d’usage de l’importer ainsi:
et souvant NumPy est également très utile:
import numpy as npExercice 4.1 - Représentations graphiques
Par exemple la fonction plot peut être utilisée pour représenter la fonction \(x^2\):
x = np.linspace(0,1,50)
y = x**2
plt.plot(x,y)
plt.show()
Afin de définir une jolie figure pouvant être exportée comme sur la Figure 4.1, la syntaxe est la suivante:
plt.figure(figsize=(8,5)) # taille de la figure (en inches)
plt.title(r'Graphique de $x^2$') # titre de la figure (du code LaTeX peut être inclus)
plt.xlabel(r'$x$') # titre de l'axe horizontal
plt.ylabel(r'$y$') # titre de l'axe vertical
plt.plot(x, y, marker='o', label=r"$x^2$") # légende
plt.legend() # affiche la légende
plt.savefig("test.pdf") # exporte la figure en PDF
plt.savefig("test.png", dpi=100) # exporte la figure en PNG
plt.show()
a. Représenter graphiquement sur la même figure les fonctions \(\sin(kx)\) et \(\cos(kx)\) pour \(k=1,2,3\) sur \(x\in[0,2\pi]\). Faire en sorte que les graduations sur l’axe horizontal soient tous les \(\frac{\pi}{2}\), comme sur la Figure 4.2.

b. Regarder l’aide de la fonction imshow et l’utiliser pour représenter graphiquement une matrice de nombres aléatoires dans \([0,1]\) de taille \(10\times10\), comme sur la Figure 4.3.

c. Représenter graphiquement la fonction \(f(x,y) = \frac{-y}{5} + e^{-x^2-y^2}\) pour \(x\in[-3,3]\) et \(y\in[-3,3]\) en densité et avec des courbes de niveau, comme sur la Figure 4.4.

Exercice 4.2 - Chaos déterministe
Le but est d’étudier un modèle extrêmement élémentaire d’évolution d’une population. Malgré son caractère simpliste, ce modèle présente de nombreuses propriétés très intéressantes, en particulier chaotiques.
La proportion d’une population à un temps discret \(i\in\mathbb{N}\) est notée \(x_{i}\in[0,1]\). L’évolution de la population est donnée par \(x_{i+1}=f_{\!\mu}(x_{i})\) où \(f_{\!\mu}:[0,1]\to[0,1]\) est la fonction définie par:
\[ f_{\!\mu}(x)=\mu x(1-x) \,. \]
Le paramètre \(\mu\in[0,4]\) décrit la croissance de la population. L’application \(f_{\!\mu}\) est appelée l’application logistique de paramètre \(\mu\).
a. Définir la fonction \(f_{\!\mu}\) en Python comme \(\mathtt{f}(\mathtt{x},\mathtt{mu})=f_{\!\mu}(x)\) et la représenter graphiquement pour plusieurs valeurs de \(\mu\).
b. Pourquoi la valeur de \(\mu\) ne peut-elle pas être supérieure à 4 dans le modèle ?
c. Définir une fonction qui prend comme argument une valeur de \(\mu\), une donnée initiale \(x_{0}\in[0,1]\) et un nombre \(n\in\mathbb{N}\) et retourne la liste \(S_{\mu}^{n}=(x_{0},x_{1},x_{2},\dots,x_{n})\). Modifier cette fonction pour qu’elle puisse prendre un paramètre optionnel \(m\in\mathbb{N}\) et retourne la liste \(S_{\mu}^{m,n}=(x_{m},x_{m+1},\dots,x_{n})\), c’est-à-dire retire les \(m-1\) premiers éléments à \(S_{\mu}^{n}\).
d. Tester cette fonction en faisant la représentation graphique de la liste \(S_{\mu}^{n}\) pour différentes valeurs des paramètres \(x_{0}\) et \(\mu\). Observer les différents comportements de la suite.
Diagramme araignée. Une façon d’étudier plus spécifiquement ce qui se passe lorsque \(\mu\) varie est de faire un diagramme dit araignée qui consiste à relier par des droites les points:
\[ \bigl\{(x_{0},0),(x_{0},x_{1}),(x_{1},x_{1}),(x_{1},x_{2}),(x_{2},x_{2}),\dots,(x_{n},x_{n}),(x_{n},x_{n+1})\bigr\} . \]
e. Définir une fonction qui retourne la liste des points nécessaire pour construire le diagramme araignée.
f. Définir une fonction qui trace le graphe de la fonction \(f_{\!\mu}\), le graphe de la fonction identité, ainsi que les segments reliant les points de la liste précédente.
g. En expérimentant, étudier qualitativement les effets des paramètres \(\mu\) et \(x_{0}\). Décrire le comportement observé lorsque \(\mu\) augmente.
Diagramme de bifurcation. Les expérimentations précédentes laissent penser que le comportement de la suite \(x_{i}\) en temps grand (i.e. lorsque \(i\) est grand) est indépendant du choix de la condition initiale \(x_{0}\) mais dépend beaucoup de la valeur du paramètre \(\mu\). Le but de cette section est de représenter graphiquement pour chaque valeur de \(\mu\) l’ensemble des points \(S_{\mu}^{m,n}=(x_{m},x_{m+1},\dots,x_{n})\), en mettant \(\mu\) sur l’axe horizontal et toutes les valeurs de \(S_{\mu}^{m,n}\) sur l’axe vertical. Un bon choix de paramètres pour nettoyer le diagramme et garder seulement le comportement en temps long du système est \(n=200\) et \(m=100\) par exemple.
h. Définir une fonction qui pour une liste \(L\) de valeurs de \(\mu\) donnée, une donnée initiale \(x_{0}\in[0,1]\) et des entiers \(m,n\in\mathbb{N}\) retourne la liste des points \(\bigl\{(\mu,x):x\in S_{\mu}^{m,n}\;\text{pour}\;\mu\in L\bigr\}\).
i. Définir une fonction qui représente graphiquement cette liste de points. Il est suggéré de prendre pour \(L\) une liste de 1 000 valeurs dans l’intervalle \([0,4]\).
j. Interpréter le diagramme obtenu, en particulier ce qu’il dit sur le comportement en temps long du système. Déterminer approximativement pour quelles valeurs de \(\mu\) le système :
- possède zéro comme unique point fixe;
- possède un unique point fixe non nul;
- oscille entre deux valeurs distinctes (cycle de longueur deux);
- oscille entre quatre valeurs distinctes (cycle de longueur quatre);
- oscille entre trois valeurs distinctes (cycle de longueur trois).
Représentation de l’attracteur. Pour des valeurs de \(\mu\) proches de 4, les valeurs de la population \(x_{i}\) ont l’air d’être plus ou moins aléatoires. Pourtant, le système est purement déterministe dans le sens où pour une valeur initiale \(x_{0}\) donnée, la population \(x_{i}\) est définie sans aléa. Ce comportement a priori aléatoire est appelé chaos déterministe. Pour bien remarquer que les points \(x_{i}\) ne sont pas déterminés de manière aléatoire, le but est de représenter graphiquement les points \((x_{n},x_{n+1})\) et de voir que \(x_{n+1}\) n’est pas du tout aléatoire par rapport à \(x_{n}\).
k. Pour chaque valeur de \(\mu\) fixée, définir une fonction qui retourne la liste de points:
\[ \bigl\{(x_{m},x_{m+1}),(x_{m+1},x_{m+2}),\dots,(x_{n},x_{n+1})\bigr\} \,. \]
l. Représenter graphiquement ces points pour différentes valeurs de \(\mu\). Par exemple \(n=5 000\) et \(m=100\) est un bon choix de paramètres.
m. Comment serait le graphique précédent si chaque \(x_{i}\) était tiré aléatoirement dans l’intervalle \([0,1]\) indépendamment de \(x_{i-1}\) ?
Exercice 4.3 - Ensemble de Mandelbrot
L’ensemble de Mandelbrot est défini comme l’ensemble des points \(c\in\mathbb{C}\) pour lesquels la suite de nombres complexes définis récursivement par \(z_0=0\) et
\[ z_{n+1} = z_n^2+c \,, \]
est bornée. Il est possible de montrer que \(c\in\mathbb{C}\) est dans l’ensemble de Mandelbrot si et seulement si \(|z_n|\leq2\) pour tout entier \(n\).
a. Écrire une fonction mandelbrot(c) qui vérifie si le point \(c\in\mathbb{C}\) est dans l’ensemble de Mandelbrot de manière approximative en testant les cent premières itérations.
b. Tester la fonction précédente avec \(c=0\) et \(c=1+i\). Qu’est-il attendu théoriquement ?
c. Écrire une fonction mandelbrot_set(N) qui génère un tableau de taille \(N\times N\) représentant l’ensemble \(c \in \big\{x+iy: x\in[-2,2] \; \text{et} \; y\in[-2,2]\big\}\) et qui retourne un tableau de booléens de taille \(N\times N\) déterminant si le point associé est dans l’ensemble de Mandelbrot ou non.
d. En utilisant la fonction précédente avec \(N=100\), représenter graphiquement avec imshow une approximation de l’ensemble des points appartenant à l’ensemble de Mandelbrot.
e. En adaptant les fonctions précédentes, représenter graphiquement le logarithme du nombre d’itérations nécessaires avant de ne plus satisfaire \(|z_n|\leq 2\) au lieu d’un booléen, comme représenté à la Figure 4.5.

f. !! La méthode précédente a le désavantage de procéder séquentiellement au calcul pour chaque valeur de \(c\), ce qui rend l’évaluation assez lente. Proposer une nouvelle implémentation permettant de calculer parallèlement toutes les valeurs en utilisant les indexages NumPy.
Exercice 4.4 - Représentations graphiques avancées !
Le but de cet exercice est de découvrir un panel des possibilités offertes par Matplotlib.
a. Tracer les lignes de courant du champ de vecteur de l’oscillateur de Van der Pol:
\[\begin{pmatrix}y\\ -x+\mu(1-x^{2})y \end{pmatrix}\]
pour différentes valeurs de \(\mu\in\mathbb{R}\).
b. Représenter graphiquement la courbe paramétrique:
\[\begin{pmatrix}\left(1+t^{2}\right)\sin(2\pi t)\\ \left(1+t^{2}\right)\cos(2\pi t)\\ t \end{pmatrix}\]
pour \(t\in[-2,2]\).
c. Représenter la fonction de deux variables:
\[ f(x,y)=\sin\left(\sqrt{x^{2}+y^{2}}\right) \]
en trois dimensions pour \(x\in[-5,5]\) et \(y\in[-5,5]\).
d. !! Représenter le ruban de Möbius donné comme surface paramétrique :
\[\begin{pmatrix}\left(3+v\cos(u/2)\right)\cos u\\ \left(3+v\cos(u/2)\right)\sin u\\ v\sin(u/2) \end{pmatrix}\]
pour \(u\in[0,2\pi]\) et \(v\in[-1,1]\).
e. !! Regarder les exemples disponibles ici et en choisir deux à comprendre et à modifier.