Initiation à la programmation en Python Romain Brette 11 mars 2009
Calcul scientifique: SciPy et Pylab SciPy = bibliothèque scientifique Pylab = bibliothèque graphique Utilisation: Matlab from scipy import * from pylab import * Documentation: http://docs.scipy.org/doc/ http://matplotlib.sourceforge.net/ (voir la gallerie d’exemples) http://mathesaurus.sourceforge.net/matlab-numpy.html
SciPy
Vecteurs et matrices Type de base défini par SciPy: array (= vecteur ou matrice) from scipy import * x=array([1,2,3]) M=array([[1,2,3],[4,5,6]]) M=ones((3,2)) z=2*x+1 y=dot(M,x) vecteur (1,2,3) 1 2 3 4 5 6 matrice 1 1 matrice On initialise avec des listes produit matriciel
Opérations x+y x-y x*y x/y x**2 exp(x) élément par élément sqrt(x) dot(x,y) dot(M,x) M.T M.max() M.sum() size(x) M.shape élément par élément x² produit scalaire produit matriciel transposition maximum somme nombre total d’éléments
Indexation Indexation des vecteurs listes (premier élément = 0) x[i] M[i,j] x[i:j] M[i,:] M[:,i] x[[1,3]] x[1:3]=[0,1] M[1,:]+=x (i+1)e élement tranche de x[i] à x[j-1] (i+1)e ligne (i+1)e colonne éléments x[1] et x[3] x[1]=0, x[3]=1 ajouter le vecteur x à la 2e ligne de M M[i,:] est une « vue » sur la matrice M copie ( référence) y=M[0,:] y[2]=5 x=z x[1]=3 M[0,2] vaut 5 copie: z[1] vaut 3 x=z.copy()
Construction x=array([1,2,3]) M=array([[1,2,3],[4,5,6]]) x=ones(5) M=zeros((3,2)) M=eye(3) M=diag([1,3,7]) x=rand(5) x=randn(5) x=arange(10) x=linspace(0,1,100) à partir de listes vecteur de 1 matrice nulle matrice identité matrice diagonale vecteur aléatoire dans [0,1] vecteur aléatoire gaussien 0,1,2,...,9 100 nombres entre 0 et 1
Vecteurs booléens x=array([1,2,3,4]) x>2.5 A(B) x[x>2.5]+=1 M=rand(3,3) i,j=where(M>.5) i=where(x>2.5)[0] [False, False, True, True] = tous les aij tels que bij est True ajoute 1 à chaque élément > 2.5 indices (ligne, colonne) des éléments > .5 indices des éléments > 2.5
Algèbre linéaire from scipy import linalg help(linalg) d=linalg.det(M) liste des fonctions Quelques fonctions: det norm lstsq solve eigvals lu ...
Bibliothèque scientifique import scipy help(scipy) liste des modules de SciPy Exemple: optimisation (scipy.optimize) from scipy import optimize def f(x): return (x-1)*(x-3) print optimize.fsolve(f,0) résout f(x)=0 point initial optimisation etc
Vectorisation Comment écrire des programmes efficaces? Remplacer les boucles par des opérations vectorielles for i in range(1000000): X[i]=1 X=ones(1000000) for i in range(1000000): X[i]=X[i]*2 X=X*2 for i in range(999999): Y[i]=X[i+1]-X[i] Y=X[1:]-X[:-1] for i in range(1000000): if X[i]>0.5: Y[i]=1 Y[X>.5]=1 chaque opération Python doit être interprétée
Pylab
Pylab import pylab help(pylab) from pylab import * plus d’exemples: http://matplotlib.sourceforge.net/gallery.html import pylab help(pylab) from pylab import * plot([1,2,3],[4,5,6]) show() plot(x,y,’r’) plot(x,y,’.’) xlabel(’Temps (ms)’) figure() subplot(211) plot(x,y) subplot(212) plot(u,v) x y affiche la figure en rouge avec des points (pas de lignes) légende pour l’axe horizontal 1 colonne nouvelle figure sous-figure 211 2 lignes 212
Exercices
Exercice 1 – Analyse de notes Ecrire une fonction qui analyse une liste de notes (entre 0 et 20) en affichant: Le nombre de notes La moyenne Le nombre de notes au-dessus de 10 Le nombre de notes au-dessous de 10 La meilleure note La plus mauvaise note L’histogramme des notes (pylab.hist) Essayer avec des notes aléatoires from scipy import * -> fonction random.randint
Exercice 2 - Triangle de Pascal 1 2 3 4 6 Ci,j=Ci-1,j-1+Ci-1,j Ecrire une fonction qui affiche les n premières lignes du triangle de Pascal. Ecrire le calcul de manière vectorielle (ligne = vecteur).
Exercice 3 – Dessiner un cercle Un cercle (x(t),y(t)) est solution d’un système différentiel: Ecrire un programme qui dessine un cercle en intégrant les équations différentielles (x(t+dt)=x(t)+dt*(-y(t))) La même chose en l’écrivant sous forme vectorielle: dx/dt = -y dy/dt = x t = angle en radian X=(x,y) dX/dt=MX 0 -1 1 0 M=
Exercice 4 – Carrés presques magiques [[ 3. 4. 2. 5. 1.] [ 1. 2. 5. 3. 4.] [ 4. 5. 3. 1. 2.] [ 2. 3. 1. 4. 5.] [ 5. 1. 4. 2. 3.]] Somme identique sur les lignes et les colonnes Ecrire une fonction qui détermine si un carré (= matrice) est presque magique. Ecrire une fonction qui renvoie un carré presque magique dit « élémentaire »: Ecrire une fonction qui calcule un carré presque magique en échangeant un grand nombre de fois des lignes et des colonnes aléatoirement à partir d’un carré élémentaire. [[ 1. 2. 3. 4. 5.] [ 2. 3. 4. 5. 1.] [ 3. 4. 5. 1. 2.] [ 4. 5. 1. 2. 3.] [ 5. 1. 2. 3. 4.]]