Solución de la ecuación de Schrödinger usando el método de Ritz
En esta publicación describimos la solcuión de la ecuación de Schrödinger usando el método de Ritz y base de funciones de Esta base parece ser una buena elección para la ecuación de Schrödinger ya que es una base ortogonal sobre \((-\infty, \infty)\).
Transformando la ecuación en una algebraica
Queremos resolver la ecuación de Schrödinger independiente del tiempo
donde estamos usando unidades naturales ya que son una buena elección para cálculos numéricos.
Resolver esta ecuación es equivalente a resolver la siguiente ecuación variacional
con
con \(\psi\) la función de onda, \(V(x)\) el potencial y \(E\) la energía. Esta formulación variacional es equivalente a la ecuación de Schrödinger independiente del tiempo, y \(E\) funciona como un multiplicador de Lagrange que garantiza que la probabilidad sobre todo el dominio sea 1.
Podemos expandir la función de onda en la base ortogonal
donde \(u_n(x) \equiv \mu_n H_n(x) e^{-x^2/2}\) es una función de Hermite normalizada, \(\mu_n\) es el inverso de la magnitud del \(n\)-ésimo polinomio de Hermite
y \(c_n\) son los coeficientes de la expansión. Esta representación es exacta en el límite \(N \rightarrow \infty\).
Si remplazamos la expansión en el funcional, obtenemos
El integrando que involucra las dos derivadas sería
Entonces, el término de la energía cinética sería
con
y
El funcional se reescribe como
Tomando la variación
que en este caso es equivalente a
lleva a
donde las componentes de la matriz \([H]\) están dadas por
La última integral se puede calcular usando la cuadratura de Gauss-Hermite. Y necesitaremos más puntos de Gauss si queremos integrar polinomios de orden alto. Este método funciona bien para funciones que pueden ser aproximadas por polinomios.
Ejemplos
Una implementación en Python de este método se puede encontrar en este repo.
Para todos los ejemplos usamos las siguientes importaciones
Oscilador armónico cuántico
En este caso el potencial (normalizado) está dado por
y los valores propios exactos normalizados son
El siguiente bloque de código calcula los primeros 10 valores propios y grafica los estados propios correspondientes
potential = lambda x: 0.5*x**2 vals, vecs = eigenstates(potential, nterms=11, ngpts=12) print(np.round(vals[:10], 6)) fig, ax = plt.subplots(1, 1) plot_eigenstates(vals, vecs, potential);
con resultados
Potencial de valor absoluto
potential = lambda x: np.abs(x) vals, vecs = eigenstates(potential) print(np.round(vals[:10], 6)) fig, ax = plt.subplots(1, 1) plot_eigenstates(vals, vecs, potential, lims=(-8, 8));
con resultados
Potencial cúbico
potential = lambda x: np.abs(x/3)**3 vals, vecs = eigenstates(potential) print(np.round(vals[:10], 6)) fig, ax = plt.subplots(1, 1) plot_eigenstates(vals, vecs, potential, lims=(-6, 6));
con resultados
Oscilador armónico con perturbación cuártica
potential = lambda x: 0.5*x**2 + 0.1*x**4 vals, vecs = eigenstates(potential, nterms=20, ngpts=22) print(np.round(vals[:10], 6)) fig, ax = plt.subplots(1, 1) plot_eigenstates(vals, vecs, potential, lims=(-5, 5))
con resultados
Un notebook de Jupyter con los ejemplos se puede encontrar acá.
Comentarios
Comments powered by Disqus