La matrice da elaborare è, eventualmente, rettangolare.
La matrice viene resa prima triangolare superiore (se il valore di ritorno è -1 la procedura ha fallito).
Segue l’eliminazione dal basso verso l’alto per arrivare alla matrice diagonale.
Se la matrice originale è nxn la daigonale 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_jordan(M):
nr = len(M)
nc = len(M[0])
# triangolare inferiore
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]
# diagonale
for pivot in range(nr-1, -1, -1):
for r in range(pivot-1, -1, -1):
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, 3],
[1, 2, 1],
[1, 1, 1]
]
X = deepcopy(A) ; print(X)
e = eliminazione_di_gauss_jordan(X) ; print(e, X)