Un sistema lineal reúne varias condiciones que deben cumplirse simultáneamente. Su representación matricial permite analizar las soluciones y aplicar algoritmos generales.
Muchos problemas requieren encontrar varios valores desconocidos relacionados por distintas condiciones. Por ejemplo, calcular los precios de dos productos a partir de cantidades y totales.
Cuando todas las condiciones son ecuaciones lineales, forman un sistema de ecuaciones lineales. Resolverlo significa encontrar valores que satisfagan todas las ecuaciones al mismo tiempo.
Una ecuación lineal con n incógnitas tiene la forma:
Los valores ai son coeficientes, xi son incógnitas y b es el término independiente. Las incógnitas aparecen solo con exponente 1 y no se multiplican entre sí.
| Expresión | ¿Es lineal? | Motivo |
|---|---|---|
| 2x − 3y = 7 | Sí | Las variables tienen grado 1 |
| x2 + y = 4 | No | Aparece x al cuadrado |
| xy = 5 | No | Las variables se multiplican |
| 4x + 0y = 8 | Sí | Un coeficiente puede ser cero |
Un sistema de m ecuaciones con n incógnitas puede escribirse como:
Cada ecuación agrega una condición. Sin embargo, una condición repetida o dependiente no aporta información nueva.
Consideremos el sistema:
Al sumar las ecuaciones se obtiene 3x = 6, por lo que x = 2. Sustituyendo en la primera ecuación resulta y = 3.
const x = 2;
const y = 3;
console.log(x + y === 5); // true
console.log(2 * x - y === 1); // true
Una solución es una lista ordenada de valores, uno por cada incógnita. El orden debe conservarse: para variables (x, y), la pareja (2, 3) no representa lo mismo que (3, 2).
La solución del ejemplo anterior puede expresarse como vector columna:
const solucion = [2, 3];
const [x, y] = solucion;
console.log({ x, y }); // { x: 2, y: 3 }
Para comprobar una solución se sustituye en todas las ecuaciones. En programas que trabajan con decimales conviene utilizar una tolerancia.
function verificarSistema(A, x, b, tolerancia = 1e-10) {
return A.every((fila, i) => {
const resultado = fila.reduce(
(suma, coeficiente, j) => suma + coeficiente * x[j],
0
);
return Math.abs(resultado - b[i]) < tolerancia;
});
}
const A = [[1, 1], [2, -1]];
console.log(verificarSistema(A, [2, 3], [5, 1])); // true
En dos incógnitas, cada ecuación lineal representa una recta. Resolver el sistema equivale a buscar los puntos comunes:
Con tres incógnitas, cada ecuación representa un plano. En dimensiones mayores se habla de hiperplanos.
| Clasificación | Cantidad de soluciones | Nombre habitual |
|---|---|---|
| Compatible determinado | Una | Solución única |
| Compatible indeterminado | Infinitas | Variables libres |
| Incompatible | Ninguna | Contradicción |
Para un sistema lineal sobre los números reales no existe el caso de exactamente dos o tres soluciones: si aparecen dos soluciones diferentes, existen infinitas combinaciones entre ellas.
Los coeficientes, las incógnitas y los términos independientes pueden separarse para escribir el sistema de forma compacta:
Para x + y = 5 y 2x − y = 1:
La fila i de A contiene los coeficientes de la ecuación i. La columna j corresponde siempre a la misma incógnita.
El sistema 3x − 2y + z = 7, x + 4y − z = 2 se representa con dos filas y tres columnas.
const A = [[3, -2, 1], [1, 4, -1]];
const variables = ["x", "y", "z"];
const b = [7, 2];
console.log(A.length); // 2 ecuaciones
console.log(A[0].length); // 3 incógnitas
console.log(variables, b);
Es esencial completar con ceros los coeficientes ausentes. Por ejemplo, x + z = 4 debe registrarse como [1, 0, 1].
La matriz aumentada [A | b] agrega los términos independientes como última columna. Es la estructura usada por los métodos de Gauss y Gauss-Jordan.
function matrizAumentada(A, b) {
if (A.length !== b.length) {
throw new Error("Debe existir un término independiente por ecuación");
}
return A.map((fila, i) => [...fila, b[i]]);
}
const A = [[1, 1], [2, -1]];
console.log(matrizAumentada(A, [5, 1]));
// [[1, 1, 5], [2, -1, 1]]
| Relación | Tipo | Observación |
|---|---|---|
| m = n | Cuadrado | Igual número de ecuaciones e incógnitas |
| m > n | Sobredeterminado | Más ecuaciones que incógnitas |
| m < n | Subdeterminado | Menos ecuaciones que incógnitas |
La cantidad de ecuaciones por sí sola no determina la cantidad de soluciones. También importa si las ecuaciones aportan información independiente y si son compatibles.
function tipoPorDimensiones(A) {
const m = A.length;
const n = A[0].length;
if (m === n) return "cuadrado";
return m > n ? "sobredeterminado" : "subdeterminado";
}
console.log(tipoPorDimensiones([[1, 0], [0, 1], [1, 1]]));
El teorema de Rouché-Frobenius clasifica el sistema comparando rango(A), rango([A | b]) y el número n de incógnitas:
function clasificarSistema(rangoA, rangoAumentada, incognitas) {
if (rangoA !== rangoAumentada) return "sin solución";
if (rangoA === incognitas) return "solución única";
return "infinitas soluciones";
}
console.log(clasificarSistema(2, 2, 2)); // solución única
console.log(clasificarSistema(1, 2, 2)); // sin solución
Si A es cuadrada e invertible, el sistema Ax = b tiene exactamente una solución para cualquier vector b:
Las siguientes condiciones son equivalentes para A de orden n: det(A) ≠ 0, rango(A) = n, A es invertible y Ax = b posee solución única para todo b.
Aunque la fórmula con la inversa explica la teoría, los programas numéricos suelen resolver el sistema directamente mediante eliminación o factorización.
Un sistema es homogéneo cuando todos los términos independientes son cero:
Siempre posee la solución trivial x = 0. Si rango(A) es menor que el número de incógnitas, también existen soluciones no triviales.
const A = [[1, 2], [2, 4]];
const solucionTrivial = [0, 0];
const resultado = A.map(fila =>
fila.reduce((suma, valor, j) => suma + valor * solucionTrivial[j], 0)
);
console.log(resultado); // [0, 0]
Existen varios métodos, adecuados para contextos diferentes:
| Método | Idea | Uso |
|---|---|---|
| Sustitución | Despejar y reemplazar | Sistemas pequeños |
| Eliminación de Gauss | Escalonar y sustituir hacia atrás | Método general |
| Gauss-Jordan | Obtener forma escalonada reducida | Leer soluciones directamente |
| Regla de Cramer | Usar determinantes | Sistemas cuadrados pequeños con det(A) ≠ 0 |
| Factorizaciones | Descomponer A | Cálculo numérico eficiente |
Los próximos temas desarrollarán Gauss, Gauss-Jordan y la regla de Cramer.
Dos cuadernos y tres lápices cuestan 13 unidades monetarias. Un cuaderno y dos lápices cuestan 8. Si c es el precio del cuaderno y l el del lápiz:
La solución es c = 2 y l = 3.
const precioCuaderno = 2;
const precioLapiz = 3;
const compra1 = 2 * precioCuaderno + 3 * precioLapiz;
const compra2 = precioCuaderno + 2 * precioLapiz;
console.log({ compra1, compra2 }); // { compra1: 13, compra2: 8 }
Los sistemas lineales aparecen en simulaciones, circuitos, gráficos, equilibrio de recursos, ajuste de modelos, economía y reconstrucción de imágenes.
Al modelarlos conviene evitar estos errores:
function filaConVariables(coeficientes, cantidadVariables) {
if (coeficientes.length !== cantidadVariables) {
throw new Error("Faltan o sobran coeficientes");
}
return [...coeficientes];
}
console.log(filaConVariables([1, 0, 3], 3));
La notación Ax = b convierte un conjunto de ecuaciones en un problema matricial organizado. El rango permite anticipar cuántas soluciones existen, mientras que los métodos de eliminación permiten calcularlas.
En el próximo tema estudiaremos el método de eliminación de Gauss para transformar un sistema en otro equivalente y resolverlo mediante sustitución hacia atrás.