Los determinantes de orden 2 y 3 pueden calcularse mediante fórmulas directas. Practicaremos el procedimiento con diagonales, cofactores, la regla de Sarrus y algoritmos en JavaScript.
En los temas anteriores definimos el determinante y estudiamos sus propiedades. Ahora nos concentraremos en calcularlo correctamente para matrices de órdenes 2 y 3.
Estos casos son importantes porque aparecen en transformaciones 2D y 3D, áreas, volúmenes, sistemas pequeños y construcción de menores para matrices de mayor orden.
Sea A una matriz 2 × 2:
Su determinante se calcula multiplicando los elementos de la diagonal principal y restando el producto de la diagonal secundaria.
El orden de la resta es importante: diagonal principal menos diagonal secundaria.
function determinante2x2(A) {
const a = A[0][0];
const b = A[0][1];
const c = A[1][0];
const d = A[1][1];
return a * d - b * c;
}
console.log(determinante2x2([[4, 2], [1, 3]]));
El resultado es 10.
| Matriz | Cálculo | Resultado |
|---|---|---|
| [[4, 2], [1, 3]] | 4·3 - 2·1 | 10 |
| [[1, 3], [2, 4]] | 1·4 - 3·2 | -2 |
| [[1, 2], [2, 4]] | 1·4 - 2·2 | 0 |
const det2 = A => A[0][0] * A[1][1] - A[0][1] * A[1][0];
console.log(det2([[4, 2], [1, 3]]));
console.log(det2([[1, 3], [2, 4]]));
console.log(det2([[1, 2], [2, 4]]));
Una función reutilizable debe rechazar matrices de otro orden y valores no numéricos.
function determinante2x2(A) {
const valida = Array.isArray(A) &&
A.length === 2 &&
A.every(fila =>
Array.isArray(fila) && fila.length === 2 && fila.every(Number.isFinite)
);
if (!valida) throw new Error("Se requiere una matriz numérica 2 × 2");
return A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
console.log(determinante2x2([[3, 5], [2, 7]]));
Sea A una matriz 3 × 3:
Expandiendo por la primera fila obtenemos:
Los signos alternan +, -, +.
function det3PorCofactores(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
const menor11 = e * i - f * h;
const menor12 = d * i - f * g;
const menor13 = d * h - e * g;
return a * menor11 - b * menor12 + c * menor13;
}
console.log(det3PorCofactores([[2, 1, 3], [0, 4, 5], [1, 2, 6]]));
La regla de Sarrus es un recurso visual exclusivo para matrices 3 × 3. Se copian las dos primeras columnas a la derecha y se forman seis productos diagonales.
La regla no debe aplicarse a matrices 4 × 4 ni de otros órdenes.
Para la misma matriz del ejemplo anterior:
function det3Sarrus(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
const positivos = a * e * i + b * f * g + c * d * h;
const negativos = c * e * g + b * d * i + a * f * h;
return positivos - negativos;
}
console.log(det3Sarrus([[2, 1, 3], [0, 4, 5], [1, 2, 6]]));
Podemos escribir la fórmula de cofactores en una función compacta.
function determinante3x3(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
return a * (e * i - f * h)
- b * (d * i - f * g)
+ c * (d * h - e * g);
}
console.log(determinante3x3([[1, 2, 3], [0, 1, 4], [5, 6, 0]]));
El resultado de este ejemplo es 1.
Una implementación basada en menores hace visible el procedimiento matemático y puede adaptarse a otras filas.
function det2(A) {
return A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
function menor(A, filaEliminada, columnaEliminada) {
return A
.filter((_, i) => i !== filaEliminada)
.map(fila => fila.filter((_, j) => j !== columnaEliminada));
}
function det3(A) {
return A[0].reduce((suma, valor, j) => {
const signo = j % 2 === 0 ? 1 : -1;
return suma + signo * valor * det2(menor(A, 0, j));
}, 0);
}
console.log(det3([[2, 1, 3], [0, 4, 5], [1, 2, 6]]));
La expansión por cofactores puede hacerse por cualquier fila o columna. Elegir una con ceros reduce la cantidad de menores necesarios.
const A = [[2, 0, 0], [3, 4, 5], [1, 2, 6]];
const menor11 = A[1][1] * A[2][2] - A[1][2] * A[2][1];
const determinante = A[0][0] * menor11;
console.log(determinante);
También podemos usar operaciones por filas para obtener una matriz triangular. El determinante será el producto de la diagonal, ajustado por los intercambios de filas.
function det3PorEliminacion(matriz, tolerancia = 1e-12) {
const A = matriz.map(fila => [...fila]);
let signo = 1;
for (let i = 0; i < 3; i++) {
let pivote = i;
for (let fila = i + 1; fila < 3; fila++) {
if (Math.abs(A[fila][i]) > Math.abs(A[pivote][i])) pivote = fila;
}
if (Math.abs(A[pivote][i]) <= tolerancia) return 0;
if (pivote !== i) {
[A[i], A[pivote]] = [A[pivote], A[i]];
signo *= -1;
}
for (let fila = i + 1; fila < 3; fila++) {
const factor = A[fila][i] / A[i][i];
for (let columna = i; columna < 3; columna++) {
A[fila][columna] -= factor * A[i][columna];
}
}
}
return signo * A[0][0] * A[1][1] * A[2][2];
}
console.log(det3PorEliminacion([[2, 1, 3], [0, 4, 5], [1, 2, 6]]));
| Método | Órdenes | Ventaja | Limitación |
|---|---|---|---|
| ad - bc | 2 × 2 | Muy directo | Solo orden 2 |
| Sarrus | 3 × 3 | Visual y rápido | Solo orden 3 |
| Cofactores | Cualquier orden | General y conceptual | Costoso para matrices grandes |
| Eliminación | Cualquier orden | Más eficiente | Requiere controlar operaciones por filas |
Durante el aprendizaje es útil implementar dos fórmulas independientes y comprobar que coincidan.
function porCofactores(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
return a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
}
function porSarrus(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
return (a * e * i + b * f * g + c * d * h)
- (c * e * g + b * d * i + a * f * h);
}
const matrices = [
[[2, 1, 3], [0, 4, 5], [1, 2, 6]],
[[1, 2, 3], [0, 1, 4], [5, 6, 0]],
[[1, 2, 3], [2, 4, 6], [7, 8, 9]]
];
matrices.forEach(A =>
console.log(porCofactores(A), porSarrus(A))
);
Los pares de resultados deben coincidir: 21, 1 y 0.
En 2D, el determinante permite calcular el área orientada de un paralelogramo o el área de un triángulo.
function areaTriangulo(a, b, c) {
const ab = [b[0] - a[0], b[1] - a[1]];
const ac = [c[0] - a[0], c[1] - a[1]];
const determinante = ab[0] * ac[1] - ab[1] * ac[0];
return Math.abs(determinante) / 2;
}
console.log(areaTriangulo([0, 0], [4, 0], [1, 3]));
En 3D, el valor absoluto del determinante de tres vectores columna es el volumen del paralelepípedo que forman.
function volumenParalelepipedo(A) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
const det = a * (e * i - f * h)
- b * (d * i - f * g)
+ c * (d * h - e * g);
return Math.abs(det);
}
console.log(volumenParalelepipedo([[2, 0, 0], [0, 3, 0], [0, 0, 4]]));
Con valores decimales conviene interpretar un determinante muy pequeño usando una tolerancia relacionada con la escala de la matriz.
function casiSingular3x3(A, factor = 100) {
const [[a, b, c], [d, e, f], [g, h, i]] = A;
const det = a * (e * i - f * h)
- b * (d * i - f * g)
+ c * (d * h - e * g);
const escala = Math.max(...A.flat().map(Math.abs));
const tolerancia = factor * Number.EPSILON * Math.max(1, escala ** 3);
return Math.abs(det) <= tolerancia;
}
console.log(casiSingular3x3([
[0.1, 0.2, 0.3],
[0.2, 0.4, 0.6],
[1, 0, 1]
]));
Los errores más frecuentes son invertir la resta en orden 2, olvidar el signo negativo del segundo cofactor, sumar en lugar de restar las diagonales negativas de Sarrus, aplicar Sarrus a otro orden y comparar decimales siempre con cero exacto.
Los determinantes de órdenes 2 y 3 pueden calcularse con fórmulas directas, pero comprender menores, cofactores y operaciones por filas prepara el camino para órdenes mayores y algoritmos numéricos.
En el próximo tema estudiaremos la matriz inversa, cuya existencia depende de que el determinante sea distinto de cero.