39. Vectores propios (autovectores)

Un vector propio señala una dirección que una transformación conserva. Puede cambiar su longitud o sentido, pero el resultado permanece sobre la misma recta.

39.1 Introducción

Los valores propios indican factores de escala, pero necesitan direcciones asociadas para describir el comportamiento de una transformación.

Esas direcciones están representadas por los vectores propios o autovectores. Juntos, valores y vectores propios permiten encontrar coordenadas especialmente simples para una matriz.

Valor propio: cuánto escala.
Vector propio: qué dirección conserva.

39.2 Definición

Sea A una matriz cuadrada. Un vector no nulo v es vector propio de A asociado al valor propio λ si:

Av = λv,   v ≠ 0

El resultado Av puede apuntar en el mismo sentido, en el opuesto o ser cero cuando λ = 0, pero siempre permanece en la recta generada por v.

const A = [[2, 1], [1, 2]];
const v = [1, 1];
const lambda = 3;
const Av = A.map(fila => fila.reduce((suma, valor, i) => suma + valor * v[i], 0));

console.log(Av);                         // [3, 3]
console.log(v.map(valor => lambda * valor)); // [3, 3]

39.3 Múltiplos de un vector propio

Si v es vector propio asociado a λ, cualquier múltiplo no nulo cv también lo es:

A(cv) = cAv = cλv = λ(cv)

Por eso los vectores propios aparecen en direcciones completas, no como flechas aisladas.

const A = [[2, 1], [1, 2]];
const vectores = [[1, 1], [2, 2], [-3, -3]];

for (const v of vectores) {
  const Av = A.map(fila => fila.reduce((s, valor, i) => s + valor * v[i], 0));
  console.log(v, Av); // cada resultado es 3v
}

39.4 Procedimiento para calcular vectores propios

Una vez conocido un valor propio λ:

  1. Formar A − λI.
  2. Resolver el sistema homogéneo (A − λI)v = 0.
  3. Describir las soluciones mediante parámetros.
  4. Excluir el vector cero para obtener vectores propios.
Los vectores propios asociados a λ son las soluciones no nulas del núcleo de A − λI.

39.5 Ejemplo para λ = 3

Para A = [[2, 1], [1, 2]] y λ = 3:

A − 3I = [[−1, 1], [1, −1]]
−x + y = 0 ⇒ y = x
v = t(1, 1)

Todo múltiplo no nulo de (1, 1) es vector propio asociado a 3.

const lambda = 3;
const A = [[2, 1], [1, 2]];
const AmenosLambdaI = A.map((fila, i) =>
  fila.map((valor, j) => valor - Number(i === j) * lambda)
);

console.log(AmenosLambdaI); // [[-1, 1], [1, -1]]

39.6 Ejemplo para λ = 1

Para la misma matriz y λ = 1:

A − I = [[1, 1], [1, 1]]
x + y = 0 ⇒ y = −x
v = t(1, −1)

Así, (1, −1) determina la segunda dirección propia.

const A = [[2, 1], [1, 2]];
const v = [1, -1];
const Av = A.map(fila => fila.reduce((s, valor, i) => s + valor * v[i], 0));

console.log(Av); // [1, -1] = 1v

39.7 Verificar un vector propio

Para comprobar un candidato se calcula Av y λv y se comparan con una tolerancia. También debe verificarse que v no sea cero.

function esVectorPropio(A, v, lambda, tolerancia = 1e-10) {
  if (Math.hypot(...v) <= tolerancia) return false;
  const Av = A.map(fila => fila.reduce((suma, valor, i) => suma + valor * v[i], 0));
  return Av.every((valor, i) => Math.abs(valor - lambda * v[i]) <= tolerancia);
}

const A = [[2, 1], [1, 2]];
console.log(esVectorPropio(A, [1, 1], 3));  // true
console.log(esVectorPropio(A, [1, 0], 2));  // false
console.log(esVectorPropio(A, [0, 0], 99)); // false

