Matrices

Si los vectores son los átomos del álgebra lineal, las matrices son las moléculas. Son la herramienta fundamental para representar transformaciones, resolver sistemas de ecuaciones y manipular datos estructurados.

Concepto

Al igual que con los vectores, el concepto de "matriz" puede referirse a distintas ideas según el contexto.

Nota histórica

El término "matriz" fue introducido por James Joseph Sylvester en 1850. Sin embargo, el desarrollo sistemático de la teoría de matrices se atribuye a Arthur Cayley, quien en 1858 publicó "A Memoir on the Theory of Matrices", estableciendo las reglas de la aritmética matricial que usamos hoy.

Matriz en programación

Para un programador, una matriz es simplemente un array bidimensional (un array de arrays). Es una tabla de datos organizada en filas y columnas.

MatrixExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MatrixExample {
public static void main(String[] args) {
// Una matriz de 2x3 (2 filas, 3 columnas)
double[][] matrix = {
{1.0, 2.0, 3.0},
{4.0, 5.0, 6.0}
};
// Acceder al elemento en fila 1, columna 2
System.out.println(matrix[1][2]); // 6.0
// Imprimir la matriz completa
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}

Matriz en geometría: Transformaciones del espacio

Aquí es donde las matrices revelan su verdadero poder. Geométricamente, una matriz representa una transformación del espacio.

Mientras que un vector es un punto (o flecha) en el espacio, una matriz es una instrucción de cómo mover, rotar o deformar ese punto.

  • Una matriz puede rotar vectores
  • Una matriz puede escalar (estirar o encoger) vectores
  • Una matriz puede reflejar vectores (como un espejo)
  • Una matriz puede proyectar vectores (reducir dimensiones)

Intuición clave

Piensa en una matriz como una "función" que toma un vector como entrada y produce otro vector transformado como salida.

vnuevo=Avviejo\vec{v}_{nuevo} = A \cdot \vec{v}_{viejo}

Cada entrada produce una salida diferente, pero la "regla de transformación" (la matriz) permanece igual.

Representación matemática de una matriz

Una matriz AA de dimensión m×nm \times n tiene mm filas y nn columnas:

A=(a1,1a1,2a1,na2,1a2,2a2,nam,1am,2am,n)A = \begin{pmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & a_{m,2} & \cdots & a_{m,n} \end{pmatrix}

Cada elemento ai,ja_{i,j} representa el valor en la fila ii y columna jj.

Ejemplos de dimensiones:

DimensiónNombreUso común
2×22 \times 2Cuadrada pequeñaTransformaciones 2D
3×33 \times 3CuadradaTransformaciones 3D, rotaciones
m×nm \times nRectangularDatos tabulares, sistemas de ecuaciones
1×n1 \times nVector filaUna observación con nn características
m×1m \times 1Vector columnamm observaciones de una variable

Representando imágenes como matrices

Una aplicación natural de las matrices es la representación de imágenes digitales. Una imagen en escala de grises puede verse como una matriz donde cada elemento representa la intensidad de un píxel (0 = negro, 255 = blanco).

Por ejemplo, una imagen simple de 4×44 \times 4 píxeles:

Imagen=(00255255002552552552550025525500)\text{Imagen} = \begin{pmatrix} 0 & 0 & 255 & 255 \\ 0 & 0 & 255 & 255 \\ 255 & 255 & 0 & 0 \\ 255 & 255 & 0 & 0 \end{pmatrix}

Esta matriz representa una imagen dividida en cuadrantes: negro arriba-izquierda, blanco arriba-derecha, blanco abajo-izquierda, y negro abajo-derecha.

Para imágenes a color, se utilizan tres matrices (una por cada canal: Rojo, Verde, Azul), formando lo que se conoce como un tensor de dimensión m×n×3m \times n \times 3.


Operaciones con Matrices

Para que las matrices sean útiles, necesitamos operar con ellas. Empecemos por las más sencillas.

1. Suma de matrices

Solo podemos sumar matrices si tienen las mismas dimensiones. Sumamos elemento a elemento.

(1234)+(5678)=(1+52+63+74+8)=(681012)\begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} + \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} = \begin{pmatrix} 1+5 & 2+6 \\ 3+7 & 4+8 \end{pmatrix} = \begin{pmatrix} 6 & 8 \\ 10 & 12 \end{pmatrix}

