from random import randint
def dimensions(M):
"""Retourne le couple (nbligne, nbcolonnes) carctérisant
la dimension d'une matrice"""
lignes = len(M)
colonnes = len(M[0])
assert all(len(ligne) == colonnes for ligne in M), "M n'est pas une matrice"
return (lignes, colonnes)
dimensions([[1,2,3],[4,5]])
dimensions([[1,2,3],[4,5,6]])
def matrice_nulle(lignes, colonnes):
return [ [0] * colonnes for _ in range(lignes)]
matrice_nulle(4, 3)
def copie_matrice(M):
(lignes, colonnes) = dimensions(M)
N = matrice_nulle(lignes, colonnes)
for lig in range(lignes):
for col in range(colonnes):
N[lig][col] = M[lig][col]
return N
def echange_ligne(M, i, j):
"""Procédure qui échange les lignes M[i] et M[j] de la matrice M"""
M[i], M[j] = M[j], M[i]
def transvection(M, i, j, mu):
"""M[i] <- M[i] + mu * M[j]"""
M[i] = [M[i][k] + mu * M[j][k] for k in range(len(M[i]))]
def transvection2(M, i, j, mu):
"""M[i] <- M[i] + mu * M[j]"""
M[i] = [e + mu * f for (e, f) in zip(M[i], M[j])]
M = [[randint(0, 1) for _ in range(4)] for _ in range(3)]
M
transvection(M, 0, 1, 2)
M
transvection(M, 0, 1, 2)
M
def dilatation(M, i, coef):
"""M[i] <- M[i] * coef"""
M[i] = [e * coef for e in M[i]]
def pivot_gauss(A, B):
(lignes, colonnes) = dimensions(A)
A2 = copie_matrice(A)
B2 = copie_matrice(B)
#application des transvections pour diagonaliser la matrice
for j in range(colonnes):
pivot = A2[j][j]
for i in range(lignes):
if i != j:
mu = - A2[i][j]/ pivot #coefficient de transvection
transvection(A2, i, j, mu)
transvection(B2, i, j, mu)
#application des dilatations pour transformer A2 en matrice identité
for i in range(lignes):
coef = 1/ A2[i][i] #coefficient de dilatation
dilatation(A2, i, coef)
dilatation(B2, i, coef)
return (A2,B2)
pivot_gauss([[2,2,-3],[-2,-1,-3 ],[6,4,4]],[[2],[-5], [16]])
pivot_gauss([[2, 2, -3],[0, 1, -6], [0, 0, 1]],[[2], [-3], [4]])
def pivot_partiel(M, j):
imax = j
pivot = abs(M[j][j])
for i in range(j, len(M)):
if abs(M[i][j]) > pivot:
pivot = abs(M[i][j])
imax = i
return imax
def pivot_gauss_complet(A, B):
(lignes, colonnes) = dimensions(A)
#copie des matrices A et B
A2 = copie_matrice(A)
B2 = copie_matrice(B)
#application des transvections pour diagonaliser la matrice
for j in range(colonnes):
ipivot = pivot_partiel(A2, j)
echange_ligne(A2, j, ipivot)
echange_ligne(B2, j, ipivot)
for i in range(lignes):
if i != j:
mu = - A2[i][j]/ pivot #coefficient de transvection
transvection(A2, i, j, mu)
transvection(B2, i, j, mu)
#application des dilatations pour transformer A2 en matrice identité
for i in range(lignes):
coef = 1/ A2[i][i] #coefficient de dilatation
dilatation(A2, i, coef)
dilatation(B2, i, coef)
return (A2,B2)
def pivot_gauss_complique(A, B):
"""Résolution uniquement pour B matrice colonne
La première phase consiste à triangulariser A"""
(lignes, colonnes) = dimensions(A)
#copie des matrices A et B
A2 = copie_matrice(A)
B2 = copie_matrice(B)
#triangularisation de la matrice A2
for j in range(colonnes):
ipivot = pivot_partiel(A2, j)
if ipivot != j:
echange_ligne(A2, j, ipivot)
echange_ligne(B2, j, ipivot)
pivot = A2[j][j]
for i in range(j + 1, lignes):
mu = - A2[i][j]/ pivot #coefficient de transvection
transvection(A2,i,j,mu)
#for k in range(j, colonnes):
# A2[i][k] = A2[i][k] + mu * A2[j][k]
transvection(B2,i, j, mu)
#B2[i][0] = B2[i][0] + mu * B2[j][0]
print(A2, B2)
#Phase de remontée
C = [ [0] for _ in range(lignes) ] #vecteur colonne des solutions
for i in range(lignes - 1, -1, -1):
C[i][0] = (B2[i][0] - sum(A2[i][k] * C[k][0] for k in range(i + 1, colonnes)))/A2[i][i]
return C
pivot_gauss_complique([[2,2,-3],[-2,-1,-3 ],[6,4,4]],[[2],[-5], [16]])