39.8 Espacio propio

El espacio propio asociado a λ es:

Eλ = ker(A − λI)

A diferencia del conjunto de vectores propios, Eλ sí incluye al vector cero para ser un subespacio. Los vectores propios son precisamente sus elementos no nulos.

Para A = [[2, 1], [1, 2]]:
E3 = gen{(1, 1)},   E1 = gen{(1, −1)}

39.9 Multiplicidad geométrica

La dimensión del espacio propio Eλ se denomina multiplicidad geométrica de λ.

multiplicidad geométrica = dim(ker(A − λI))

Siempre se cumple:

1 ≤ multiplicidad geométrica ≤ multiplicidad algebraica

La diferencia entre ambas multiplicidades determina si hay suficientes vectores propios para diagonalizar.

39.10 Valores propios repetidos

Dos matrices pueden tener el mismo valor propio repetido y distinta cantidad de direcciones propias.

MatrizValor propioEspacio propio
[[2, 0], [0, 2]]2, multiplicidad 2Todo ℝ2, dimensión 2
[[2, 1], [0, 2]]2, multiplicidad 2gen{(1, 0)}, dimensión 1
const identidadEscalada = [[2, 0], [0, 2]];
const bloqueJordan = [[2, 1], [0, 2]];
const aplicar = (A, v) => A.map(fila =>
  fila.reduce((suma, valor, i) => suma + valor * v[i], 0)
);

console.log(aplicar(identidadEscalada, [1, 1])); // [2, 2]
console.log(aplicar(bloqueJordan, [1, 1]));      // [3, 2], no es 2[1,1]

39.11 Valores propios distintos e independencia

Los vectores propios asociados a valores propios distintos son linealmente independientes.

Por tanto, una matriz n × n con n valores propios distintos posee n vectores propios independientes y puede diagonalizarse.

const v1 = [1, 1];  // asociado a lambda = 3
const v2 = [1, -1]; // asociado a lambda = 1
const determinante = v1[0] * v2[1] - v2[0] * v1[1];

console.log(determinante); // -2, son independientes

39.12 Normalización y signo

Los vectores propios suelen normalizarse para trabajar con longitud uno. La normalización no cambia el valor propio asociado.

Tanto v como −v representan la misma dirección propia, por lo que un algoritmo puede devolver cualquiera de los dos signos.

function normalizar(v) {
  const longitud = Math.hypot(...v);
  return longitud === 0 ? null : v.map(valor => valor / longitud);
}

console.log(normalizar([1, 1]));
console.log(normalizar([-1, -1]));
// Ambos representan la misma dirección propia.

39.13 Valor propio cero y núcleo

Los vectores propios asociados a λ = 0 son los vectores no nulos del núcleo de A:

Av = 0v = 0
const A = [[1, 2], [2, 4]];
const v = [-2, 1];
const Av = A.map(fila => fila.reduce((s, valor, i) => s + valor * v[i], 0));

console.log(Av); // [0, 0]
// v es vector propio asociado a lambda = 0.

Estas direcciones son las que la transformación colapsa completamente.

39.14 Matrices simétricas

Las matrices reales simétricas poseen propiedades especialmente favorables:

  • Todos sus valores propios son reales.
  • Los vectores propios de valores distintos son ortogonales.
  • Existe una base ortonormal de vectores propios.
const v1 = [1, 1];
const v2 = [1, -1];
const producto = v1.reduce((suma, valor, i) => suma + valor * v2[i], 0);

console.log(producto); // 0: direcciones propias ortogonales

39.15 Calcular un vector propio 2 × 2

Dado un valor propio real, una fila no nula (p, q) de A − λI es perpendicular a cualquier solución. Por eso (−q, p) ofrece una dirección del núcleo.

