Funciones recursivas |
El oscilador armónico cuántico
Funciones de onda de un oscilador armónico cuántico
Hay varios casos de funciones recursivas que se emplean en la Física, las funciones de Bessel, los polinomios de Hermite, etc.
La fórmula recurrente de las funciones de Bessel es la siguiente
Todas las funciones de Bessel de los números enteros se expresan mediante dos funciones J0(x) y J1(x). Por ejemplo cuando n es uno
Las funciones de Bessel son complicadas de calcular y suelen venir tabuladas, por lo que presentaremos un ejemplo más simple como son los polinomios de Hermite.
La ecuación de Schrödinger para un oscilador armónico cuántico independiente del tiempo es.
Haciendo los cambios de variables
donde w es la frecuencia angular del oscilador armónico. La ecuación de Schrödinger se reduce a otra mucho más simple.
Los valores propios o niveles de energía viene dados por la expresión
e n=n+1/2
y las funciones de onda por
Donde Hn(x ) es el polinomio de Hermite de orden n.
Los primeros seis polinomios de Hermite son los siguientes.
H0(x)=1
H1(x)=2x
H2(x)=4x2-2
H3(x)=8x3-12x
H4(x)=16x4-48x2+12
H5(x)=32x5-160x3+120x
Todos los polinomios de Hermite de orden n>2 se pueden expresar en términos de los dos primeros polinomios H0(x) y H1(x), de orden cero y uno respectivamente, mediante la siguiente relación de recurrencia.
El código de la función recursiva que calcula los valores del polinomio Hn(x) es muy simple
double hermite(double x, int n){ if(n==0) return 1.0; if(n==1) return 2*x; return (2*x*hermite(x, n-1)-2*(n-1)*hermite(x, n-2)); }
Nuestra tarea va consistir en calcular las funciones de onda para los distintos niveles de energía n=0, 1, 2...
Empezamos por el denominador que precisa calcular la potencia 2n y el factorial de n, n!=n·(n-1)·(n-2)...2·1. Estas funciones son muy simples de programar y se han explicado al comienzo de los Fundamentos del Lenguaje Java.
long potencia2(int n){ long result=1; for(int i=1; i<=n; i++){ result*=2; } return result; }
long factorial(int n){ if(n==0) return 1; long result=1; for(int i=1; i<=n; i++){ result*=i; } return result; }
Dado el nivel de energía n, se calcula la función de onda para cualquier valor de x, en términos de las tres funciones auxiliares previamente definidas.
double funcion(double x){ double y=(1.0/Math.sqrt(potencia2(n)*Math.sqrt(Math.PI)*factorial(n))) *hermite(x, n)*Math.exp(-x*x/2); return y; }
En el siguiente applet se elige el nivel de energía y se representa la función de onda asociada. Las unidades de la energía e (en el eje vertical) en función de la distancia x (en el eje horizontal) se han definido al principio de esta página.
En este applet se elige el estado o nivel en el control selección situado a su izquierda titulado Estado, y a continuación se pulesa en el botón titulado Dibuja.