21. Problema de los valores y vectores propios#

Existen múltiples sistemas en física que ocurren naturalmente como un problema de valores/vectores propios. En esta lección veremos como resolver un problema de este tipo utilizando Python.

21.1. Formulación matemática#

Sea una matriz cuadrada \(A \in \mathbb{R}^{D\times D}\). El siguiente sistema de ecuaciones de \(D\) ecuaciones

\[ A \vec v = \lambda I \vec v \]

que se puede escribir de forma equivalente como

\[ (A - \lambda I) \vec v = 0 \]

tiene como resultado

  • \(\lambda\), los valores propios de \(A\)

  • \(\vec v\) los vectores propios de \(A\)

La solución no trivial de este problema (\(\vec v \neq 0\)) se obtiene si \((A - \lambda I)\) es singular, es decir

\[ |A - \lambda I | = 0 \]

que resulta en un polinomio de grado \(D\) cuyas raices son \(\{\lambda_i\}\), \(i=1,2,\ldots, D\)

Una vez determinado \(\lambda_i\) se pueden usar para despejar \(\vec v_i\)

Ejemplo

Para la matriz \(A\) del ejemplo, si igualamos su determinante a cero tenemos

\[ (1 - \lambda)^2 - 1/4 = 3/4 - 2\lambda + \lambda^2 = 0 \]

osea \(\lambda_1 = 1.5\) y \(\lambda_2 = 0.5\). Luego para el primer vector propio tenemos un sistema de ecuaciones

\[\begin{split} \begin{split} -0.5v_{11} +0.5v_{12} &= 0 \\ 0.5 v_{11} -0.5v_{12} &= 0 \end{split} \end{split}\]

osea \(v_{11} = v_{12}\) con esto podemos construir un vector normalizado genérico \(v_1 = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix}\)

De forma equivalente para \(v_2 = \frac{1}{\sqrt{2}}\begin{pmatrix} -1 \\ 1 \end{pmatrix}\)

21.2. Cálculo de valores y vectores propios con scipy#

El módulo linalg de scipy ofrece funciones para obtener vectores y valores propios. Los de aplicación más común son:

  • eig(X): Retorna una tupla con los valores y vectores propios de X

  • eigvals(X): Retorna los valores propios de X

  • eigh(X): Retorna una tupla con los valores y vectores propios de X, asumiendo que X tiene simetría hermítica

  • eigvalsh(X): Retorna los valores propios de X, asumiendo que X tiene simetría hermítica

Utilicemos eig para el ejemplo anterior:

import numpy as np
import scipy.linalg

A = np.array([[1., 0.5], [0.5, 1]])
evals, evecs = scipy.linalg.eig(A)
evals, evecs
(array([1.5+0.j, 0.5+0.j]),
 array([[ 0.70710678, -0.70710678],
        [ 0.70710678,  0.70710678]]))

21.3. Descomposición en valores y vectores propios#