Risolve il sistema lineare con la regola di Cramer.
Utilizza una funzione di copia specifica e una funzione per il determinante.
def copia(A, b, i):
n = len(A)
Ai = []
for r in range(n):
riga = []
for c in range(n):
riga.append(A[r][c])
riga[i] = b[r] # Nella colonna i assegna il valore di b
Ai.append(riga)
return Ai
def regola_di_cramer(A, b):
n = len(A)
dA = determinante(A) # Determinante di A
x = [] # Vettore soluzione, vuoto
for i in range(n): # Per ogni variabile xi
Ai = copia(A, b, i) # Una copia di A con b alla colonna i
dAi = determinante(Ai) # Determinante di Ai
xi = dAi/dA # Calcola xi come rapporto tra ...
x.append(xi) # Aggiunge xi al vettore soluzione x
return x
Prova
A = [ [2, 7],
[1, 0]
]
b = [ 27,
10
]
print(regola_di_cramer(A, b)) # [10.0 1.0]
copy, numpy
Utilizza alcune funzioni dei moduli, copy.deepcopy() e numpy.linalg.det(), e aggiunge alcuni controlli.
from copy import deepcopy as copia
from numpy.linalg import det as determinante
def regola_di_cramer(A, b):
n = len(A)
if(n != len(A[0])): return None
if(n != len(b) ): return None
dA = determinante(A)
if(dA == 0): return None
x = n*[0.0]
for i in range(n):
Ai = copia(A) # Una copia di A
for r in range(n): # Con b nella colonna i
Ai[r][i] = b[r]
dAi = determinante(Ai)
x[i] = dAi / dA
return x
A = [ [2, 1, 1, 1],
[1, 2, 1, 1],
[1, 1, 2, 1],
[1, 1, 1, 2]
]
b = [ 11,
12,
13,
14
]
print(regola_di_cramer(A, b))