Ejemplo en Minerva:

Example.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import com.minerva.core.primitives.Matrix;
public class Main {
public static void main(String[] args) {
Matrix A = new Matrix(new double[][]{
{1, 2},
{3, 4}
});
Matrix B = new Matrix(new double[][]{
{5, 6},
{7, 8}
});
Matrix C = A.add(B);
System.out.println("A + B = \n" + C);
}
}
java Main
A + B =
[6, 8]
[10, 12]

2. Multiplicación por escalar

Multiplicamos cada elemento de la matriz por un número.

3(1234)=(36912)3 \cdot \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} = \begin{pmatrix} 3 & 6 \\ 9 & 12 \end{pmatrix}

Esto "escala" toda la matriz uniformemente.

En Minerva, esta operación se puede realizar elemento a elemento multiplicando cada entrada de la matriz.

3. Transpuesta

La transpuesta de una matriz AA (denotada ATA^T) consiste en intercambiar filas por columnas. Lo que era la fila 1 se convierte en la columna 1.

Si A=(123456)A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} (dimensión 2×32 \times 3), entonces:

AT=(142536)A^T = \begin{pmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{pmatrix}

Nota que ATA^T tiene dimensión 3×23 \times 2.

Propiedades importantes:

  • (AT)T=A(A^T)^T = A — transponer dos veces devuelve la original
  • (A+B)T=AT+BT(A + B)^T = A^T + B^T — la transpuesta distribuye sobre la suma
  • (AB)T=BTAT(AB)^T = B^T A^T — ¡el orden se invierte!
Example.java
1
2
3
4
Matrix A = new Matrix(new double[][]{ {1, 2, 3}, {4, 5, 6} });
Matrix At = A.transpose();
System.out.println("Original: " + A.rows() + "x" + A.cols());
System.out.println("Transpuesta: " + At.rows() + "x" + At.cols());
java Main
Original: 2x3
Transpuesta: 3x2

4. Multiplicación de matrices

Esta es la operación más importante del álgebra lineal. A diferencia de la suma, no multiplicamos elemento a elemento.

Para multiplicar A×BA \times B:

  1. Tomamos una fila de AA
  2. Tomamos una columna de BB
  3. Calculamos su producto punto (como vimos en la sección de vectores)
  4. Ese resultado va en la posición correspondiente

Requisito de dimensión: Para multiplicar una matriz m×nm \times n por una p×qp \times q, necesitamos que n=pn = p. El resultado tendrá dimensión m×qm \times q.

Am×nBn×q=Cm×q\underbrace{A}_{m \times n} \cdot \underbrace{B}_{n \times q} = \underbrace{C}_{m \times q}

Veamos un ejemplo paso a paso:

(1234)(5678)\begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \cdot \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix}

Para calcular el elemento c1,1c_{1,1} (fila 1, columna 1):

c1,1=(1,2)fila 1 de A(57)col 1 de B=15+27=19c_{1,1} = \underbrace{(1, 2)}_{\text{fila 1 de A}} \cdot \underbrace{\begin{pmatrix}5\\7\end{pmatrix}}_{\text{col 1 de B}} = 1 \cdot 5 + 2 \cdot 7 = 19

Repitiendo para todos los elementos:

(1234)(5678)=((15+27)(16+28)(35+47)(36+48))=(19224350)\begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \cdot \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} = \begin{pmatrix} (1 \cdot 5 + 2 \cdot 7) & (1 \cdot 6 + 2 \cdot 8) \\ (3 \cdot 5 + 4 \cdot 7) & (3 \cdot 6 + 4 \cdot 8) \end{pmatrix} = \begin{pmatrix} 19 & 22 \\ 43 & 50 \end{pmatrix}
Example.java
1
2
3
4
Matrix A = new Matrix(new double[][]{ {1, 2}, {3, 4} });
Matrix B = new Matrix(new double[][]{ {5, 6}, {7, 8} });
Matrix C = A.multiply(B);
System.out.println("A × B = \n" + C);
java Main
A × B =
[19, 22]
[43, 50]

¡El orden importa!

En matrices, el orden de multiplicación importa.

ABBAA \cdot B \neq B \cdot A

De hecho, a veces BAB \cdot A ni siquiera se puede calcular si las dimensiones no coinciden. Esto es muy diferente a los números, donde 3×5=5×33 \times 5 = 5 \times 3.


