PC 2016/2017
Séance Python 3 : algèbre linéaire
Pour manipuler les matrices, nous importerons le module numpy par import numpy as np. Ce module
permet de coder plus efficacement les matrices (ligne, colonne ou rectangulaire) que la structure classique
de liste par les contraintes plus fortes qui existent sur le type array :
– un tableau est homogène (il ne contient que des entiers, ou que des flottants, ou que des booléens...) ;
– un tableau n’est pas redimensionnable (contrairement à une liste, à laquelle on peut ajouter un élément
avec append).
Comme conséquence du premier point :
– si, lors de le création d’un tableau, on mélange des flottants et des entiers, il y a conversion automatique
des entiers en flottants par exemple ;
– si test un tableau d’entiers tel que t0,0= 1, la modification t[0,0] = t[0,0] / 2 ne remplace pas
cette valeur par 0.5mais par 0...
Copie
Comme pour les listes, la définition t1 = t ne crée pas une copie du tableau t, mais un deuxième nom
pour le même tableau. Ainsi, toute modification effectuée sur t1est aussi effectuée sur t: c’est le même
tableau ! Pour créer une copie du tableau, il faut écrire t1 = np.copy(t).
Slicing et vues
Si `est une liste, un peut en obtenir une tranche par la syntaxe l[1:4] : c’est la sous-liste formée
des éléments de `dont les indices appartiennent à l’ensemble [[1,4[[. Cette tranche est une copie de la
liste : si l’on définit une nouvelle liste par l1 = l[1:4], une modification de la liste l1 n’entraîne aucune
modification de la liste l(et inversement).
Pour les tableaux en revanche, la même syntaxe renvoie une vue sur le tableau : si l’on définit t1par
t1 = t[1:4],t1désigne une partie du tableau t. Par suite, toute modification effectuée sur t1se répercute
sur t(et inversement).
1 Systèmes linéaires
1. Écrire des fonctions transvecLigne(A,i,j,c),permutLigne(A,i,j) et dilatLigne(A,i,c) telles que
transvecLigne(A,i,j,c) modifie la matrice Apar l’opération Li←Li+cLj(et des opérations similaires
pour les deux autres fonctions). Ces fonctions modifient la matrice passée en argument et ne renvoient
rien.
2. a) Écrire une fonction systLin(A,B) qui résout le système linéaire de matrice A(carrée et inversible) et
de second membre Bpar la méthode du pivot de Gauss. La fonction ne devra modifier ni la matrice A,
ni la matrice B(il faudra en faire des copies, sur lesquelles on fera les opérations).
La matrice Bne sera pas nécessairement une matrice colonne (quel format doit avoir l’inconnue X
lorsque Bapcolonnes ?). Quel est le résultat renvoyé lorsque l’on prend B=In?
b) Évaluer le nombre de multiplications (ou divisions) effectuées pour la résolution du système (dans le
cas où Best une matrice colonne).
3. Dans la pratique, on rencontre parfois un pivot nul sur la diagonale principale. Il faut alors permuter
la ligne correspondante avec une ligne située en-dessous pour retrouver un pivot non nul et poursuivre
l’algorithme. Cette opération de permutation est intéressante même lorsque le pivot diagonal n’est pas
nul : utiliser le plus grand (en valeur absolue) pivot possible permet de réduire l’effet des erreurs d’arrondi
résultant des divisions par le pivot.
a) Tester la fonction systLin sur le système linéaire
10−20x+y= 1
x+y= 2
et comparer à la véritable solution (calculée à la main).
b) Écrire une fonction pivot(A,j) qui renvoie l’indice idu plus grand (en valeur absolue) des coefficients
Aj,j , . . . , An−1,j (n: nombre le lignes de la matrice).
1