In [4]:
from random import randint

Outils

In [10]:
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)
In [6]:
dimensions([[1,2,3],[4,5]])
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-6-cea84803df16> in <module>
----> 1 dimensions([[1,2,3],[4,5]])

<ipython-input-5-16c2f578a969> in dimensions(M)
      4     lignes = len(M)
      5     colonnes = len(M[0])
----> 6     assert all(len(ligne) == colonnes for ligne in M), "M n'est pas une matrice"
      7     return (lignes, colonnes)

AssertionError: M n'est pas une matrice
In [ ]:
dimensions([[1,2,3],[4,5,6]])
In [8]:
def matrice_nulle(lignes, colonnes):
    return  [ [0] * colonnes for _ in range(lignes)]
In [ ]:
matrice_nulle(4, 3)
In [9]:
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
In [16]:
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]
In [17]:
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])]
In [ ]:
M = [[randint(0, 1) for _ in range(4)] for _ in range(3)]
M
In [ ]:
transvection(M, 0, 1, 2)
M
In [ ]:
transvection(M, 0, 1, 2)
M
In [ ]:
def dilatation(M, i, coef):
    """M[i] <-  M[i] * coef"""
    M[i] = [e * coef for e in M[i]]

Pivot de Gauss version simple

In [ ]:
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)
In [ ]:
pivot_gauss([[2,2,-3],[-2,-1,-3 ],[6,4,4]],[[2],[-5], [16]])
In [ ]:
pivot_gauss([[2, 2, -3],[0, 1, -6], [0, 0, 1]],[[2], [-3], [4]])

Pivot partiel

In [14]:
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
In [ ]:
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)

Pivot de Gauss version compliquée

In [19]:
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
In [20]:
pivot_gauss_complique([[2,2,-3],[-2,-1,-3 ],[6,4,4]],[[2],[-5], [16]])
[[6, 4, 4], [0.0, 0.6666666666666667, -4.333333333333333], [0.0, 0.0, 0.4999999999999989]] [[16], [-3.333333333333333], [1.9999999999999991]]
Out[20]:
[[-14.000000000000036], [21.000000000000046], [4.000000000000007]]