Transformaciones geométricas

Las matrices nos permiten describir matemáticamente cómo transformar puntos en el espacio. Cada tipo de transformación tiene una matriz característica.

Rotación

La matriz de rotación para un ángulo θ\theta (en sentido antihorario) es:

R(θ)=(cosθsinθsinθcosθ)R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}

Ejemplo: Rotar el vector v=(1,0)\vec{v} = (1, 0) un ángulo de 90° (θ=π2\theta = \frac{\pi}{2}):

R(90°)=(cos(90°)sin(90°)sin(90°)cos(90°))=(0110)R(90°) = \begin{pmatrix} \cos(90°) & -\sin(90°) \\ \sin(90°) & \cos(90°) \end{pmatrix} = \begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} R(90°)v=(0110)(10)=(01)R(90°) \cdot \vec{v} = \begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \end{pmatrix}

El vector (1,0)(1, 0) que apuntaba a la derecha ahora apunta hacia arriba (0,1)(0, 1).

Algunas rotaciones comunes:

Ángulocosθ\cos\thetasinθ\sin\thetaMatriz
10(1001)\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}
90°01(0110)\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix}
180°-10(1001)\begin{pmatrix} -1 & 0 \\ 0 & -1 \end{pmatrix}
270°0-1(0110)\begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix}

Escalado

La matriz de escalado multiplica cada componente por un factor:

S(sx,sy)=(sx00sy)S(s_x, s_y) = \begin{pmatrix} s_x & 0 \\ 0 & s_y \end{pmatrix}
  • Si sx=sys_x = s_y: escalado uniforme (agranda o encoge proporcionalmente)
  • Si sxsys_x \neq s_y: escalado no uniforme (estira en una dirección)
  • Si s<1s < 1: encoge
  • Si s>1s > 1: agranda
  • Si s<0s < 0: refleja además de escalar

Ejemplo: Duplicar el tamaño de un vector:

S(2,2)(34)=(2002)(34)=(68)S(2, 2) \cdot \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2 & 0 \\ 0 & 2 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 6 \\ 8 \end{pmatrix}

Reflexión

Las matrices de reflexión "voltean" los vectores respecto a un eje.

Reflexión respecto al eje X (voltea verticalmente):

Mx=(1001)M_x = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

Reflexión respecto al eje Y (voltea horizontalmente):

My=(1001)M_y = \begin{pmatrix} -1 & 0 \\ 0 & 1 \end{pmatrix}

Reflexión respecto al origen (voltea en ambos ejes):

Mo=(1001)M_o = \begin{pmatrix} -1 & 0 \\ 0 & -1 \end{pmatrix}

Reflexión respecto a la diagonal y=xy = x:

Md=(0110)M_d = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

Ejemplo: Reflejar (3,4)(3, 4) respecto al eje X:

Mx(34)=(1001)(34)=(34)M_x \cdot \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 3 \\ -4 \end{pmatrix}

Cizallamiento (Shear)

El cizallamiento "inclina" las figuras manteniendo el área constante.

Cizallamiento horizontal (inclina a lo largo de X):

Shx(k)=(1k01)Sh_x(k) = \begin{pmatrix} 1 & k \\ 0 & 1 \end{pmatrix}

Cizallamiento vertical (inclina a lo largo de Y):

Shy(k)=(10k1)Sh_y(k) = \begin{pmatrix} 1 & 0 \\ k & 1 \end{pmatrix}

Ejemplo: Aplicar cizallamiento horizontal con k=0.5k = 0.5 a (2,4)(2, 4):

Shx(0.5)(24)=(10.501)(24)=(2+0.544)=(44)Sh_x(0.5) \cdot \begin{pmatrix} 2 \\ 4 \end{pmatrix} = \begin{pmatrix} 1 & 0.5 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} 2 \\ 4 \end{pmatrix} = \begin{pmatrix} 2 + 0.5 \cdot 4 \\ 4 \end{pmatrix} = \begin{pmatrix} 4 \\ 4 \end{pmatrix}

Composición de transformaciones

Lo poderoso de las matrices es que podemos combinar transformaciones multiplicándolas:

Ttotal=TnTn1T2T1T_{total} = T_n \cdot T_{n-1} \cdot \ldots \cdot T_2 \cdot T_1

