Intégration de tableaux avec Python
Intégration de tableaux avec Python
9 Conclusion
Matthieu Moy (Ensimag) NumPy octobre 2016 < 1 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 2 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 4 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 5 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 6 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 7 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 9 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 11 / 67 >
Construire un tableau NumPy Opérations sur tableaux numpy
On peut créer un tableau (unidimensionnel : un vecteur) NumPy à
partir d’une liste Python ou même d’une liste de listes (il sera alors
bi-dimensionel : une matrice) :
>>> import numpy NumPy permet de faire des opérations directement sur ces tableaux,
>>> [Link]([1, 2, 3]) sans avoir à réécrire chaque fonction :
array([1, 2, 3]) >>> 2 * [Link]([1, 2, 3])
>>> [Link]([[1, 2], [3, 4], [5,6]]) + [Link]([8, 10, 12])
array([[1, 2], array([10, 14, 18])
[3, 4],
; ce à quoi on s’attend en algèbre linéaire.
[5, 6]])
>>> [Link][0]
3
>>> [Link][1]
2
Matthieu Moy (Ensimag) NumPy octobre 2016 < 12 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 13 / 67 >
Accéder aux éléments d’un tableau NumPy Accès aux lignes et aux colonnes
Accès aux éléments comme pour une liste : a[i]
Numérotation à partir de 0
>>> a = [Link]([[ 0.19, 0.14, 0.21],
Matrices : M[ligne][colonne] ou M[ligne, colonne]. ... [ 0.79, 0.43, 0.74],
... [ 0.12, 0.40, 0.30]])
>>> b = [Link]([1.414, 0.5, 3.14, 2.718])
>>> b[2]
>>> a[:, 1]
3.1400000000000001
array([ 0.14, 0.43, 0.4 ])
>>> a = [Link]([[ 0.19, 0.14, 0.21],
>>> a[0, :]
... [ 0.79, 0.43, 0.74],
array([ 0.19, 0.14, 0.21])
... [ 0.12, 0.40, 0.30]])
>>> a[2, 1]
0.40000000000000002
Matthieu Moy (Ensimag) NumPy octobre 2016 < 14 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 15 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 16 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 17 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 18 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 19 / 67 >
Exercice : transvection Opérations sur les tableaux NumPy (1/2)
Étant donnés une matrice NumPy a, deux entiers i et j et un flottant
x, appliquer la transvection Lj ← Lj + xLi sur la matrice a. Déjà vu : M1 + M2, scalaire * M
>>> a Opérations classiques, composante par composante : -, *, /, abs
array([[ 0.12, 0.4 , 0.3 ],
[ 0.79, 0.43, 1. ], >>> u = [Link]([1, 2, 3, 4])
[ 0.19, 0.14, 0.21]]) >>> v = [Link]([4, 3, 2, 1])
>>> i = 0 >>> u * v
>>> j = 1 array([4, 6, 6, 4])
>>> x = -a[j, i] / a[i, i] # pivot : a[i, i] >>> u / v
>>> a[j, :] = a[j, :] + x * a[i, :] # Lj ← Lj + xLi array([ 0.25, 0.66666667, 1.5, 4.])
>>> a >>> abs(u - v)
array([[ 0.12 , 0.4 , 0.3 ], array([3, 1, 1, 3])
[ 0. , -2.20333333, -0.975 ],
[ 0.19 , 0.14 , 0.21 ]])
Matthieu Moy (Ensimag) NumPy octobre 2016 < 20 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 21 / 67 >
Opérations sur les tableaux NumPy (2/2) Exercice : Valeur maximale dans une colonne
produits matriciels, produits scalaires : [Link]
>>> u = [Link]([1, 2, 3, 4]) Étant donnée une matrice A et un indice i, écrire la fonction
>>> v = [Link]([4, 3, 2, 1]) pivot_index(A,i) qui renvoie l’indice j ≥ i t.q. |aji | est maximal.
n−1
X
>>> [Link](u, v) # ui · vi def pivot_index(A, i):
i=0 n = [Link][0] # nombre de lignes
20 j = i
>>> w = u * v for k in range(i + 1, n):
>>> [Link]() if abs(A[k, i]) > abs(A[j, i]):
20 j = k
>>> a = [Link]([[1, 2], [3, 4]]) return j
>>> x = [Link]([1, -1])
>>> b = [Link](a, x)
>>> b
array([-1, -1])
Matthieu Moy (Ensimag) NumPy octobre 2016 < 22 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 23 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 24 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 26 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 27 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 28 / 67 >
Algorithme du pivot de Gauss : test Algorithme du pivot de Gauss : expérimentons
>>> n = 5 gauss/[Link]
# les matrices inversibles sont denses
>>> M = [Link]([n, n]) Regarder le code
>>> x = [Link]([n]) Exécuter [Link]
>>> v = [Link](M, x)
Exécuter [Link] pour tester sur une matrice
>>> x_solved = solve(M, v)
problématique (erreur attendue ≈ 33)
>>> abs(x - x_solved).max()
7.2164496600635175e-16 Si le temps le permet : modifier [Link] pour remplacer le pivot
partiel (recherche du plus petit pivot) par un pivot naif (utilisation
du premier pivot non-nul) et re-tester (erreur attendu ≈ 1016 ).
Matthieu Moy (Ensimag) NumPy octobre 2016 < 29 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 30 / 67 >
103 Lists
Numpy arrays
102 Numpy solve
Matthieu Moy (Ensimag) NumPy octobre 2016 < 32 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 33 / 67 >
1 1/4 0 0 0 1 1/4 0 0 0
0 5/4 − 1/4 12 0 0 0 1 12 0 0
·x = ·x =
0 1/3 − 1/4 1 1 1e16 0 1/3 − 1/4 1 1 1e16
0 5/4 − 1/4 13 1 0 0 1 13 1 0
Matthieu Moy (Ensimag) NumPy octobre 2016 < 34 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 34 / 67 >
1 1/4 0 0 0 1 1/4 0 0 0
0 1 12 0
0 0 1 12 0
0
·x = · x =
0 0 1 − 12 ∗ (1/3 − 1/4) = 2.2e-16 1 1e16 0 0 2.2e-16 1 1e16
0 1 13 1 0 0 0 1 1 0
Matthieu Moy (Ensimag) NumPy octobre 2016 < 34 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 34 / 67 >
Et la stabilité numérique ? Vous voulez des détails ?
1 1/4 0 0 0
1 5/4 12 0 0
·x =
1 1/3 1 1 1e16
1 5/4 13 1 0 TP6 du cours d’informatique CPP Semestre 3 :
[Link]
document/S2/[Link]
1 1/4 0 0 0
0 1 12 0 0
·x =
0 0 2.2e-16 1 1e16
0 0 0 1 − 1/2.2e-16 = -4.5e15 4.7e31
Matthieu Moy (Ensimag) NumPy octobre 2016 < 34 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 35 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 37 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 39 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 40 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 41 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 42 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 43 / 67 >
Tracer une courbe avec un ensemble de points Tracé de Fonction
matplotlib/courbe_simple.py matplotlib/[Link]
Matthieu Moy (Ensimag) NumPy octobre 2016 < 45 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 46 / 67 >
[Link]()
Matthieu Moy (Ensimag) NumPy octobre 2016 < 47 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 48 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 49 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 50 / 67 >
Animations
matplotlib/oscilateur_anim.py
import numpy as np
import [Link] as plt
import [Link] as animation
Joli, mais on peut faire bouger # figure = tout le contenu de la fenêtre
tout ça ? fig = [Link]() # A appeler avant de
# tracer autre chose
; Oui ! ! !
# Une courbe fixe
x = [Link](0, 10 * [Link], 500)
y1 = [Link](x)
Matthieu Moy (Ensimag) NumPy octobre 2016 < 51 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 52 / 67 >
Animations Animations : à essayer
matplotlib/oscilateur_anim.py matplotlib/oscilateur_anim.py
[Link]('Oscillateurs libre et amorti')
[Link]('x')
[Link]('y = f(x)')
Ajouter une instruction print(i) dans la fonction animate
# Fonction appelée à chaque pas de l'animation Jouer avec les paramètres de FuncAnimation :
def animate(i): I interval (en miliseconde)
C = i + 1 # i vaut successivement 0, 1, 2, ... I frames (arguments passés à animate, par exemple
# On peut changer le titre [Link](...))
[Link]('Oscillateurs libre et amorti (C = ' I repeat=False (s’arrêter à la fin au lieu de répéter)
+ str(C) + ')')
[Link]
# Et changer les données
y2 = [Link](-x / float(C)) * y1 [Link]
# Attention, amorti est une liste a 1 élément.
amorti[0].set_data(x, y2)
Matthieu Moy (Ensimag) NumPy octobre 2016 < 53 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 54 / 67 >
Matthieu Moy (Ensimag) NumPy octobre 2016 < 55 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 56 / 67 >
# Tracé du résultat
[Link](x, y)
[Link]()
Matthieu Moy (Ensimag) NumPy octobre 2016 < 57 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 58 / 67 >
w02 = 10
y0 = [Link]([[Link] / 2.0, 0]) # angle, vitesse
θ00 + ω02 sin θ = 0
θ00 + ω02 sin θ = 0 (avec ω02 = constante) def f(y, t): On pose
Y = (y1 , y2 ) = (θ, θ0 )
# y[0] = angle, y[1] = vitesse angulaire
# On renvoie : (vitesse, accélération)
On pose Y = (y1 , y2 ) = (θ, θ0 )
return [Link]([y[1], -w02 * [Link](y[0])])
On remarque
Exprimer Y 0 en fonction de y1 et y2 (on n’a pas besoin de t) t = [Link](0, 100, 10000)
y = [Link](f, y0, t) Y 0 = (y2 , −ω02 sin y1 )
theta, thetadot = y[:, 0], y[:, 1]
Écrire la fonction F (Y , t) avec Y de dimension 2. On résout cette équation
fig = [Link]()
Résoudre le système avec [Link]. ax = fig.add_subplot(111, autoscale_on=False,
(θ en fonction de t) :
xlim=(-1.5, 1.5), ylim=(-1.5, .5))
Squelette : matplotlib/pendule_anim_simple.py [Link]() [Link]
[Link]('Pendule')
[Link]('x'); [Link]('y') On trace le segment
pendules = [Link]((0, sin(y0[0])), (0, -cos(y0[0])), 'o-')
(0, 0) → (sin(θ), − cos(θ)) à
def animate(i):
angle = theta[i] chaque instant :
x = (0, sin(angle))
[Link]
y = (0, -cos(angle))
pendules[0].set_data(x, y)
Matthieu Moy (Ensimag) NumPy octobre 2016 < 59 / 67 > # Décommenter pour
Matthieu Moy enregistrer sous forme de vidéo:
(Ensimag) NumPy octobre 2016 < 60 / 67 >
#[Link]('pendule_anim_simple.mp4', writer='avconv', fps=30)
# En cas de problème avec writer, essayer writer='mencoder'
Animations : amusons-nous un peu Diagramme de phase
matplotlib/pendule_anim.py matplotlib/diagramme_de_phase.py
# y' = f(y, t)
def f(y, t):
Même equa-diff
On a θ et θ0
# y[0] = angle, y[1] = vitesse angulaire
# On renvoie : (vitesse, accélération)
frottement = - .5 * y[1]
return [Link]([y[1], -w02 * [Link](y[0]) [Link](theta,
2 pendules
+ frottement])
thetadot)
Lois de la physique différentes pour les deux (frottement) t = [Link](0, 100, 10000)
y = [Link](f, y0, t)
Jouez avec les paramètres (position initiale, frottement, ...) theta, thetadot = y[:, 0], y[:, 1]
fig = [Link]()
ax = fig.add_subplot(111, autoscale_on=False,
xlim=(-5, 5), ylim=(-5, 5))
[Link]()
Matthieu Moy (Ensimag) NumPy octobre 2016 < 61 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 62 / 67 >
[Link]()
Matthieu Moy (Ensimag) NumPy octobre 2016 < 63 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 65 / 67 >
Double pendule :
matplotlib/double_pendulum_animated.py,
Beaucoup d’autres exemples : Merci de votre attention !
[Link]
Une documentation très bien faite (NumPy, SciPy, Matplotlib, . . .) :
[Link]
Matthieu Moy (Ensimag) NumPy octobre 2016 < 66 / 67 > Matthieu Moy (Ensimag) NumPy octobre 2016 < 67 / 67 >