WhatsApp

  

Método de Potencia Inversa: Fundamentos, Implementación en Python y Buenas Prácticas

Guía completa del algoritmo de potencia inversa, su teoría, implementación paso a paso en Python, casos de uso, comparativas y consejos de optimización y depuración.

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étodoObjetivo típicoComplejidad por iteraciónRequiere factorización
Potencia directaValor propio dominanteO(n²) (multiplicación matriz‑vector)No
Potencia inversaValor propio mínimoO(n³) (resolución de sistema)Sí (LU o Cholesky)
QR iterativoTodo el espectroO(n³) por iteraciónNo directamente, pero usa factorización interna
Arnoldi / LanczosSubespacio de valores propiosO(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.splu y operaciones con scipy.sparse para aprovechar la paralelización de BLAS/LAPACK.

Resolución de Problemas Comunes (Troubleshooting)

  1. 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.
  2. 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.float64 o np.longdouble).
  3. 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
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 13 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Botones en HTML: Conceptos, Tipos y Ejemplos Prácticos
Guía completa sobre los botones en HTML, sus atributos, estilos con Bootstrap, accesibilidad, mejores prácticas y ejemplos listos para copiar.