El backsolving es un método para resolver sistemas de ecuaciones lineales una vez que ya hemos reducido el sistema a forma triangular superior mediante eliminación gaussiana (o cualquier otra técnica de factorización como LU).
Trabajamos el mismo problema del articulo anterior:
$$ M = \begin{bmatrix} 3 & 6 & 2 \\ 10 & 3 & 8 \\ 1 & 7 & 5 \end{bmatrix} , p = \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix}, c = \begin{bmatrix} 34 \\ 69 \\ 48 \end{bmatrix} $$
Queremos resolver los precios \( (p) \) de cada producto. En este caso utilizaremos eliminación gaussiana y luego sustitución hacia atrás — eso es, reducir el sistema a triangular superior y luego encontrar las incógnitas empezando por la última.
Eliminación gaussiana (reducción hacia triangular superior)
Escribimos el sistema en sus ecuaciones explícitas (producto fila por columna):
$$ \begin{cases} 3p_1 + 6p_2 + 2p_3 = 34 \\ 10p_1 + 3p_2 + 8p_3 = 69 \\ 1p_1 + 7p_2 + 5p_3 = 48 \end{cases}$$
Paso 1 — usar la primera ecuación para eliminar \(p_1\) de las filas 2 y 3.
Despejamos \(p_1\) (temporalmente) o eliminamos directamente:
Multiplicador para la fila 2: \(\frac{10}{3}=2\).
Hacemos \(R_2 \leftarrow R_2 – 2R_1\):
- Columna 1: \(10 – 2\cdot 3 = 0\).
- Columna 2: \(3 – 2\cdot 6 = 3 – 12 = -9\).
Multiplicador para la fila 3: \(\frac{1}{3}\).
Hacemos \(R_3 \leftarrow R_3 – \frac{1}{3}R_1\).
Después de eliminar \(p_1\) en filas 2 y 3 (operaciones sobre las filas):
$$\begin{pmatrix}3 & 6 & 2 & | & 34\\0 & -17 & 4 & | & 1\\0 & \frac{4}{3} & \frac{13}{3} & | & \frac{76}{3} \end{pmatrix}$$
Nota: la fila 2 quedó con coeficiente (-17) en la columna de \(p_2\). La fila 3 tiene fracciones — eso es normal en eliminación.
Paso 2 — usar la fila 2 para eliminar la componente \(p_2\) de la fila 3.
Multiplicador para \(R_3\): \(f=\frac{\frac{4}{3}}{-17}=-\frac{4}{51}\).
Hacemos \(R_3 \leftarrow R_3 – f R_2 = R_3 + \frac{4}{51}R_2\).
Al realizar esa operación la segunda columna de \(R_3\) queda 0 y obtenemos una ecuación sólo en \(p_3\):
$$\begin{pmatrix}3 & 6 & 2 & | & 34 \\ 0 & -17 & 4 & | & 1 \\ 0 & 0 & \frac{241}{51} & | & \frac{1296}{51} \end{pmatrix}$$
Paso 3 — despejar \(p_3\) y luego usar sustitución hacia atrás.
De la tercera fila:
$$\frac{241}{51},p_3 = \frac{1296}{51} \quad\Rightarrow\quad p_3 = \frac{1296}{241}$$
Sustituyendo \(p_3\) en la segunda fila:
$$-17,p_2 + 4,p_3 = 1 \quad\Rightarrow\quad p_2 = \frac{1 – 4p_3}{-17}$$
Sustituyendo el valor numérico de \(p_3\) (o directamente resolviendo con las fracciones) se obtiene \(p_2=3\).
Finalmente sustituimos \(p_2\) y \(p_3\) en la primera ecuación para obtener (p_1), que da (p_1=2).
Conclusión del método manual (eliminación + sustitución):
$$\mathbf p = \begin{pmatrix}2 \\ 3 \\ 5\end{pmatrix}$$
¿Qué significa calcular la inversa \(M^{-1}\) y cómo se obtiene con matriz aumentada?
Otra forma más “directa” (y que explica el porqué de la eliminación) es calcular la inversa de \(M\). Si \(M\) es invertible entonces
$$\mathbf p = M^{-1}\mathbf c$$
Para encontrar \(M^{-1}\) se construye la matriz aumentada \([,M \mid I,]\) y se aplican operaciones elementales por filas hasta transformar el lado izquierdo en la identidad; entonces el lado derecho habrá quedado como \(M^{-1}\).
Verificaciones numéricas y redondeo
En la práctica, cuando calculas \(M^{-1}M\) en ordenador verás que los elementos fuera de la diagonal no son exactamente cero sino números muy pequeños (por ejemplo \(-5\times 10^{-17})\). Eso es error numérico de punto flotante. Si redondeas (por ejemplo a 10 decimales) obtendrás la matriz identidad exacta en la presentación.
Resumen conceptual
- Eliminación gaussiana: reduce el sistema a triangular superior (eliminación hacia adelante) y luego despeja las variables (sustitución hacia atrás).
- Inversa por matriz aumentada: hacer operaciones elementales sobre \([M\mid I]\) hasta convertir \(M\) en \(I\); lo que quede a la derecha será \(M^{-1}\).
- Comprobación: puedes verificar que \(M^{-1}\mathbf c = \mathbf p\) y \(M^{-1}M = I\) (hasta errores numéricos muy pequeños).
Código Python
import numpy as np
# Definición de la matriz y vectores (el sistema del ejemplo)
M = np.array([[3, 6, 2],
[10, 3, 8],
[1, 7, 5]], dtype=float)
c = np.array([34, 69, 48], dtype=float)
# 1) Resolver el sistema M p = c
p = np.linalg.solve(M, c)
print("Solución (np.linalg.solve):", p)
# 2) Calcular la inversa de M
M_inv = np.linalg.inv(M)
print("\nInversa M^{-1}:\n", M_inv)
# 3) Verificar que M^{-1} * c = p
p_from_inv = M_inv @ c
print("\nM^{-1} @ c =", p_from_inv)
# 4) Verificar que M_inv @ M ≈ I (mostramos la matriz y una versión redondeada)
I_approx = M_inv @ M
print("\nM^{-1} @ M (aprox):\n", I_approx)
print("\nM^{-1} @ M (redondeado a 10 decimales):\n", np.round(I_approx, 10))
Salida:
Solución (np.linalg.solve): [2. 3. 5.]
Inversa M^{-1}:
[[ 0.17012448 0.06639004 -0.17427386]
[ 0.17427386 -0.05394191 0.01659751]
[-0.2780083 0.06224066 0.21161826]]
M^{-1} @ c = [2. 3. 5.]
M^{-1} @ M (aprox):
[[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[-1.56125113e-16 1.00000000e+00 -5.55111512e-17]
[ 5.55111512e-17 0.00000000e+00 1.00000000e+00]]
M^{-1} @ M (redondeado a 10 decimales):
[[ 1. 0. 0.]
[-0. 1. -0.]
[ 0. 0. 1.]]
Qué observar al ejecutar:
pdebe salir como[2. 3. 5.].M_inv @ cdebe coincidir conp(igual numéricamente, dentro de tolerancias de punto flotante).M_inv @ Mserá numéricamente la identidad; si ves valores muy pequeños fuera de la diagonal, es normal: redondea para comprobar que esos valores son efectivamente cero dentro de la precisión de la máquina.
Resumen
La eliminación y la inversa son dos caras de la misma moneda: la primera resuelve un sistema concreto, la segunda construye la “función inversa” que, aplicada a cualquier vector de costes, devolvería los precios.
En aplicaciones (ciencia de datos, econometría, ingeniería), normalmente no calculamos la inversa si solo queremos resolver un sistema: usamos solve (algoritmos de factorización) por razones de estabilidad numérica y eficiencia. Sin embargo, obtener la inversa es útil para entender conceptualmente la transformada inversa y para comprobaciones.
Deja una respuesta