PC 2016/2017
Corrigé de la séance Python 3 : algèbre linéaire
On commence par importer le module numpy :
1import numpy as np
1 Systèmes linéaires
1. Pour effectuer la transvection Li←Li+cLj, on peut faire une boucle (indexée par k) qui effectue les
opérations A[i,k] = A[i,k] + c*A[j,k] (kvariant de 0àp−1, où pest le nombre de colonnes de la
matrice, i.e. la longueur du tableau A[0] par exemple). On peut aussi modifier le tableau A[i] en une
seule étape :
1def tra nsve cLi gne (A ,i ,j , c ):
2""" effe ctue l ’op é ration L_i <- L_i + c* L_j sur A.
3Modifi e la matrice A et ne renvoie rien """
4A[i] = A[i] + c * A[j]
Pour la permutation, la même syntaxe nécessite d’utiliser des copies des lignes (sinon, on se retrouverait
avec une matrice ayant deux lignes égales). La solution consistant à utiliser une boucle ne nécessite
évidemment pas de copie.
1def p er mu tL ig ne (A , i1 , i2 ):
2""" permut e les lignes d ’ indices i1 et i2 de A. """
3A [ i1 ] , A[ i2 ] = np . c opy ( A [ i2 ]) , np . copy ( A [ i1 ])
La dilatation :
1def d il at Li gn e (A ,i , c ):
2""" eff ect ue l ’op é rat ion L_i <- c * L_i sur A. """
3A[ i] *= c
Le principe est identique pour les colonnes, aux notations près : A[i] désigne la ligne d’indice i, alors
que A[:,j] désigne la colonne d’indice j.
1def t ra nsv ec Col (A ,i ,j , c ):
2""" eff ect ue l ’op é rat ion C_i <- C_i + c * C_j sur A . """
3A [: , i ] += c * A [: , j ]
4
5def p er mu tCo l (A , j1 , j2 ):
6""" permut e les colonn es d ’ in dices j1 et j2 de A. """
7A [: , j1 ] , A [: , j2 ] = np . copy ( A [: , j2 ]) , np . c opy ( A [: , j1 ])
8
9def d il at Co l (A ,j , c ):
10 """ eff ect ue l ’ op é rati on C_i <- c * C_i sur A . """
11 A [: , j ] *= c
2. a) On commence par créer une copie de chacune des matrices Aet B, sur lesquelles on va travailler (en les
modifiant). Notons nle nombre de lignes de A(i.e. sa longueur). On commence par échelonner le système.
Pour cela, on traite d’abord la première colonne (d’indice j= 0), puis la deuxième... et enfin l’avant-
dernière (d’indice n−2). Le traitement de la colonne d’indice jconsiste à utiliser le coefficient pivot Aj,j
pour annuler (par des transvections) les coefficients Ai,j pour i>j(chaque manipulation effectuée sur
les lignes de Adoit l’être aussi sur les lignes de B). Il faut donc écrire deux boucles imbriquées l’une dans
l’autre.
Une fois le système échelonné, il faut pratiquer la phase de «remontée» pour annuler les coefficients situés
au-dessus de la diagonale principale (chaque transvection pratiquée sur Adoit encore l’être sur B). Pour
cette phase de remontée, on commence par traiter la dernière colonne, puis l’avant dernière...
Après cette phase de remontée, le système est diagonal, de la forme a1,1x1=b1, . . . , an,nxn=bn. Reste à
faire une dilatation sur chacune des lignes pour obtenir la valeur des xi. Comme la matrice Ane servira
plus, on peut se dispenser de faire les dilatations sur Aet ne les faire que sur le second membre B. Dans
la version que nous proposons, cette dilatation est faite juste après avoir annulé tous les coefficients non
diagonaux d’une colonne donnée.
1