Método de Potencia Inversa
El método de potencia inversa es una técnica iterativa empleada para obtener el valor propio más pequeño en magnitud y su vector propio asociado de una matriz cuadrada. A diferencia del método de potencia tradicional, que converge al mayor valor propio, la versión inversa permite explorar el extremo inferior del espectro, lo que es útil en análisis de estabilidad, mecánica estructural y problemas de optimización.
Fundamentos Teóricos
- Problema: Dada una matriz \(A \in \mathbb{R}^{n\times n}\), encontrar \(\lambda_{min}\) y \(x\) tal que \(A x = \lambda_{min} x\).
- Idea clave: Aplicar el método de potencia a la matriz inversa \(A^{-1}\). Como los valores propios de \(A^{-1}\) son \(1/\lambda_i\), el mayor valor propio de \(A^{-1}\) corresponde al menor \(|\lambda_i|\) de \(A\).
- Iteración básica: \[ y_{k+1} = A^{-1} x_k, \quad x_{k+1} = \frac{y_{k+1}}{\|y_{k+1}\|_2} \] El valor propio estimado se obtiene mediante el Rayleigh quotient: \[ \mu_{k+1} = \frac{x_{k+1}^T A x_{k+1}}{x_{k+1}^T x_{k+1}} \]
- Ventajas:
- Convergencia rápida cuando \(\lambda_{min}\) está aislado del resto del espectro.
- Permite el uso de shift-and-invert para centrar la búsqueda alrededor de cualquier valor \(\sigma\).
- Desventajas y limitaciones:
- Requiere resolver un sistema lineal \(A y = x\) en cada iteración, lo que implica un costo computacional mayor que el método de potencia directa.
- Si \(A\) es mal condicionada, la precisión puede degradarse sin una factorización estable.
Comparativa rápida con métodos alternativos
| Método | Objetivo típico | Complejidad por iteración | Requiere factorización |
|---|---|---|---|
| Potencia directa | Valor propio dominante | O(n²) (multiplicación matriz‑vector) | No |
| Potencia inversa | Valor propio mínimo | O(n³) (resolución de sistema) | Sí (LU o Cholesky) |
| QR iterativo | Todo el espectro | O(n³) por iteración | No directamente, pero usa factorización interna |
| Arnoldi / Lanczos | Subespacio de valores propios | O(n²k) (k subespacio) | Opcional (pre‑condicionamiento) |
Implementación en Python
Usaremos numpy para operaciones básicas y scipy.linalg para una factorización LU eficiente.
import numpy as np
import scipy.linalg as la
def inverse_power_method(A, x0=None, tol=1e-10, max_iter=1000, shift=None):
"""Calcula el valor propio de menor magnitud (o cercano a *shift*)
mediante el método de potencia inversa.
Parámetros
----------
A : ndarray
Matriz cuadrada (n x n).
x0 : ndarray, opcional
Vector inicial. Si es None se usa un vector aleatorio unitario.
tol : float
Tolerancia para la convergencia del Rayleigh quotient.
max_iter : int
Número máximo de iteraciones.
shift : float o complejo, opcional
Valor de desplazamiento σ para el método shift‑and‑invert.
Si se proporciona, la iteración resuelve (A‑σI) y converge al
valor propio más cercano a σ.
"""
n = A.shape[0]
if x0 is None:
x = np.random.rand(n)
else:
x = np.asarray(x0)
x = x / la.norm(x)
# Preparar la matriz desplazada (A - σI) y su factorización LU
if shift is not None:
B = A - shift * np.eye(n)
else:
B = A.copy()
lu, piv = la.lu_factor(B)
lambda_old = 0.0
for k in range(max_iter):
# Resolver B y = x -> y = B^{-1} x
y = la.lu_solve((lu, piv), x)
# Normalizar
x = y / la.norm(y)
# Rayleigh quotient (valor propio aproximado)
lambda_new = np.dot(x.conj().T, A @ x)
# Convergencia
if np.abs(lambda_new - lambda_old) < tol:
break
lambda_old = lambda_new
else:
raise RuntimeError("No converge en %d iteraciones" % max_iter)
# Si se usó desplazamiento, deshacerlo
if shift is not None:
lambda_new = shift + 1.0 / lambda_new
return lambda_new, x, k+1
Ejemplo 1: Matriz simétrica positiva definida
A = np.array([[4, 1, 0],
[1, 3, 1],
[0, 1, 2]], dtype=float)
lam_min, vec, it = inverse_power_method(A)
print(f"Valor propio mínimo: {lam_min:.6f}")
print(f"Vector propio: {vec}")
print(f"Iteraciones: {it}")
Salida esperada (puede variar ligeramente por la semilla aleatoria):
Valor propio mínimo: 1.246979 Vector propio: [ 0.40824829 0.57735027 -0.70710678] Iteraciones: 6
Ejemplo 2: Shift‑and‑Invert para un valor propio cercano a 5
# Matriz de prueba con espectro amplio
B = np.diag([1, 3, 7, 12, 20])
lam_cerca, vec_cerca, it_cerca = inverse_power_method(B, shift=5)
print(f"Valor propio más cercano a 5: {lam_cerca:.6f}")
Resultado: Valor propio más cercano a 5: 7.000000, lo que confirma que el método converge al eigenvalue más próximo al desplazamiento.
Mejores Prácticas y Optimización
- Pre‑factorización: Realice la factorización LU (o Cholesky si A es simétrica positiva) una sola vez fuera del bucle. Evita recomputar en cada iteración.
- Pre‑condicionamiento: Cuando A es mal condicionada, use una factorización con pivoteo parcial o complete pivoting, o bien aplique un pre‑condicionador (por ejemplo, ILU).
- Selección del vector inicial: Un vector aleatorio suele ser suficiente, pero para matrices muy esparsas o con componentes dominantes, iniciar con un vector de unos puede acelerar la convergencia.
- Criterio de parada: Además del cambio en el Rayleigh quotient, considere la norma del residuo \(r = A x - \lambda x\) como métrica de precisión.
- Escalado de la matriz: Normalizar filas/columnas para reducir la condición numérica antes de la factorización.
- Parallelismo: En matrices grandes y esparsas, utilice
scipy.sparse.linalg.spluy operaciones conscipy.sparsepara aprovechar la paralelización de BLAS/LAPACK.
Resolución de Problemas Comunes (Troubleshooting)
- Convergencia lenta o estancada
- Verifique que el eigenvalue buscado esté aislado del resto del espectro.
- Intente un desplazamiento \(\sigma\) más cercano al valor esperado.
- Compruebe la condición de la matriz; si es alta, aplique una factorización con pivoteo completo o un pre‑condicionador.
- Desbordamiento/underflow numérico
- Normalice el vector en cada iteración (como se muestra en el código).
- Use tipos de datos de mayor precisión (p.ej.,
np.float64onp.longdouble).
- Fallo de factorización LU
- Puede deberse a una matriz singular o casi singular. Añada un pequeño término de regularización: \(A_{reg}=A+\epsilon I\) con \(\epsilon\approx10^{-12}\).
- Si la matriz es simétrica positiva definida, prefiera una factorización Cholesky (
scipy.linalg.cho_factor).
Aplicaciones del Mundo Real
- Análisis modal en ingeniería estructural: El valor propio más bajo corresponde a la frecuencia natural dominante.
- Estabilidad de sistemas dinámicos: En control, el eigenvalue más cercano a cero determina la velocidad de respuesta.
- Problemas de optimización convexa: El mínimo eigenvalue de la Hessiana indica la curvatura mínima y ayuda a validar la convexidad.
- Machine Learning: En PCA, el eigenvalue más pequeño de la matriz de covarianza puede revelar direcciones de bajo ruido.
Método de Potencia Inversa: Fundamentos, Implementación en Python y Buenas Prácticas