Livre_silo 30 août 2013 16:32 Page 183
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
183
7 – Pivot de Gauss et résolution de systèmes
Les échanges de lignes se passent de commentaires :
def echange_lignes(A, i, j):
nc = len(A[0])
for k in range(nc):
A[i][k], A[j][k] = A[j][k], A[i][k]
Enfin viennent les transvections. Comme pour la fonction précédente, on agira par effet
de bord sur la matrice fournie en entrée, en ne renvoyant rien. En particulier, l’appel se
fera via transvection_ligne(A,i,j,mu), et non via A = transvection_ligne(A,i,j,mu) :
def transvection_ligne(A, i, j, mu):
""" L_i <- L_i + mu.L_j """
nc = len(A[0]) # le nombre de colonnes
for k in range(nc):
A[i][k] += mu * A[j][k]
Exercice 7.8 Pourquoi µ et pas λ ? :-)
7.2.2 Recoller les morceaux
Grâce à tous ces outils, l’écriture du programme Python devient comme prévu un simple
exercice de traduction. On commence par faire une copie de la matrice fournie en entrée ⁷.
ATTENTION Pourquoi faire une copie ?
La fonction de résolution de système doit être accompagnée d’une notice claire. S’il semble
évident que cette fonction prendra en entrée les données du système et renverra la solution, le statut des données doit être précisé. Ici, on choisit de ne pas modifier les données
fournies. En particulier, celui qui appelle la résolution est assuré que les matrices fournies
ne seront pas modifiées. Le programme de résolution commence donc par faire une copie
desdites matrices, pour pouvoir manipuler les lignes.
def resolution(A0, Y0):
"""Résolution de A0.X=Y0; A0 doit etre inversible"""
A, Y = copie_matrice(A0), copie_matrice(Y0)
n = len(A)
assert len(A[0]) == n
# Mise sous forme triangulaire
for i in range(n):
j = chercher_pivot(A, i)
if j > i:
echange_lignes(A, i, j)
echange_lignes(Y, i, j)
for k in range(i+1, n):
x = A[k][i] / float(A[i][i])
transvection_ligne(A, k, i, -x)
transvection_ligne(Y, k, i, -x)
¯
7. La fonction copie_matrice a été écrite dans le chapitre précédent ; on peut la remplacer par la fonction
deepcopy de la bibliothèque copy.
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
183
7 – Pivot de Gauss et résolution de systèmes
Les échanges de lignes se passent de commentaires :
def echange_lignes(A, i, j):
nc = len(A[0])
for k in range(nc):
A[i][k], A[j][k] = A[j][k], A[i][k]
Enfin viennent les transvections. Comme pour la fonction précédente, on agira par effet
de bord sur la matrice fournie en entrée, en ne renvoyant rien. En particulier, l’appel se
fera via transvection_ligne(A,i,j,mu), et non via A = transvection_ligne(A,i,j,mu) :
def transvection_ligne(A, i, j, mu):
""" L_i <- L_i + mu.L_j """
nc = len(A[0]) # le nombre de colonnes
for k in range(nc):
A[i][k] += mu * A[j][k]
Exercice 7.8 Pourquoi µ et pas λ ? :-)
7.2.2 Recoller les morceaux
Grâce à tous ces outils, l’écriture du programme Python devient comme prévu un simple
exercice de traduction. On commence par faire une copie de la matrice fournie en entrée ⁷.
ATTENTION Pourquoi faire une copie ?
La fonction de résolution de système doit être accompagnée d’une notice claire. S’il semble
évident que cette fonction prendra en entrée les données du système et renverra la solution, le statut des données doit être précisé. Ici, on choisit de ne pas modifier les données
fournies. En particulier, celui qui appelle la résolution est assuré que les matrices fournies
ne seront pas modifiées. Le programme de résolution commence donc par faire une copie
desdites matrices, pour pouvoir manipuler les lignes.
def resolution(A0, Y0):
"""Résolution de A0.X=Y0; A0 doit etre inversible"""
A, Y = copie_matrice(A0), copie_matrice(Y0)
n = len(A)
assert len(A[0]) == n
# Mise sous forme triangulaire
for i in range(n):
j = chercher_pivot(A, i)
if j > i:
echange_lignes(A, i, j)
echange_lignes(Y, i, j)
for k in range(i+1, n):
x = A[k][i] / float(A[i][i])
transvection_ligne(A, k, i, -x)
transvection_ligne(Y, k, i, -x)
¯
7. La fonction copie_matrice a été écrite dans le chapitre précédent ; on peut la remplacer par la fonction
deepcopy de la bibliothèque copy.
