Vous êtes sur la page 1sur 6

MPSI

Ce document est une aidememoire concernant numpy et scipy. Il nest en aucun cas exhaustif :
on se reportera `a la documentation en ligne et aux TP pour plus de details et plus de fonctions.
1 numpy
Dans toute la suite on supposera quon a eectue :
>>> import numpy as np
1.1 Manipuler des listes et des matrices
numpy propose un type numpy.ndarray qui ore les fonctionnalites des listes de Python, mais
aussi en plus des routines de calcul ecaces. Dans la suite nous appellerons tableau numpy
toute instance du type numpy.ndarray (ou plus simplement tableau).
Attention : contrairement aux listes, les elements dun tableau numpy doivent tous etre de meme
type. En cas de tableau numpy de tableaux numpy, on obtient une matrice numpy.
1.1.1 Creer des tableaux numpy
Loperateur np.array prend en argument une liste et renvoie un tableau numpy ayant les memes
elements. En cas de liste de listes, loperateur sapplique recursivement ` a chaque sousliste : la
valeur de retour est donc un tableau de tableaux.
Pour une matrice numpy m, il est possible dacceder directement `a lelement de ligne i et de
colonne j avec la syntaxe m[i, j] (alors quavec une matrice python classique il faudrait ecrire
m[i][j]). Exemple :
>>> a = [[2,3],[1,8]]
>>> type (a)
<type list>
>>> b = np.array (a)
>>> type (b)
<type numpy.ndarray>
>>> b[1] # ligne dindice 1
array([1, 8])
>>> type (b[1])
<type numpy.ndarray>
>>> b[:,0] # colonne dindice 0
array([2, 1])
>>> b[:,-1] # derniere colonne
array([3, 8])
>>> b[1,0] # element ligne 1 colonne 0
1
On peut creer un tableau de longueur n contenant uniquement des 1. avec la fonction np.ones(n).
Pour creer une matrice numpy avec p lignes et q colonnes composee uniquement de 1. on utilise
np.ones((p,q)) (attention : il faut deux paires de parenth`eses). Exemple :
1/6
MPSI
>>> np.ones(2)
array([ 1., 1.])
>>> np.ones((2,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
La fonction np.eye(n) renvoie la matrice identite de taille n. Exemple :
>>> np.eye(2)
array([[ 1., 0.],
[ 0., 1.]])
Il existe dautres facons de creer des matrices numpy (par exemple par diagonales dierentes de
la diagonale principale). On pourra par exemple se referer au TP sur le laplacien ou ` a laide en
ligne.
1.1.2 Operations sur les tableaux numpy
Les operations usuelles (addition, soustraction, multiplication, division) sappliquent aux tableaux
numpy et aux matrices numpy en operant coecient par coecient.
Attention : laddition des tableaux numpy est la meme que laddition usuelle, mais la multipli-
cation * de matrices numpy na rien `a voir avec la multiplication usuelle. Il en est de meme pour
la division. En eet, si a et b sont des matrices numpy, a b se contente de calculer la matrice
des coecients a[i, j] b[i, j] au lieu de la matrice des coecients

k
a[i, k]b[k, j]. De meme a/b
se contente de calculer la matrice des coecients a[i, j]/b[i, j].
De mani`ere similaire, a 2 se contente delever chaque coecient au carre au lieu de calculer a
2
au sens matriciel. Exemple :
>>> a=np.array([[1,4],[1,2]])
>>> b=np.ones((2,2))
>>> a*b
array([[ 1., 4.],
[ 1., 2.]])
>>> a/b # au sens matriciel usuel b nest pas inversible
array([[ 1., 4.],
[ 1., 2.]])
>>> a**2
array([[ 1, 16],
[ 1, 4]])
Chaque fonction mathematique usuelle poss`ede une fonction numpy qui lui est homonyme et qui
calcule la meme chose sur les objets de type float. Par exemple il existe math.sin et np.sin
Lavantage des fonctions numpy f, cest que si a est un tableau numpy a = array[a
0
, . . . , a
n1
],
lappel f(a) renvoie le tableau array[f(a
0
), . . . , f(a
n1
)]. Ce mecanisme sapplique aussi aux
matrices. Exemple :
2/6
MPSI
>>> x=np.array([3,4])
>>> np.exp(x)
array([ 20.08553692, 54.59815003])
>>> import math
>>> math.exp(x)
TypeError: only length-1 arrays can be converted to Python scalars
1.2 Quelques outils dalg`ebre lineaire
1.2.1 Produit matriciel
Syntaxe de lappel : numpy.dot (matrice A, matrice B)
Valeur de retour : le produit matriciel A.B
Attention : loperateur * eectue une multiplication terme `a teme des elements des deux matrices,
ca na rien ` a voir avec un produit matriciel
Exemple :
>>> from numpy.linalg import dot
>>> dot ([[1,2],[3,4]], np.eye(2)) # syntaxe correcte du produit matriciel
array([[ 1., 2.],
[ 3., 4.]])
>>> [[1,2],[3,4]] * np.eye(2) # Faux (produit terme a terme)
array([[ 1., 0.],
[ 0., 4.]])
1.2.2 Resolution dun syst`eme de Cramer
Syntaxe de lappel : numpy.linalg.solve (matrice A, vecteur B)
Valeur de retour : le vecteur X solution de AX = B
Exemple

resolution de

x + 2y = 2
3x + 4y = 8

:
>>> from numpy.linalg import solve
>>> solve ([[1,2],[3,4]], [2,8])
array([ 4., -1.])
1.2.3 Determinant
Syntaxe de lappel : numpy.linalg.det (matrice A)
Valeur de retour : le determinant de A, de type float
Exemple :
>>> from numpy.linalg import det
>>> det ([[1,2],[3,4]])
-2.0000000000000004
3/6
MPSI
1.2.4 Trace
Syntaxe de lappel : numpy.trace (matrice A)
Valeur de retour : la trace de A
Exemple :
>>> np.trace ([[1,2],[3,4]])
5
1.2.5 Inverse dune matrice
Syntaxe de lappel : numpy.linalg.inv (matrice A)
Valeur de retour : A
1
(provoque une erreur si A nest pas inversible).
Exemple :
>>> from numpy.linalg import inv
>>> inv ([[1,2],[3,4]])
array([[-2. , 1. ],
[ 1.5, -0.5]])
1.2.6 Puissance dune matrice
Syntaxe de lappel : numpy.linalg.matrix_power (matrice A, entier n)
Valeur de retour : A
n
Exemple :
>>> from numpy.linalg import matrix_power
>>> matrix_power ([[1,2],[3,4]], -2)
array([[ 5.5 , -2.5 ],
[-3.75, 1.75]])
1.2.7 Transposee dune matrice
Syntaxe de lappel : numpy.transpose (matrice A)
Valeur de retour :
t
A
Exemple :
>>> np.transpose ([[1,2],[3,4]])
array([[1, 3],
[2, 4]])
1.2.8 Outils de deuxi`eme annee
numpy.linalg.eig permet dobtenir les valeurs propres et les vecteurs propres dune matrice.
4/6
MPSI
2 Tracer des courbes
Dans toute la suite on supposera quon a eectue :
>>> import matplotlib.pyplot as plt
Les instructions :
>>> plt.plot ([x
0
, . . . , x
n
], [y
0
, . . . , y
n
])
>>> plt.show () # provoque laffichage
permettent de tracer une ligne brisee reliant les points de coordonnees (x
k
, y
k
). Les listes de
coordonnees peuvent aussi etre donnees sous forme de tableaux numpy.
3 scipy
3.1 Resoudre une equation scalaire
Syntaxe de lappel : scipy.optimize.newton (fonction f, point de depart a)
Valeur de retour : x de type float solution de f(x) = 0, obtenu par iteration en partant de a.
Exemple :
>>> from scipy.optimize import newton
>>> def f (x) : return (x**2 - 1.)
>>> newton (f, 0.)
1.
3.2 Calculer une integrale de mani`ere approchee
Syntaxe de lappel : scipy.integrate.quad (fonction f, borne a, borne b)
Valeur de retour : un couple (v, e) o` u v est une estimation de

b
a
f et o` u e est la marge derreur.
Exemple :
>>> from scipy.integrate import quad
>>> def f (x) : return (x**2)
>>> quad (f, 0, 1)
(0.3333333333333333, 3.700743415417188e-15)
3.3 Integrer une equation dierentielle dordre 1
Syntaxe de lappel : scipy.integrate.quad (fonction f, valeur initiale v, subdivision x)
o` u on cherche ` a resoudre lequation dierentielle f(x) = y, o` u x est une liste (ou un tableau
numpy) de la forme [x
0
, x
1
, . . . , x
n
] tel que x
0
< x
1
< < x
n
et o` u v est la condition intiale
y(x
0
) = v.
5/6
MPSI
Valeur de retour : une matrice colonne numpy [[y
0
], [y
1
], . . . , [y
n
]] correspondant aux valeurs re-
spectives (approchees) prises par y et x
0
, . . . , x
n
.
Exemple (resolution de y

= 2xy
2
sur [0, 2] avec la condition initiale y(0) = 0.2) :
>>> from scipy.integrate import odeint
>>> x = np.linspace (0., 2., 5)
>>> def f (y, x) : return (2*x*y**2)
>>> odeint (f, .2, x)
[[ 0.2 ]
[ 0.21052642]
[ 0.25000023]
[ 0.36363707]
[ 1.00000675]]
Remarque : on pourrait prouver que cette equation sint`egre en y(x) =
1
5 x
2
, la valeur exacte
en 2 est donc 1
3.4 Integrer une equation dierentielle dordre 2
scipy sait uniquement integrer une equation dierentielle dordre 1. Si on cherche ` a integrer
lequation dierentielle dordre 2 y

= g(y, y

, x) on la transforme en une equation dierentielle


dordre 1 en posant z = (y, y

) (donc z

= (y

, y

), lequation dierentielle peut alors secrire


z

= f(z, x) en posant f((y, dy), x) = (dy, g(y, dy, x)).


La subdivision [x
0
, x
1
, . . . , x
n
] de lintervalle sur lequel on int`egre lequation dierentielle reste la
meme, par contre la condition initiale doit etre un couple (y(x
0
), y

(x
0
)) et la valeur de retour est
une matrice numpy dont la premi`ere colonne est constituee des valeurs y(x
k
) et la seconde des
valeurs y

(x
k
).
Exemple : resolution de y

+ y

+ xy = 0 sur le segment [1, 2] avec la condition initiale (y(1) =


1, y

(1) = 0).
>>> x = np.linspace (1., 2., 4)
>>> def f (z, x) :
>>> (y, dy) = z
>>> return (dy, -dy-x*y)
>>> y = odeint (f, (1., 0.), x)
>>> print (y)
[[ 1. 0. ]
[ 0.94502133 -0.32624253]
[ 0.78778807 -0.60463152]
[ 0.55333316 -0.78078941]]
>>> print (y[:,0]) # premiere colonne : valeurs prises par y
[ 1. 0.94502133 0.78778807 0.55333316]
6/6