Sistemi lineari (regola di Cramer)

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))