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)