Orden de aplicación

Las transformaciones se aplican de derecha a izquierda. Si queremos primero rotar y luego escalar:

T=SRT = S \cdot R

Se lee: "aplica RR primero, luego SS".

Ejemplo: Rotar 45° y luego escalar 2x:

T=S(2,2)R(45°)=(2002)(22222222)=(2222)T = S(2,2) \cdot R(45°) = \begin{pmatrix} 2 & 0 \\ 0 & 2 \end{pmatrix} \begin{pmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{pmatrix} = \begin{pmatrix} \sqrt{2} & -\sqrt{2} \\ \sqrt{2} & \sqrt{2} \end{pmatrix}

Implementación en Java utilizando Minerva

Transformer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.minerva;
import com.minerva.core.primitives.Matrix;
import com.minerva.core.primitives.Vector;
/**
* Biblioteca de transformaciones geométricas 2D.
*/
public class Transformer {
/**
* Crea una matriz de rotación.
* @param angleDegrees Ángulo en grados (antihorario)
*/
public static Matrix rotation(double angleDegrees) {
double rad = Math.toRadians(angleDegrees);
return new Matrix(new double[][]{
{Math.cos(rad), -Math.sin(rad)},
{Math.sin(rad), Math.cos(rad)}
});
}
/**
* Crea una matriz de escalado.
* @param sx Factor de escala en X
* @param sy Factor de escala en Y
*/
public static Matrix scale(double sx, double sy) {
return new Matrix(new double[][]{
{sx, 0},
{0, sy}
});
}
/**
* Crea una matriz de reflexión respecto al eje X.
*/
public static Matrix reflectX() {
return new Matrix(new double[][]{
{1, 0},
{0, -1}
});
}
/**
* Crea una matriz de reflexión respecto al eje Y.
*/
public static Matrix reflectY() {
return new Matrix(new double[][]{
{-1, 0},
{0, 1}
});
}
/**
* Crea una matriz de cizallamiento horizontal.
* @param k Factor de cizallamiento
*/
public static Matrix shearX(double k) {
return new Matrix(new double[][]{
{1, k},
{0, 1}
});
}
/**
* Aplica una transformación a un vector.
*/
public static Vector apply(Matrix transform, Vector v) {
return transform.multiply(v);
}
}
java Main
Vector original: [1.0, 0.0]
Rotado 90°: [0.0, 1.0]
Escalado 2x: [2.0, 0.0]
Rotar 45° + Escalar 2x: [1.41, 1.41]
Reflexión de (3,4) en eje X: [3.0, -4.0]

Matrices especiales

Hay algunas matrices con propiedades únicas que aparecen constantemente en matemáticas y aplicaciones.

Matriz identidad

La matriz identidad II es como el "1" de las matrices: no cambia nada cuando multiplicas.

IA=AI=AI \cdot A = A \cdot I = A

Es una matriz cuadrada con 1s en la diagonal y 0s en el resto:

I3=(100010001)I_3 = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}

Geométricamente, la matriz identidad es la transformación "no hacer nada".

Example.java
1
2
3
4
Matrix I = Matrix.identity(3);
Matrix A = new Matrix(new double[][]{{1,2,3},{4,5,6},{7,8,9}});
Matrix result = I.multiply(A);
// result es igual a A

Matriz inversa

La inversa de AA (denotada A1A^{-1}) es la matriz que "deshace" lo que AA hace:

AA1=A1A=IA \cdot A^{-1} = A^{-1} \cdot A = I

Es como la división para matrices. Si AA rota 30°, entonces A1A^{-1} rota -30°.

No todas las matrices tienen inversa

Solo las matrices cuadradas pueden tener inversa, y no todas la tienen. Una matriz sin inversa se llama singular o no invertible. Esto ocurre cuando la matriz "colapsa" el espacio (por ejemplo, proyecta 3D a una línea).

Para una matriz 2×22 \times 2:

A=(abcd),A1=1adbc(dbca)A = \begin{pmatrix} a & b \\ c & d \end{pmatrix}, \quad A^{-1} = \frac{1}{ad - bc} \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}

El valor adbcad - bc se llama determinante, y si es cero, la matriz no tiene inversa.

Nota computacional

