Sistemi lineari (eliminazione di Gauss)

Vedi la discussione

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
#------------------------------------------------------------------
# Calcola il vettore soluzione con la sostituzione all'indietro
def sostituzione(T):
    n = len(T)  # numero di variabili
    x = [0]*n   # vettore soluzione
     
    for r in range(n-1, -1, -1):  # dal basso
        somma = T[r][n]
        for c in range(r+1, n):
            somma -= T[r][c] * x[c]            
        x[r] = somma / T[r][r]
    return x
#------------------------------------------------------------------
# Crea la copia di A e b: A|b
def copia(A, b):
    n  = len(A)
    Ab = []
    for r in range(n):
        Ab.append(A[r] + b[r])
    return Ab
#------------------------------------------------------------------
A = [ [1, 1,  2],  # 3x3
      [1, 2,  1],
      [2, 3, 10]
    ]
b = [ [ 5],        # 3x1
      [ 5],
      [17]
    ]
 
Ab    = copia(A, b)              ; print(Ab) 
esito = eliminazione_di_gauss(Ab); print(esito, Ab)

if(esito == -1):
    print("La matrice dei coefficienti è singolare")
else:
    sol = sostituzione(Ab)
    print(sol)