Initiation à la programmation en Python
Romain Brette11 mars 2009
Calcul scientifique: SciPy et Pylab SciPy = bibliothèque scientifique Pylab = bibliothèque graphique
Utilisation:
Matlab
Documentation:http://docs.scipy.org/doc/http://matplotlib.sourceforge.net/ (voir la gallerie d’exemples)http://mathesaurus.sourceforge.net/matlab-numpy.html
from scipy import *from pylab import *
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)
matrice1 2 34 5 6
matrice1 11 11 1
produit matriciel
Opérationsx+yx-yx*yx/yx**2exp(x)sqrt(x)
dot(x,y)dot(M,x)
M.TM.max()M.sum()
size(x)M.shape
élément par élément
produit scalaireproduit matriciel
transpositionmaximumsomme
x²
nombre total d’éléments
Indexation
x[i]M[i,j]x[i:j]M[i,:]M[:,i]x[[1,3]]
x[1:3]=[0,1]M[1,:]+=x
Indexation des vecteurs listes (premier élément = 0)
(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]=1ajouter 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=zx[1]=3
M[0,2] vaut 5
z[1] vaut 3 x=z.copy()copie:
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 1matrice nullematrice 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]
ajoute 1 à chaque élément > 2.5
= tous les aij tels que bij est True
indices (ligne, colonne) des éléments > .5
indices des éléments > 2.5
Algèbre linéaire
from scipy import linalghelp(linalg)
d=linalg.det(M)
liste des fonctions
Quelques fonctions:
detnormlstsqsolveeigvalslu...
Bibliothèque scientifique
import scipyhelp(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)
point initial
résout f(x)=0
Vectorisation Comment écrire des programmes efficaces? Remplacer les boucles par des opérations
vectoriellesfor 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
Pylab
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)
import pylabhelp(pylab)
x y
affiche la figure
en rougeavec des points (pas de lignes)
nouvelle figuresous-figure
211
2122 lig
nes
1 colonne
légende pour l’axe horizontal
plus d’exemples:http://matplotlib.sourceforge.net/gallery.html
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éatoiresfrom scipy import *-> fonction random.randint
Exercice 2 - Triangle de Pascal
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 = -ydy/dt = x
t = angle en radian
X=(x,y)dX/dt=MX 0 -1
1 0M=
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
1) Ecrire une fonction qui détermine si un carré (= matrice) est presque magique.
2) Ecrire une fonction qui renvoie un carré presque magique dit « élémentaire »:
3) 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.]]