E' possibile utilizzare direttamente la funzione np.linalg.solve()
per i sistemi la cui matrice incompleta è quadrata.
Si ha il seguente sistema lineare da risolvere
\[ \begin{alignat*}{4} x_1 + 2x_2 + 3x_3 + 2x_4 = 2 \\ x_1 + 2x_2 + 4x_3 + 4x_4 = 5 \\ x_2 + 2x_3 + x_4 = 3 \end{alignat*}\]
# symbolic variables
x1, x2, x3, x4 = sp.symbols('x1 x2 x3 x4')
symbolic_vars = [x1, x2, x3, x4]
# Equazione definita con anche il termine di uguaglianza cambiato di segno
equations = [
x1 + 2*x2 + 3*x3 + 2*x4 -2,
x1 + 2*x2 + 4*x3 + 4*x4 -5,
x2 + 2*x3 + x4 - 3
]
Si trova la matrice completa:
\[ (A|b) = \begin{bmatrix} 1 & 2 & 3 & 2 | 2 \\ 1 & 2 & 4 & 4 | 5 \\ 0 & 1 & 2 & 1 | 3 \end{bmatrix}\]
matrice_completa = matrix_representation(system=equations, syms=symbolic_vars)
"""
> [[1. 2. 3. 2. 2.]
[1. 2. 4. 4. 5.]
[0. 1. 2. 1. 3.]]
"""
Si esegue la riduzione gaussiana alla matrice
\[ (A|b) = \begin{bmatrix} 1 & 2 & 3 & 2 | 2 \\ 0 & 1 & 2 & 1 | 3 \\ 0 & 0 & 1 & 2 | 3 \end{bmatrix}\]
echelon_row_matrix = upper_triangular(matrice_completa)
"""
> [[1. 2. 3. 2. 2.]
[0. 1. 2. 1. 3.]
[0. 0. 1. 2. 3.]]
"""
Non ci sono righe nella forma \(\begin{bmatrix}0 & 0 & 0 & 0 | k\end{bmatrix}\) con k != 0 dunque il sistema è compatibile e ammette \(\infty^{n incognite - rango}\) soluzioni:
# remove zero rows
backsub_matrix = echelon_row_matrix[np.any(echelon_row_matrix != 0, axis=1)]
# initialise numerical solution
numeric_solution = np.array([0., 0., 0.])
rango = np.linalg.matrix_rank(matrice_completa)
nr_parametri = 4 - rango
print(nr_parametri)
"""
> 1
"""
Quindi si considera, alla luce delle \(\infty^1\) soluzioni, si considera un solo parametro libero. Viene preso \(x_4 = a\)
soluzioni = backsubstitution(backsub_matrix, symbolic_vars)
print(soluzioni)
"""
Soluzioni su x4:
> [-2.0*x4 - 1.0, 3.0*x4 - 3.0, 3.0 - 2.0*x4, x4]
"""
quindi posto \(x4 = a\):
\[ (-2a - 1, 3a - 3, 3 - 2a, a)\]
Esattamente come nell'esercizio nel link: https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/3848-metodi-risoluzione-sistemi-lineari.html
Le funzioni: matrix_representation
, upper_triangular
e backsubstitution
sono in un file a parte (Funzioni).