Ir al contenido principal

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 (,).

Transformando la ecuación en una algebraica

Queremos resolver la ecuación de Schrödinger independiente del tiempo

[122+V(x)]ψ=Eψ,

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

δΠ[ψ]=0,

con

Π[ψ]=12ψ,ψ+ψ,V(x)ψEψ,ψ,

con ψ 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

ψ=Nn=0cnun(x),

donde un(x)μnHn(x)ex2/2 es una función de Hermite normalizada, μn es el inverso de la magnitud del n-ésimo polinomio de Hermite

μn=1π1/2n!2n,

y cn son los coeficientes de la expansión. Esta representación es exacta en el límite N.

Si remplazamos la expansión en el funcional, obtenemos

ΠN=Nm=0Nn=0cmcn[12um,un+um,V(x)unENδmn].

El integrando que involucra las dos derivadas sería

umun=[2mμm1μmum1xum][2nμn1μnun1xun]=4mnμm1μn1μmμnun1um12mμm1μmxum1un2nμn1μnxun1um+x2umun

Entonces, el término de la energía cinética sería

um,un=4mnμm1μn1μmμnun1,um12mμm1μmum1,xun2nμn1μnum,xun1+um,x2un=4mnμ2m1μ2mδmn2mμm1μmαm1,n2nμn1μnαm,n1+βmn,

con

αm,num,xun={n+12m=n+1n2m=n10otherwise,

y

βm,num,x2un={n(n1)2m=n22n+12m=n(n+1)(n+1)2m=n+20otherwise.

El funcional se reescribe como

ΠN=Nm=0Nn=0cmcn[2mnμ2m1μ2mδmnmμm1μmαm1,nnμn1μnδm,n112βmn+um,V(x)unENδmn].

Tomando la variación

δΠN=0,

que en este caso es equivalente a

ΠNci=0i=0,1,N,

lleva a

[H]{c}=EN{c},

donde las componentes de la matriz [H] están dadas por

Hmn=2mnμ2m1μ2mδmnmμm1μmαm1,nnμn1μnδm,n112βmn+um,V(x)un.

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

from __future__ import division, print_function
import numpy as np
from hermite_QM import *

Oscilador armónico cuántico

En este caso el potencial (normalizado) está dado por

V(x)=12x2

y los valores propios exactos normalizados son

En=n+12

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

[ 0.5  1.5  2.5  3.5  4.5  5.5  6.5  7.5  8.5  9.5]
/images/hermite_ritz_harmonic.svg

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

[ 0.811203  1.855725  2.57894   3.244576  3.826353  4.38189   4.895365
  5.396614  5.911591  6.421015]
/images/hermite_ritz_abs.svg

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

[ 0.180588  0.609153  1.124594  1.681002  2.272087  2.889805  3.530901
  4.191962  4.871133  5.566413]
/images/hermite_ritz_cubic.svg

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

[  0.559146   1.769503   3.138624   4.628884   6.220303   7.899789
   9.658703  11.489094  13.38638   15.361055]
/images/hermite_ritz_pert_harm.svg

Un notebook de Jupyter con los ejemplos se puede encontrar acá.

Comentarios