function vectorPropio2x2(A, lambda, tolerancia = 1e-10) {
  const filas = [
    [A[0][0] - lambda, A[0][1]],
    [A[1][0], A[1][1] - lambda]
  ];
  const normas = filas.map(fila => Math.hypot(...fila));
  const indice = normas[1] > normas[0] ? 1 : 0;

  if (normas[indice] <= tolerancia) return [1, 0];
  const [p, q] = filas[indice];
  const candidato = [-q, p];
  const longitud = Math.hypot(...candidato);
  return candidato.map(valor => valor / longitud);
}

const A = [[2, 1], [1, 2]];
console.log(vectorPropio2x2(A, 3));
console.log(vectorPropio2x2(A, 1));

Si A − λI es la matriz cero, todo vector no nulo es propio y la función devuelve una dirección representativa.

39.16 Método de la potencia

El método de la potencia aproxima un vector propio dominante aplicando A repetidamente y normalizando. Funciona bajo condiciones adecuadas, especialmente cuando un valor propio domina en magnitud.

function potencia(A, inicial, iteraciones = 20) {
  let v = [...inicial];
  for (let paso = 0; paso < iteraciones; paso++) {
    const Av = A.map(fila => fila.reduce((s, valor, i) => s + valor * v[i], 0));
    const norma = Math.hypot(...Av);
    if (norma === 0) return null;
    v = Av.map(valor => valor / norma);
  }
  const Av = A.map(fila => fila.reduce((s, valor, i) => s + valor * v[i], 0));
  const lambda = v.reduce((s, valor, i) => s + valor * Av[i], 0);
  return { vector: v, valor: lambda };
}

console.log(potencia([[2, 1], [1, 2]], [1, 0]));
// vector cercano a [0.707, 0.707] y valor cercano a 3

39.17 Estados estacionarios

En procesos de transición, un estado estacionario satisface Av = v. Es un vector propio asociado a λ = 1.

const transicion = [[0.9, 0.2], [0.1, 0.8]];
let estado = [1, 0];

for (let paso = 0; paso < 50; paso++) {
  estado = transicion.map(fila =>
    fila.reduce((suma, valor, i) => suma + valor * estado[i], 0)
  );
}

console.log(estado); // aproximadamente [2/3, 1/3]

Esta idea aparece en cadenas de Markov, rankings y modelos dinámicos.

39.18 Aplicaciones, precisión y errores frecuentes

Los vectores propios se utilizan en análisis de componentes principales, vibraciones, estabilidad, sistemas dinámicos, gráficos, compresión y clasificación de datos.

En matrices reales con valores propios complejos, los vectores propios asociados también pueden requerir componentes complejas.

Errores habituales:

  • Aceptar el vector cero como vector propio.
  • Resolver Av = 0 en lugar de (A − λI)v = 0 para λ no nulo.
  • Buscar una única flecha cuando existe todo un subespacio propio.
  • Confundir multiplicidad algebraica y geométrica.
  • Suponer que un valor repetido siempre aporta suficientes direcciones.
  • Comparar Av y λv sin tolerancia.
  • Interpretar vectores opuestos como soluciones diferentes.

39.19 Qué debes recordar de este tema

  • v es vector propio si v ≠ 0 y Av = λv.
  • Los múltiplos no nulos de un vector propio siguen siendo propios.
  • Los vectores propios asociados a λ se obtienen resolviendo (A − λI)v = 0.
  • El espacio propio es ker(A − λI) e incluye el vector cero.
  • Su dimensión es la multiplicidad geométrica.
  • Vectores propios de valores distintos son independientes.
  • En matrices simétricas pueden elegirse vectores propios ortonormales.
  • El método de la potencia aproxima una dirección propia dominante bajo condiciones apropiadas.

39.20 Conclusión

Los vectores propios muestran las direcciones intrínsecas de una transformación. Al resolver el núcleo de A − λI obtenemos espacios completos de direcciones que se escalan de forma simple.

En el próximo tema utilizaremos suficientes vectores propios independientes para diagonalizar matrices.