La fórmula anterior es útil para entender el concepto, pero no es como se calcula en la práctica. Para matrices grandes, calcular el determinante con la fórmula de Leibniz o por cofactores tiene complejidad O(n!)O(n!), lo cual es prohibitivo.

En implementaciones reales (incluyendo Minerva), se utilizan métodos como la descomposición LU, que tienen complejidad O(n3)O(n^3) y son numéricamente más estables.

Example.java
1
2
3
4
Matrix A = new Matrix(new double[][]{{4, 7}, {2, 6}});
Matrix Ainv = A.inv();
Matrix identity = A.multiply(Ainv);
// identity es aproximadamente I

Matriz diagonal

Una matriz donde solo la diagonal tiene valores distintos de cero:

D=(d1000d2000d3)D = \begin{pmatrix} d_1 & 0 & 0 \\ 0 & d_2 & 0 \\ 0 & 0 & d_3 \end{pmatrix}

Las matrices diagonales son muy eficientes: multiplicar por ellas solo escala cada componente del vector.

Matriz simétrica

Una matriz es simétrica si A=ATA = A^T (es igual a su transpuesta):

A=(123245356)A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 5 \\ 3 & 5 & 6 \end{pmatrix}

Las matrices simétricas aparecen naturalmente en problemas de optimización y tienen propiedades especiales (todos sus autovalores son reales).


Ejemplo práctico: Sistemas de ecuaciones lineales

Una de las aplicaciones más importantes de las matrices es resolver sistemas de ecuaciones lineales.

El problema

Considera este sistema:

