WhatsApp

  

Algoritmo de Valores Propios y Vectores Propios: Conceptos, Implementación y Ejemplos en Python

Guía completa sobre valores propios y vectores propios, su importancia en álgebra lineal y cómo calcularlos en Python usando NumPy, SciPy y algoritmos clásicos.

Valores Propios y Vectores Propios: Algoritmo y Ejemplos en Python

Entiende la teoría, descubre los algoritmos más usados y aprende a implementarlos con código listo para producción.

1. Conceptos Básicos

Para una matriz cuadrada A \in \mathbb{R}^{n\times n}, un valor propio λ y su vector propio v cumplen:

A·v = λ·v

Estos conceptos son la columna vertebral de técnicas como PCA, estabilidad de sistemas dinámicos y métodos numéricos.

2. Algoritmos Clásicos

Power Iteration

  • Ideal para obtener el valor propio dominante (de mayor magnitud).
  • Iterativo: v_{k+1}=A·v_k / \|A·v_k\|.
  • Convergencia lineal, sensible a valores propios cercanos en magnitud.
  • Uso típico en PageRank y métodos de clustering.

Algoritmo QR

  • Descompone A = Q·R (Q ortogonal, R triangular superior).
  • Repite A_{k+1}=R_k·Q_k hasta que A_k sea casi triangular.
  • Obtiene todos los valores propios simultáneamente.
  • Convergencia cuadrática con shift y versiones Hessenberg.

En la práctica, la mayoría de los desarrolladores usan numpy.linalg.eig o scipy.linalg.eig, que implementan versiones optimizadas del algoritmo QR con técnicas de reducción a Hessenberg.

3. Implementación en Python

3.1. Usando NumPy (una línea)

import numpy as np
A = np.array([[4, 2], [1, 3]])
values, vectors = np.linalg.eig(A)
print('Valores propios:', values)
print('Vectores propios:\n', vectors)

3.2. Power Iteration paso a paso

import numpy as np
def power_iteration(A, num_iters=1000, tol=1e-10):
    n, _ = A.shape
    b_k = np.random.rand(n)
    b_k = b_k / np.linalg.norm(b_k)
    for _ in range(num_iters):
        b_k1 = A @ b_k
        b_k1_norm = np.linalg.norm(b_k1)
        b_k_next = b_k1 / b_k1_norm
        if np.linalg.norm(b_k_next - b_k) < tol:
            break
        b_k = b_k_next
    eigenvalue = b_k.T @ A @ b_k
    return eigenvalue, b_k
A = np.array([[2, 1], [1, 2]])
λ, v = power_iteration(A)
print('Valor propio dominante:', λ)
print('Vector propio asociado:', v)

3.3. Algoritmo QR con SciPy

import numpy as np
from scipy.linalg import eig
A = np.array([[6, 2, 1], [2, 3, 1], [1, 1, 1]])
values, vectors = eig(A)
print('Valores propios (complejos):', values)
print('Vectores propios (columnas):')
print(vectors)

4. Comparativa de Métodos

Ventajas

  • NumPy / SciPy: Muy rápido (BLAS/LAPACK), manejo automático de matrices complejas.
  • Power Iteration: Memoria mínima, ideal para matrices extremadamente grandes y dispersas.
  • QR: Obtiene todo el espectro, robusto frente a valores propios cercanos.

Desventajas

  • NumPy / SciPy: Requiere que la matriz quepa en RAM.
  • Power Iteration: Sólo el valor dominante, converge lentamente si el gap espectral es pequeño.
  • QR: Costoso O(n³) y necesita transformación a Hessenberg para matrices grandes.

5. Buenas Prácticas y Optimización

  • Pre‑escalado: Normaliza la matriz (por ejemplo, divide por su norma) para evitar desbordamientos numéricos.
  • Uso de tipos float64: Garantiza precisión suficiente para la mayoría de los problemas de ingeniería.
  • Matrices dispersas: Emplea scipy.sparse.linalg.eigs o eigsh (solo valores reales) que implementan Lanczos/Arnoldi.
  • Selección de shift en QR: Mejora la convergencia, especialmente para valores propios interiores.
  • Verificación de ortogonalidad: Después de obtener los vectores, comprueba V.T @ V ≈ I.

6. Solución de Problemas Comunes

6.1. Valores propios complejos inesperados

Si tu matriz es real pero obtienes valores complejos, verifica que no sea simétrica indefinida o que la precisión numérica no esté introduciendo pequeñas componentes imaginarias. Usa np.real_if_close para limpiar.

6.2. Convergencia lenta en Power Iteration

Reduce el ratio |λ₂/λ₁| aplicando un shift (A - μI) o emplea inverse iteration para valores internos.

6.3. Memoria insuficiente al usar numpy.linalg.eig

Para matrices > 10 000×10 000, migra a scipy.sparse.linalg.eigs o a paquetes como ARPACK integrados en SciPy.

7. Casos de Uso del Mundo Real

  • Análisis de Componentes Principales (PCA): Descomposición espectral de la matriz de covarianza para reducción dimensional.
  • Stability analysis en control: Los polos del sistema son los valores propios del matrix A en dx/dt = A·x.
  • Recomendadores (PageRank): El vector propio dominante del grafo de enlaces representa la autoridad de cada página.
  • Modelado de vibraciones mecánicas: Frecuencias naturales obtenidas de los valores propios del sistema masa‑resorte.

© 2025 BlogTech – Todos los derechos reservados.



Algoritmo de Valores Propios y Vectores Propios: Conceptos, Implementación y Ejemplos en Python
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 13 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Algoritmo de Subespacios y Rangos: Fundamentos, Implementación en Python y Buenas Prácticas
Aprende en detalle el algoritmo de subespacios y rangos, su base teórica, ejemplos prácticos en Python, comparativas con otras técnicas y recomendaciones de optimización y troubleshooting.