Pour faire joujou avec les représentations graphiques

publicité
Quelques représentations graphiques
On utilise ici les bibliothèques classiques, supposées activées dans la suite :
from math import *
from scipy import *
from numpy import *
from matplotlib.pyplot import *
# bibliothèque graphique
Partie I. Graphes de fonctions et de courbes paramétrées
Soient x et y deux listes ou deux tableaux de même longueur n et dont les éléments sont des nombres ‡ottants.
plot(x,y) crée le graphe représentant la ligne polygonale reliant les points (xi ; yi )0
i<n :
Ainsi, plot(([2,1],[2,3]) est le segment reliant les points (2; 2) et (1; 3). Dans certaines versions de Python
ou au sein d’une procédure, il faut ajouter show() pour a¢ cher e¤ectivement l’image (dans une nouvelle
fenêtre).
Il existe de nombreuses options supplémentaires :
Exemple :
plot([1,1.5,3],[1,3,3])
axis ([0,3,0,5])
# on dé…nit ici les axes (contour du graphe), ici [0; 3]
[0; 5]
# on représente dans une fenêtre le graphe dé…ni par les instructions précédentes.
show()
Remarque :
plot([0,2,3],[1,3,3])
plot([1,1.5,3],[1,3,3])
show()
# on représente dans une fenêtre la superposition des deux graphes dé…nis précédemment.
1) a) Ecrire une fonction graphe qui étant donnée f et deux réels a et b, représentent le graphe de f sur [a; b]
à l’aide d’une ligne polygonale contenant n = 100 intervalles.
Solution :
def graphe(f,a,b) :
n = 100
x = [a+k*(b-a)/(n-1) for k in range(0,n)]
y = [f(t) for t in x]
return plot(x,y)
Exemple d’utilisation : graphe(sin,0,2*pi) ouvre une fenêtre contenant le tracé de la fonction sin sur [0; 2 ]
en utilisant une subdivision régulière de longueur n = 100.
Remarque : Dans la littérature, au lieu de x = a + (b-a)/(n-1)*array(range(0,n)), la fonction spéciale
linspace est souvent utilisée, sous la forme : x = linspace(a,b,n).
b) Ecrire une fonction polygone qui étant donné un entier n représente le polygone régulier à n côtés inscrits
dans le cercle unité.
Solution :
def polygon(n) :
t = (2*pi/n)*array(range(0,n+1))
x = [cos(i) for i in t] ; y = [sin(i) for i in t]
return plot(x,y)
Si on veut une fonction de type None (ne renvoie pas de valeur, mais on a¢ che le graphe), on peut considérer :
def polygon(n) :
t = (2*pi/n)*array(range(0,n+1))
x = [cos(i) for i in t] ; y = [sin(i) for i in t]
plot(x,y)
show()
2) a) Ecrire une fonction euler qui étant donnée une fonction f de deux variables, et des réels a, b; c, n et
représente le graphe sur [a; b] de la solution apporchée de l’équation di¤érentielle y 0 (x) = f (x; y(x)) avec la
condition initiale y(a) = c:
On utilise la méthode d’Euler avec un pas
=
Autrement dit, on considère les suites (xk )0
k n
b
n
a
:
1
et (yk )0
k n
dé…nies par
(
xk = a + k
y0 = c et yk+1 = yk +
f (xk ; yk )
b) Appliquer la fonction précédente à l’équation y 0 (x) = y(x) avec la condition initiale y(0) = 1 pour évaluer
y(1) en utilisant le pas
=
1
100 :
Modi…er la fonction de sorte qu’elle renvoie y(1), et comparer la valeur avec
e = exp(1):
Solution :
a)
def euler(f,a,b,c,n) :
delta = (b-a)/(n-1)
x = [a+k*delta for k in range(0,n)]
y = [c]*(n)
for k in range(1,n) :
y[k] = y[k]+delta*f(x[k],y[k])
return plot(x,y)
b) On modi…e la fonction de sorte que la valeur renvoyée est la valeur approchée de y en b :
def euler2(f,a,b,c,n) :
delta = (b-a)/n
x = [a+k*delta for k in range(0,n+1)]
y = [c]*(n+1)
for k in range(1,n+1) :
y[k] = y[k]+delta*f(x[k],y[k])
return y[n]
def f(x,y) :
y
print(euler2(f,0,1,100)) a¢ che 2.704813829421526
print(exp(1)) a¢ che 2.71828182846
En modi…ant la valeur de n, on peut noter que plus n est grand, plus l’écart entre la valeur approchée et la
valeur réelle est faible. On peut montrer mathématiquement que l’écart tend vers 0 lorsque n tend vers l’in…ni.
Partie II. Exemples d’images (2D)
1) Représentation d’un nuage de points. On considère deux tableaux réels x et y de même longueur n,
On a vu que plot(x,y) renvoie la ligne polygonale reliant les points (xk ; yk ), avec 0
k < n:
Si on veut ajouter des couleurs ou représenter les points, on ajoute des options.
Par exemple, "ro" représente des cercles ("o") autour de chaque point, coloriés en rouge ("r").
Ainsi, on peut représenter le nuage de points (cercles rouges) par plot(x,y,’ro’).
Si on veut relier ces points, on utilise "-", ce qui donne plot(x,y,"ro-").
Remarque : L’option par défaut est "b-" (lignes bleues).
On peut aussi préciser les axes : axis(a,b,c,d) consiste à se placer dans [a; b]
[c; d]
On utilise show() pour a¢ cher l’image dé…nie précédemment.
Ainsi, pour représenter dans [0; 1]
[0; 1] la ligne polygonale reliant les points (xk ; yk ) de sorte à ce que les
points soient marqués de cercles rouges, on considère :
plot(x,y,"ro-")
axis(0,1,0,1)
show()
2) On peut associer à tout tableau matriciel a sous forme d’image : Python associe une couleur à chaque réel
selon l’intervalle contenant tous les réels du tableau. On peut imposer une seule couleur, par exemple le gris
(gray), et l’intensité est alors proportionnelle est à la valeur du coe¢ cient (relativement aux autres).
a = array([[1,2],[1,3]])
matshow(a,cmap=cm.gray)
Pour obtenir une image lissée, on utilise : imshow(a,cmap=cm.gray)
Pour construire un tableau aléatoire, on peut utiliser :
b = random.rand(4,4) # construit un tableau 4
4 d’éléments aléatoires pris dans [0; 1]
3) Représentations des images couleur (selon le codage Rouge-Vert-Bleu) :
Une image couleur est classiquement représentée par un tableau n
compris entre 0 et 1), où pour chacun des n
p
3 de réels compris (généralement
p pixels est donné l’intensité des 3 couleurs (sous forme d’un
triplet de réels appartenant à [0; 1]).
Ainsi, une image couleur est codée par un tableau de type (n; m; 3), où n est le nombre de lignes, m le nombre
de colonnes et la couleur de chaque pixel est dé…nie par les trois couleurs fondamentales RGB (rouge-vert-bleu)
codées par des réels (généralement compris entre 0 et 1).
Par exemple,
a = random.rand(10,10,3)
b = array(a)
# tableau aléatoire représentant une image couleur avec 10
10 pixels.
# on crée une copie du tableau a, qu’on appelle b
for i in range(10) :
for j in range(10) :
b[i,j,1] = 0 ; b[i,j,2] = 0
# on annule dans b les composantes vertes et bleues
imshow(a)
# on représente l’image multicolore associée à a
imshow(b)
# l’image associée à b est rouge (c’est la composante rouge de l’image de a)
4) On peut aisément avec Python récupérer une image au format png et la modi…er.
Pyzo a besoin de savoir dans quel dossier il doit chercher le …chier-image à lire. Pour cela, le plus simple est de
choisir le dossier où se trouve le …chier Python qu’on utilise. Pour indiquer à Python qu’on choisit ce dossier,
exécutez une fois ce …chier (même vide) à l’aide de la commande Exécuter en tant que script du menu Exécuter.
On peut ensuite lire les …chiers images disponibles sur Internet (au format png), dont notamment le fameux
…chier lena.png qui est souvent pris comme …chier-image test (pour des raisons historiques et plastiques).
from matplotlib._png import read_png
a = read_png(’lena.png’)
# attribue à a le tabkleau des couleurs de l’image du …chier lena
a.shape # renvoie (512; 512; 3) qui est la taille du tableau a
imshow(a)
show()
Si on veut obtenir l’image uniquement en rouge :
for i in range(512) :
for j in range(512) :
a[i,j,0] = a[i,j,0]+a[i,j,1]+a[i,j,2]
a[i,j,1] = 0 ; a[i,j,2] = 0
imshow(a) # renvoie l’image en rouge
Ne pas confondre avec l’image …ltrée selon la couleur rouge, obtenue en gardant la valeur des a[i,j,0].
Téléchargement