{2x+3y=84x+y=6\begin{cases} 2x + 3y = 8 \\ 4x + y = 6 \end{cases}

Podemos escribirlo en forma matricial:

(2341)A(xy)x=(86)b\underbrace{\begin{pmatrix} 2 & 3 \\ 4 & 1 \end{pmatrix}}_{A} \underbrace{\begin{pmatrix} x \\ y \end{pmatrix}}_{\vec{x}} = \underbrace{\begin{pmatrix} 8 \\ 6 \end{pmatrix}}_{\vec{b}}

O sea: Ax=bA\vec{x} = \vec{b}

La solución

Si AA tiene inversa, la solución es:

x=A1b\vec{x} = A^{-1} \vec{b}
LinearSystem.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.minerva;
import com.minerva.core.primitives.Matrix;
import com.minerva.core.primitives.Vector;
public class LinearSystem {
public static void main(String[] args) {
// Sistema:
// 2x + 3y = 8
// 4x + y = 6
Matrix A = new Matrix(new double[][]{
{2, 3},
{4, 1}
});
Vector b = new Vector(new double[]{8, 6});
System.out.println("Sistema Ax = b");
System.out.println("A =");
System.out.println(A);
System.out.println("b = " + b);
// Resolver: x = A^(-1) * b
// Forma recomendada: usar solve() directamente
Vector solution = A.solve(b);
System.out.println("
Solución:");
System.out.printf("x = %.2f%n", solution.get(0));
System.out.printf("y = %.2f%n", solution.get(1));
// Verificar
System.out.println("
Verificación:");
System.out.printf("2(%.0f) + 3(%.0f) = %.0f (esperado: 8)%n",
solution.get(0), solution.get(1),
2*solution.get(0) + 3*solution.get(1));
System.out.printf("4(%.0f) + 1(%.0f) = %.0f (esperado: 6)%n",
solution.get(0), solution.get(1),
4*solution.get(0) + solution.get(1));
}
}
java LinearSystem
Sistema Ax = b
A =
[2, 3]
[4, 1]
b = [8, 6]
Solución:
x = 1.00
y = 2.00
Verificación:
2(1) + 3(2) = 8 (esperado: 8)
4(1) + 1(2) = 6 (esperado: 6)

Problema aplicado: Optimización de producción

Los sistemas de ecuaciones lineales aparecen naturalmente en problemas de optimización. Veamos un problema clásico estilo los libros de álgebra lineal de Grossman.

El problema

Una fábrica produce dos tipos de productos: mesas y sillas. Cada producto requiere tiempo en dos máquinas:

ProductoMáquina A (horas)Máquina B (horas)Ganancia ($)
Mesa2140
Silla1230
Disponible100 horas80 horas

Pregunta: ¿Cuántas mesas (xx) y sillas (yy) debe producir para maximizar la ganancia?

Formulación matemática

Función objetivo (lo que queremos maximizar):

Z=40x+30yZ = 40x + 30y

Restricciones (lo que debemos cumplir):

{2x+y100(Maˊquina A)x+2y80(Maˊquina B)x0,y0(No negatividad)\begin{cases} 2x + y \leq 100 & \text{(Máquina A)} \\ x + 2y \leq 80 & \text{(Máquina B)} \\ x \geq 0, \, y \geq 0 & \text{(No negatividad)} \end{cases}

Representación matricial

Las restricciones se pueden escribir como AxbA\vec{x} \leq \vec{b}:

(2112)(xy)(10080)\begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \leq \begin{pmatrix} 100 \\ 80 \end{pmatrix}

Solución: Encontrar los vértices

En programación lineal, el óptimo siempre está en un vértice de la región factible. Los vértices se encuentran resolviendo sistemas de ecuaciones.

Vértice 1: Intersección de 2x+y=1002x + y = 100 y x+2y=80x + 2y = 80

(2112)(xy)=(10080)\begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 100 \\ 80 \end{pmatrix}

Usando la inversa:

(xy)=13(2112)(10080)=13(12060)=(4020)\begin{pmatrix} x \\ y \end{pmatrix} = \frac{1}{3} \begin{pmatrix} 2 & -1 \\ -1 & 2 \end{pmatrix} \begin{pmatrix} 100 \\ 80 \end{pmatrix} = \frac{1}{3} \begin{pmatrix} 120 \\ 60 \end{pmatrix} = \begin{pmatrix} 40 \\ 20 \end{pmatrix}

Otros vértices de la región factible:

  • (0,0)(0, 0): origen
  • (50,0)(50, 0): solo mesas, máquina A al límite
  • (0,40)(0, 40): solo sillas, máquina B al límite
  • (40,20)(40, 20): la intersección que calculamos

Evaluando la función objetivo en cada vértice:

VérticeZ=40x+30yZ = 40x + 30y
(0,0)(0, 0)00
(50,0)(50, 0)20002000
(0,40)(0, 40)12001200
(40,20)(40, 20)2200\mathbf{2200}

Solución óptima: Producir 40 mesas y 20 sillas para una ganancia máxima de $2,200.

ProductionOptimizer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.minerva;
import com.minerva.core.primitives.Matrix;
import com.minerva.core.primitives.Vector;
/**
* Resuelve el problema de optimización de producción
* encontrando la intersección de las restricciones.
*/
public class ProductionOptimizer {
public static void main(String[] args) {
// Matriz de restricciones (cuando son igualdades)
// 2x + y = 100 (Máquina A al límite)
// x + 2y = 80 (Máquina B al límite)
Matrix A = new Matrix(new double[][]{
{2, 1},
{1, 2}
});
Vector b = new Vector(new double[]{100, 80});
System.out.println("=== Problema de Optimización ===");
System.out.println("Maximizar: Z = 40x + 30y");
System.out.println("Sujeto a: 2x + y ≤ 100");
System.out.println(" x + 2y ≤ 80");
System.out.println();
// Encontrar punto de intersección
Vector intersection = A.solve(b);
double x = intersection.get(0);
double y = intersection.get(1);
System.out.println("Intersección de restricciones:");
System.out.printf("x = %.0f mesas%n", x);
System.out.printf("y = %.0f sillas%n", y);
// Evaluar función objetivo en todos los vértices
double[][] vertices = {{0, 0}, {50, 0}, {0, 40}, {x, y}};
String[] names = {"(0,0)", "(50,0)", "(0,40)",
String.format("(%.0f,%.0f)", x, y)};
System.out.println("\nEvaluación de vértices:");
double maxZ = Double.NEGATIVE_INFINITY;
String bestVertex = "";
for (int i = 0; i < vertices.length; i++) {
double xi = vertices[i][0];
double yi = vertices[i][1];
double Z = 40 * xi + 30 * yi;
System.out.printf("%s: Z = $%.0f%n", names[i], Z);
if (Z > maxZ) {
maxZ = Z;
bestVertex = names[i];
}
}
System.out.printf("\n>>> Solución óptima: %s con ganancia $%.0f%n",
bestVertex, maxZ);
}
}
java ProductionOptimizer
=== Problema de Optimización ===
Maximizar: Z = 40x + 30y
Sujeto a: 2x + y ≤ 100
x + 2y ≤ 80
Intersección de restricciones:
x = 40 mesas
y = 20 sillas
Evaluación de vértices:
(0,0): Z = 0
(50,0): Z = 2000
(0,40): Z = 1200
(40,20): Z = 2200
Solución óptima: (40,20) con ganancia 2200

Conexión con álgebra lineal

En este problema, las matrices nos permiten:

  1. Representar restricciones de forma compacta: AxbA\vec{x} \leq \vec{b}
  2. Encontrar intersecciones resolviendo Ax=bA\vec{x} = \vec{b} con la inversa
  3. Escalar a problemas grandes: con nn variables y mm restricciones, las técnicas matriciales son esenciales

Aplicaciones de los sistemas lineales

AplicaciónDescripción
Regresión linealEncontrar la mejor línea/plano que ajusta datos
Balanceo de ecuaciones químicasEncontrar coeficientes estequiométricos
Análisis de circuitosLey de Kirchhoff produce sistemas lineales
EconomíaModelos de entrada-salida de Leontief
Gráficos 3DTransformaciones y proyecciones de cámara

Bonus: Definición formal de matriz

Advertencia

Esta sección es para lectores con interés en matemáticas puras. Puedes saltarla sin perder continuidad.

Matrices como funciones lineales

Formalmente, una matriz ARm×nA \in \mathbb{R}^{m \times n} representa una transformación lineal T:RnRmT: \mathbb{R}^n \to \mathbb{R}^m.

Una transformación es lineal si cumple:

  1. Aditividad: T(u+v)=T(u)+T(v)T(\vec{u} + \vec{v}) = T(\vec{u}) + T(\vec{v})
  2. Homogeneidad: T(cv)=cT(v)T(c\vec{v}) = cT(\vec{v})

Toda matriz define una transformación lineal, y toda transformación lineal puede representarse con una matriz (una vez elegida una base).

Espacio de matrices

El conjunto de todas las matrices de m×nm \times n con entradas reales, denotado Mm×n(R)\mathbb{M}_{m \times n}(\mathbb{R}), forma un espacio vectorial (como mencionamos en la documentación sobre vectores, donde vimos que las matrices también pueden ser "vectores" en un sentido abstracto).

  • Dimensión: m×nm \times n (una matriz 3×43 \times 4 tiene 12 "componentes")
  • Suma: elemento a elemento
  • Escalar: multiplicar cada elemento

Propiedades algebraicas

Para matrices A,B,CA, B, C y escalares α,β\alpha, \beta:

PropiedadExpresión
Asociatividad de suma(A+B)+C=A+(B+C)(A + B) + C = A + (B + C)
Conmutatividad de sumaA+B=B+AA + B = B + A
Elemento neutroA+0=AA + 0 = A
Asociatividad de producto(AB)C=A(BC)(AB)C = A(BC)
Distributividad izquierdaA(B+C)=AB+ACA(B + C) = AB + AC
Distributividad derecha(A+B)C=AC+BC(A + B)C = AC + BC
Compatibilidad escalarα(AB)=(αA)B=A(αB)\alpha(AB) = (\alpha A)B = A(\alpha B)

Nota importante: el producto no es conmutativo (ABBAAB \neq BA en general).

El rango de una matriz

El rango de una matriz es el número de filas (o columnas) linealmente independientes. Indica cuánta "información" contiene la matriz.

  • Si rango(A)=min(m,n)\text{rango}(A) = \min(m, n): la matriz tiene rango completo
  • Si rango(A)<min(m,n)\text{rango}(A) < \min(m, n): la matriz es deficiente en rango

El rango determina si un sistema de ecuaciones tiene solución única, infinitas soluciones, o ninguna solución.


Resumen

ConceptoDescripciónNotación
MatrizArreglo rectangular de númerosARm×nA \in \mathbb{R}^{m \times n}
SumaElemento a elemento (mismas dimensiones)A+BA + B
Producto escalarMultiplicar cada elementoαA\alpha A
TranspuestaIntercambiar filas y columnasATA^T
MultiplicaciónFilas × columnas (producto punto)ABAB
IdentidadNo cambia al multiplicarII
InversaDeshace la transformaciónA1A^{-1}

Las matrices son el lenguaje fundamental para describir transformaciones lineales, resolver sistemas de ecuaciones y estructurar datos multidimensionales.