Eliminazione di Gauss

Vedi la discussione

La matrice da elaborare è, eventualmente, rettangolare.
La matrice viene resa triangolare superiore (se il valore di ritorno è -1 la procedura ha fallito).

Se la matrice originale è nxn la triangolare superiore può essere utilizzata per calcolare il determinante.
Il numero di cambi effettuati condiziona il segno del determinante.

Se la matrice originale è nx(n+1), del tipo A|b, può essere utilizzata successivamente per la soluzione di un sistema lineare.

Si tratta di una prima stesura, si può rendere più leggibile!

def eliminazione_di_gauss(M):
    nr = len(M)
    nc = len(M[0])
    cambi = 0
    for pivot in range(nr):
        # Eventuale scambio di righe
        if(M[pivot][pivot] == 0):
            riga = pivot+1
            while(riga < nr) and (M[riga][pivot] == 0):
                riga +=1
            if(riga == nr):
                return -1
            M[pivot], M[riga] = M[riga], M[pivot]     
            cambi += 1
        # Aggiorna le righe successive
        for r in range(pivot+1, nr):            
            if(M[r][pivot]):
                mp = M[r][pivot] / M[pivot][pivot]
                for c in range(nc):
                    M[r][c] -= mp * M[pivot][c]
    return cambi
#--------------------------------------------
from copy import deepcopy
 
A = [ [1, 2], [2, 2] ]
B = [ [1, 2, 3], [2, 2, 4] ]
C = [ [1, 2], [2, 4] ]
D = [ [1, 1, 2], [2, 2, 1], [2, 3, 1] ]
 
X = deepcopy(A)  # oppure B, C, D
e = eliminazione_di_gauss(X)
print(e, X)    # A --> 0 [ [1, 2], [0, -2] ] --> |A| = -2
               # B --> 0 [ [1, 2, 3], [0, -2, -2] ] --> x2 = -2/(-2) = 1, x1 = 3-2*1 = 1
               # C --> -1 [ [1, 2], [0, 0] ] --> |C| = 0
               # D --> 1 [ [1, 1, 2], [0, 1, -3], [0, 0, -3] ] --> |D| = (-1)*1*1*(-3) = 3