Un sistema de ecuaciones lineales de ecuaciones y incógnitas tiene la forma
y se escribe de forma compacta como
Resolverlo es determinar el conjunto . Ese conjunto es vacío, un único punto o un subespacio afín de dimensión positiva; no hay más casos.
El sistema que sirve de ejemplo a lo largo de la lección es
Forma matricial
La fila de recoge los coeficientes de la ecuación ; la componente de , su término independiente. Los coeficientes nulos ocupan posición: la tercera ecuación carece de , luego .
import numpy as np
A = np.array([[1, 1, 1],
[1, -1, 2],
[0, 1, 1]])
b = np.array([3, 2, 2])
Resolución con NumPy
Cuando y es invertible, la solución es única y se obtiene con np.linalg.solve:
x = np.linalg.solve(A, b)
# array([1., 1., 1.])
La rutina no calcula . Aplica eliminación gaussiana con pivoteo parcial, que produce la factorización
con una matriz de permutación, triangular inferior unitaria y triangular superior. El sistema se resuelve entonces en dos sustituciones encadenadas, y , ambas inmediatas por triangularidad. El coste es operaciones. La implementación delega en LAPACK.
La matriz de permutación no es un tecnicismo prescindible: sin pivoteo, un pivote nulo detiene el proceso y un pivote de magnitud pequeña amplifica el error de redondeo.
Eliminación gaussiana
La figura aplica el método de Gauss-Jordan sobre la matriz ampliada . Cada paso es una operación elemental de fila. El proceso termina cuando el bloque izquierdo es la identidad, y en ese momento la columna derecha contiene la solución.
Matriz ampliada [A | b]
Paso 1 / 9
Las tres operaciones elementales —intercambiar dos filas, multiplicar una fila por un escalar no nulo y sumar a una fila un múltiplo de otra— son invertibles, de modo que preservan el conjunto de soluciones.
Verificación
np.allclose(A @ x, b)
# True
El operador @ denota el producto matricial. La comparación se hace con allclose y no con ==: en aritmética de coma flotante la solución calculada satisface con un residuo del orden del épsilon de máquina, y la igualdad estricta resultaría falsa.
Interpretación geométrica
Para , cada ecuación con describe una recta en , y el conjunto solución del sistema es la intersección de ambas.
Cada ecuación describe una recta. Los deslizadores modifican sus coeficientes.
1·x₁ + 1·x₂ = 1.25
1·x₁ − 2·x₂ = 0.5
Solución única: las rectas se cortan en un punto.
det = -3 · x = (1, 0.25)
Dos rectas del plano se cortan en un punto, son paralelas y disjuntas, o coinciden. Esos tres casos agotan las posibilidades y se corresponden con solución única, sistema incompatible y sistema compatible indeterminado. Para cada ecuación describe un plano y la intersección de los tres es un punto, una recta, un plano o el conjunto vacío.
Existencia y unicidad
El rango de una matriz es el número de filas linealmente independientes, equivalentemente el número de columnas linealmente independientes. El criterio que resuelve la cuestión es el teorema de Rouché-Frobenius:
Una matriz cuadrada con se denomina singular y no admite inversa. np.linalg.solve exige cuadrada y no singular; en caso contrario lanza una excepción.
C = np.array([[1, 1, 1],
[1, -1, 2],
[2, 0, 3]]) # fila 3 = fila 1 + fila 2
np.linalg.solve(C, np.array([3, 2, 1]))
# LinAlgError: Singular matrix
np.linalg.matrix_rank(C) # 2
En este caso . El término independiente decide entre los dos casos restantes: con se cumple , el rango de la ampliada sigue siendo 2 y el sistema tiene infinitas soluciones; con el rango de la ampliada es 3 y el sistema es incompatible.
Matriz ampliada de un sistema incompatible
Paso 1 / 8
El estado final exhibe una fila nula en el bloque correspondiente a con término independiente no nulo. Esa fila codifica la ecuación con , que es la forma en que la eliminación manifiesta la incompatibilidad.
Para sistemas sin solución exacta, np.linalg.lstsq devuelve el minimizador de ; si ese minimizador no es único, devuelve el de norma mínima.
x, residuos, rango, sv = np.linalg.lstsq(C, np.array([3, 2, 1]), rcond=None)
solve frente a inv
Para resolver con invertible, ambas expresiones son matemáticamente equivalentes:
x = np.linalg.solve(A, b) # recomendado
x = np.linalg.inv(A) @ b # desaconsejado
Numéricamente no lo son. Calcular requiere resolver sistemas en lugar de uno, y el producto posterior añade una segunda fuente de error de redondeo. La cota de error de la segunda vía es peor, y la diferencia crece con el número de condición de . La inversa explícita solo se justifica cuando la propia matriz es el objeto de interés, lo que en la práctica es infrecuente.
Ejercicio. Sustituir el coeficiente de C por y recalcular el rango. Determinar si la matriz resultante sigue siendo singular y qué configuración geométrica de los tres planos corresponde a cada caso.