Sie sind auf Seite 1von 25

Solucin Numrica a la Ecuacin de o e o Schrdinger y Espectro Continuo de su o Operador

Ricardo Coronado Leija


Algebra L neal Nmerica u Exmen Final a Centro de Investigacin en Matemticas o a 30 de noviembre de 2010

1.
1.1.

Mecnica Cuntica y la Ecuacin de Schrdinger a a o o


Mecnica Cuntica y el Principio de Incertidumbre a a

En la mecnica cuntica, las part a a culas subatmicas, como el electrn, son descritas por una funcin de o o o onda x (x) que es una funcin compleja, tal que |(x)|2 sea una densidad de probabilidad. De esta o manera la probabilidad de encontrar una part cula con posicin x en el intervalo [a,b] es: o
b a

|(x)|2 dx

(1)

se asume que |(x)|dx = 1


R

(2)

Uno de los principios fundamentales de la mecnica cuntica es la relacin de Broglie para ondas asociadas a a o con materia: p = hk (3) donde k es llamado nmero de onda, donde = (2)/k es la longitud de onda, p es el momento mv, y u h = h/2, con h igual a la constante de Planck. Remplazando k por p/ en la transformada de Fourier de h , introduciendo una constante de normalizacin de 1/ 2 , se obtiene una expresin para dada por: o h o (p) = 1 2 h
h (x)eixp/ dx R

(4)

es la representacin de la part o cula en el espacio de los momentos. Entonces se tiene tambin la siguiente e expresin: o (x) = 1 2 h
h (p)eixp/ dp R

(5)

Por lo tanto teniendo o , es posible obtener una idea de como se comporta la part cula, sin embargo hay que tener en cuenta lo siguiente. El valor esperado de de la posicion de la part cula es: mx = y el valor esperado del momento es: mp = p|(p)|2 dp
R

x|(x)|2 dx
R

(6)

(7)

Las desviaciones estandar son:


1/2

x = y

(x mx )|(x)|2 dx

(8)

p =

(p mp )|(p)|2 dp

1/2

(9)

Por medio de algunas operaciones se encuentra que: h 2

x p

(10)

el cual es el Principio de Incertidumbre de Heisenberg, que establece que es imposible determinar tanto la posicin como el momento de una part o cula al mismo tiempo con una buena presicin. Esta limitacin o o no es importante para objetos macroscpicos ya que el producto de la posicin y el momento de estos o o es mucho mas grande que h = 1,054x1027 erg-sec, sin embargo es muy importante para las part culas subatmicas. o

1.2.

El Principio de Correspondencia y la Ecuacin de Schrdinger o o

Comsiderando ahora como una funcin (x, t) donde para cada t, x (x, t) es la funcin de onda de la o o part cula. Se puede encontrar una ecuacin diferencial parcial con las funciones de onda como soluciones. o Esta EDP debe satisfacer al menos dos condiciones: Debe ser de primer orden en t de tal manera que la especicacin de la funcin de onda en t = 0 la o o determine unicamente para todos los tiempos. La funcin de onda debe satisfacer la condicin de normalizacin o o o |(x)|2 dx = 1
R

(11)

para todo t. De acuerdo al modelo de la naturaleza onda-part cula de la materia, se puede escribir (x, t) como una integral de ondas planas (o paquete de ondas): (x, y) = 1 2 h
h (p)ei(xp/ t) dp R

(12)

Segn la hipotesis de Einstein se asigna una energ E a cualquier onda masiva que tiene un comportamiento u a armonico en el tiempo del tipo exp(it) por medio de la relacin E = h. Con esto y diferenciando la o ecuacin (12) con respecto al tiempo (multiplicando tambin por i ) se tiene que: o e h (x, t) 1 = t 2 h
h (p)Eei(xp/ Et) dp

i h

(13)

Ahora obteniendo la segunda derivada de la ecuacin (12) con respecto de x y (multiplicando por un factor o 2 i ) se obtiene: h 1 (x, t) = x 2 h
h (p)pei(xp/ Et) dp

i h

(14)

Lo anterior ilustra el principio de correspondencia, es decir que E puede ser visto como el operador i t y h p puede ser visto como el operador i x (realmente no es muy formal esto, pero se puede hacer). Ahora h bien la ecuacin de la energia (o Hamiltoniano) de una part o cula en la presencia de un potencial V (x) es: p2 E= + V (x) = H 2m

(15)

Remplazando en esta ecuacin E y p de acuerdo al principio de correspondencia, adems de asociar el o a potencial V (x) al operador multiplicacion V (x) se obtiene: 2 h xx + V (x) i t = h 2m

(16)

Esta es la ecuacin de Schrodinger la cual describe la evolucin temporal de una part o o cula masiva no relativista. Esta ecuacin es de importancia central en la teor de la mecnica cuntica, pues representa o a a a para las part culas microscpicas un papel anlogo a la segunda ley de Newton en la mecnica clsica. o a a a

1.3.

Espectro del Operador de Schrdinger o

En el caso de la ecuacin (16) el potencial V (x) no depende del tiempo por lo que es posible reducir esta o ecuacin diferencial parcial en dos ecuaciones diferenciales ordinarias. Escribiendo la funcin de onda como o o un producto de funciones: (x, t) = T (t)u(x) (17)

sustituyendo (17) en (18) y despues dividiendo (18) entre (17) (proceso de separacin de variables) se o obtiene:

1 h2 d2 u(x) 1 dT (t) = i h + V (x)u(x) T (t) dt u(x) 2m dx2

(18)

Ya que ambos lados de la ecuacin dependen de diferentes variables, la ecuacin (19) solo se puede satisfacer o o si ambos lados son constantes. Denotando esa constante por . La solucin de o dT (t) = T (t) dt

i h es

(19)

h T (t) = Ceit/

(20)

donde C es una constante que se puede determinar mediante la condicion inicial T (0), sin embargo an u falta conocer . La otra ecuacin es: o h2 d2 u(x) + V (x)u(x) = u(x) 2m dx2 Expresando la ecuacin anterior en terminos del Hamiltoniano H se tiene: o H = La cual es una ecuacin de eigenvalores. o Por que es necesario todo el proceso anterior? Bueno, sin duda se podria intentar resolver la ecuacin o (16) con algn mtodo nmerico de resolucin de ecuaciones diferenciales parciales, pero ya que V (x) es u e u o independiente del tiempo, esto es inecesario ya que T (t), es decir la parte temporal de , simpre tendr la a misma forma expresada en (20), adems ya que los operadores que aparecen en la ecuacin de Schrdinger a o o son operadores lineales; se deduce que toda combinacin lineal de soluciones es solucin de la ecuacin. o o o Esto lleva a favorecer la bsqueda de soluciones que tengan un gran inters terico y prctico: a saber u e o a los estados que son propios (eigenestados) del operador Hamiltoniano H, los cules son soluciones de la a ecuacin (22). o El producto escalar entre dos funciones complejas est dado por: a f, g =
R

(21)

(22)

f (x)g(x)dx

(23)

Adems se tiene que H, = , H , entonces suponiendo que perteneciente a los complejos es una a eigenfuncin de H con eigenvalor se tiene que: o

||||2 = H, = , H = , = ||||2 ya que = se tiene que es real.

(24)

Cual es el signicado f sico de un eigenvalor? Si u(x) y satisfacen la ecuacin (22) entonces por (17) y o (20):
h (x, t) = Ceit/ u(x)

(25)

satisface la Ecuacin de Schrdinger dependiente del tiempo (16) con frecuencia angular = / . Y de o o h acuerdo a la hipotesis de Einstein mencionada antes, la energ de una onda masiva esta relacionada con la a frecuencia angular por E = h, comparando estas dos relaciones se tiene que si u(x) es una eigenfuncin o de H, entonces u(x) tiene energia E denida por el eigenvalor .

2.

Mtodo N merico para la obtencin de los Eigevalores y e u o Eigenfunciones de La Ecuacin de Schrdinger o o

Aunque para muchos potenciales es posible obtener una solucin analitica de la ecuacin (22) para poteno o ciales ms realistas no ser posible, por lo que es necesario usar un solucionador de ecuaciones diferenciales a a ordinarias para obtener nmericamente la funcin de onda, para el presente problema de eigenvalores es u o conveniente usar el Mtodo de Numerov que se especializa para ecuaciones diferenciales que no contienen e primeras deivadas (tal como la ecuacin (21)), este mtodo aunque no tan general como el de Runge-Kutta o e provee un orden ms de exactitud, lo cual ser necesario. a a

2.1.

Metodo de Numerov

Partiendo de la ecuacin: o d2 + k 2 (x) = 0 dx2 Realizando una expansin de Taylor de la funcion de onda, o h2 (2) h3 h4 (x) + (3) (x) + (4) (x) + ... 2 3! 4!

(26)

(x + h) = (x) + h (1) (x) +

(27)

Realizando la expansion ahora para (x h) y sumandola a la anterior se tiene

(x + h) + (x h) 2(x) + h2 (2) (x) + Despejando (2) se obtiene

h4 (4) (x) + O(h6 ) 12

(28)

(2)

(x + h) + (x h) 2(x) h4 (4) (x) O(h6 ) h2 12


h2 d2 12 dx2

(29) a la ecuacin o

Para eliminar errores en la cuarta derivada en el algoritmo, se aplica el operador 1 + (26) para tener: h4 (4) h2 d2 2 (x) + k 2 (x) + [k (x)(x)] = 0 12 12 dx2

(2) (x) +

(30)

Suatituyendo la aproximacion para la segunda derivada obtenida en (29) se obtiene:

(x + h) + (x h) 2(x) h4 (4) h4 (4) h2 d2 2 6 2 (x) O(h ) + (x) + k (x) + [k (x)(x)] 0 (31) h2 12 12 12 dx2 Se puede observar que los terminos de (4) se cancelan, con lo que el error es de O(h6 ). Para manejar la dependencia general en x de k 2 , se aproxima la segunda derivada de k 2 (x)(x) como: [k 2 (x + h)(x + h) k 2 (x)(x)] + [k 2 (x h)(x h) k 2 (x)(x)] d2 [k 2 (x)(x)] dx2 h2 Sustituyendo la expresin anterior en (31) y despejando (x + h) se obtiene: o 2 1
5 2 2 h k (x) 12

(32)

(x + h)

(x) 1 + 1+
h2 2 k (x 12

h2 2 k (x 12

h) (x h)

+ h)

(33)

En trminos de indices discretos con x = ih, el algoritmo resultante para resolver ecuaciones del tipo (26) e es: 2 1
5 2 2 h ki 12

i+1

i 1 +
h2

h2 2 k 12 i1

i1

1+

k2 12 i+1

(34)

2.2.

El Problema de Eigenvalores

Reescribiendo la ecuacin (21) como o d2 u(x) 2m + 2 [ V (x)]u = 0 dx2 h se puede notar que tiene la misma forma que la ecuacin (26) con k 2 (x) = 2m[ V (x)]/ 2 . o h Con el objetivo de resolver el problema de eigenvalores para una part cula en la presencia de un pozo de potencial V(x), se puede resolver la ecuacin (35) con el algoritmo de Numerov de la izquierda a la derecha o o de la derecha a la izquierda de la region del potencial. Se tiene la restriccin de que u(x) 0 cuando o x , sin embargo la resolucin de la ecuacion de un lado al otro requiere que se pase de una regin o o exponencialmente creciente a una regin oscilatoria y despues a una regin exponencialmente decreciente, o o y aqui hay un problema, pues cuando se pasa de la regin oscilatoria a la regin decreciente pueden entrar o o valores que hagan grande al error acumulado, esto es debido a que existe una solucin exponencialmente o creciente que puede entrar fcilmente a la resolucin nmerica destruyendo la exactitud del algoritmo. a o u Algo que se puede hacer aqui para evitar esto es resolver por ambos lados y entonces comparar las dos soluciones en algun punto de la regin del pozo. Usualmente el matching es hecho en uno de los puntos o donde la energia (eigevalor) es igual al potencial, que se denotarn como xl y xr . Al principio se comienza a con una aproximacin de entonces se tiene que ir ajustando esta hasta que la solucin obtenida desde la o o derecha ur (x) y la solucin obtenida desde la izaquierda ul (x), satisfagan las condiciones de continuidad o en alguno de los puntos xl o xr . Si se escoge el derecho como punto de comparacin, las condiciones de o continuidad son: ul (xr ) = ur (xr ) Combinando estas dos condiciones se tiene u (xr ) ul (xr ) = r ul (xr ) ur (xr ) Usando diferencias nitas para las derivadas en la ecuacin anterior se tiene o [ul (xr + h) ul (xr h)] [ur (xr + h) ur (xr h)] =0 2hu(xr ) ul (xr ) = ur (xr ) (36)

(35)

(37)

f () =

(38)

lo cual puede ser asegurado mediante un esquema de bsqueda de raices. Hay que notar que f () es funcin u o solo de pues ul (xr ) = ur (xr ) = u(xr ) puede ser usado para reescalar las funciones de onda.

A continuacin un esbozo del procedimiento nmerico para resolver el problema de eigenvalores para la o u ecuacin (21): o 1. Escoger la regin de la solucin nmerica, la cual debe ser sucientemente grande comparada con la o o u region efectiva del potencial. 2. Proveer una aproximacin razonable del eigenvalor a buscar. o 3. Resolver la ecuacin para ul (x) desde la izquierda hasta el punto xr + h, y tambin resolverla para o e ur (x) desde la derecha hasta xr h. Se pueden escoger cero los valores de los primeros puntos de ul y ur , y una cantidad pequea para los segundos puntos, esto para comenzar la resolucin con el n o algoritmo de Numerov. Antes de comparar las soluciones, es apropiado reescalar alguno de ellos para asegurar que ul (xr ) = ur (xr ). Por ejemplo se puede multiplicar ul (x) por ur (xr )/ul (xr ). 4. Evaluar f () = ([ul (xr + h) ul (xr h)] [ur (xr + h) ur (xr h)])/2hu(xr ) 5. Aplicar un mtodo de bsqueda de raices para obtener una tal que f () = 0 con una tolerancia e u dada. 6. Al hallar el eigenvalor buscado, normalizar la eigenfuncin correspondiente. o 7. Llevar a cabo los pasos anteriores para el siguiente eigenvalor. Empezando la bsqueda con un valor u ligeramente mayor al ultimo eigenvalor. Es necesario asegurarse que ningun eiganvalor es pasado por alto. Esto se puede checar fcilmente contando los nodos en la solucin; el n-esimo estado tiene un a o nmero total de n nodos, con n = 0 para el estado base. Un nodo es donde u(x) = 0. Esto tambien u es una manera de determinar la localizacion de un especico eigenestado

3.

Resultados

Aplicando el mtodo anterior al pozo de potencial denido por: e 1 1 h 2 ( 1) 2m 2 cosh2 (x)

V (x) = donde y son prametros dados. a

(39)

La ecuacin de Schrdinger con este potencial puede ser resuleto de manera exacta con los eigenvalores o o

h2 2 ( 1) ( 1 n)2 n = 2m 2

(40)

Debido a la restriccin puesta acerca de que la funcin de onda u(x) decayera exponencialmente el los o o extremos, los eigenvalores que cumplirn eso son los que se hallen entre el valor mximo y el valor m a a nimo del potencial, pues fuera de este rango la funcin u(x) presenta oscilaciones en los extremos. Por lo que al o elegir por ejemplo = 1 y = 6 el rango de los eigenvalores es [7,5, 7,5], usando unidades inteligentes tal que m = h = 1, por conveniencia. Usando la ecuacin (40) tenemos que los eigenvalores que caen en o ese rango son: n Eigenvalor 0 -5 1 -0.5 2 3 3 5.5 4 7 Cuadro 1: Eigenvalores encontrados analiticamente

Ahora bien utilizando el algoritmo presentado usando en la regin para x [10, 10] con 501 puntos uniformeo mente espaciados, y con las regiones de busqueda para los eigenvalores partiendo de 7,5 e incrementando de 1 en 1 hasta llegar a 7,5, se encontraron los siguientes eigenvalores:

Figura 1: Eigenvalores encontrados por el algoritmo.

como se puede observar, se encontraron todos los eigenvalores en el rango con una buena presicin, por lo o que el algoritmo es bastante efectivo. Sin embargo conforme incrementan los eigenvalores dentro del rango comprendido entre los valores minimo y maximo del potencial, debido a la gran cantidad de operaciones que se realizan el algoritmo se va volviendo ms lento, ademas ya que se limita el nmero de iteraciones a 1000 cuando trata de encontrar la raiz de a u 9

f (), si las regiones de bsqueda dadas no son muy buenas el algoritmo fallara al encontrar los eigenvalores u correctos. Estos eigenvalores encontrados son llamados estados ligados, donde el eigenvalor para n = 0 (o el ms a pequeo) es llamado estado base que es el correspondiente al de menor energ Estos estados ligados n a. representan los estados en los cuales la particula es atrapada por el potencial. En la Figura 2 se muestran los eigenestados (eigenfunciones) correpondientes a los eigenvalores encontrados, gracandolos sobre el potencial para observar el efecto que tiene este sobre la particula. Hay que notar que las eigenfunciones tienen una pequea cola exponencial que va fuera del pozo, lo que n representa que aun cuando la particula es capturada por el potencial, hay una pequea probabilidad de n ser encontrada fuera del pozo de potencial.

(a)

(b)

(c)

(d)

(e) Figura 2: Pozo de potencial y eigenfunciones correspondientes a los eigenvalores encontrados (a) = 5. (b) = 0,5. (c) = 3. (d) = 5,5. (a) = 7.

10

Debido al hecho de que en la Figura 2 no se puede apreciar bien la forma de las funciones de onda, debido a que al estar junto a el pozo de potencial este las opaca, se muestran en la Figura 3, las funciones de onda separadas, para que se observe mejor su forma.

(a)

(b)

(c)

(d)

(e) Figura 3: eigenfunciones correspondientes a los eigenvalores encontrados (a) = 5. (b) = 0,5. (c) = 3. (d) = 5,5. (a) = 7.

11

4.

Programa Para Encontrar los Eigenvalores y las Eigenfunciones del Pozo de Potencial

#include <winbgim.h> #include <iostream> #include <fstream> #include <math.h> #include <iomanip> #define NMAX 501 using namespace std; class HelpMe{ string message; public: HelpMe(const string &s):message(s){cout << "Constructor de HelpMe" << endl;}; HelpMe(const HelpMe &otra){ message = otra.message; cout << "Constructor por Copia de HelpMe" << endl;} const string &getMessage(){return message;} ~HelpMe(){cout << "Destructor de HeplMe" << endl;} }; // Calculo de Valor Minimo de un Vector float minimo(float X[], int N){ float m = X[0]; for(int i = 1; i < N; i++) if(m > X[i]) m = X[i]; return m; } // Calculo del Valor Maximo de un Vector float maximo(float X[], int N){ float m = X[0]; for(int i = 1; i < N; i++) if(m < X[i]) m = X[i]; return m; } // Grafica una Funcion void graficaFuncion(float *Y, int N, int npixX, int npixY, char c[]){ float minX = 0;

12

float maxX = N-1; float minY = minimo(Y,N); float maxY = maximo(Y,N); int Px1, Py1, Px2, Py2, midx, midy; char S[10]; float X[N]; for(int i = 0; i < N; i++) X[i] = i; initwindow(npixX+20,npixY+30); setcolor(RED); midx = getmaxx() / 2; midy = getmaxy() / 2; sprintf(S,"%4.2f",minX); outtextxy(0,midy, S); sprintf(S,"%4.2f",maxX); outtextxy(npixX+20-textheight("W")*4,midy, S); sprintf(S,"%4.2f",minY); outtextxy(0,npixY+20-textheight("W"), S); sprintf(S,"%4.2f",maxY); outtextxy(0,0, S); line(0,0,0,0); setcolor(WHITE); if(c[0] == -) { for(int i = 0; i < N-1; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(Y[i]-maxY)/(minY-maxY)); Px2 = (int)(npixX*(X[i+1]-minX)/(maxX-minX)); Py2 = (int)(npixY*(Y[i+1]-maxY)/(minY-maxY)); line(Px1,Py1,Px2,Py2); //printf("."); } } else for(int i = 0; i < N; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(Y[i]-maxY)/(minY-maxY)); outtextxy(Px1,Py1,c); } if(minY*maxY < 0){ setcolor(WHITE); for(int i=0; i < N-1; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(0-maxY)/(minY-maxY)); 13

Px2 = (int)(npixX*(X[i+1]-minX)/(maxX-minX)); Py2 = (int)(npixY*(0-maxY)/(minY-maxY)); line(Px1,Py1,Px2,Py2); } } //while(!kbhit()); //closegraph(); while(getch()!= 27); closegraph(); } // Grafica X contra Y void graficaFuncion(float *X, float *Y, int N, int npixX, int npixY, char c[]){ float minX = minimo(X,N); float maxX = maximo(X,N); float minY = minimo(Y,N); float maxY = maximo(Y,N); int Px1, Py1, Px2, Py2, midx, midy; char S[10]; initwindow(npixX+20,npixY+30); setcolor(RED); midx = getmaxx() / 2; midy = getmaxy() / 2; sprintf(S,"%4.2f",minX); outtextxy(0,midy, S); sprintf(S,"%4.2f",maxX); outtextxy(npixX+20-textheight("W")*4,midy, S); sprintf(S,"%4.2f",minY); outtextxy(0,npixY+20-textheight("W"), S); sprintf(S,"%4.2f",maxY); outtextxy(0,0, S); line(0,0,0,0); setcolor(WHITE); if(c[0] == -) { for(int i = 0; i < N-1; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(Y[i]-maxY)/(minY-maxY)); Px2 = (int)(npixX*(X[i+1]-minX)/(maxX-minX)); Py2 = (int)(npixY*(Y[i+1]-maxY)/(minY-maxY)); line(Px1,Py1,Px2,Py2); } } 14

else for(int i = 0; i < N; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(Y[i]-maxY)/(minY-maxY)); outtextxy(Px1,Py1,c); } if(minY*maxY < 0){ setcolor(RED); for(int i=0; i < N-1; i++){ Px1 = (int)(npixX*(X[i]-minX)/(maxX-minX)); Py1 = (int)(npixY*(0-maxY)/(minY-maxY)); Px2 = (int)(npixX*(X[i+1]-minX)/(maxX-minX)); Py2 = (int)(npixY*(0-maxY)/(minY-maxY)); line(Px1,Py1,Px2,Py2); } } //while(!kbhit()); //closegraph(); while(getch()!= 27); closegraph(); } void GraficarPuntosenR(float *x0, float *y0, float *yp, int n, char *name){ int i; ofstream salida; salida.open(name); if(salida.good()) cout << "El archivo datos.txt fue abierto correctamente" << endl; else cout << "El archivo datos.txt no pudo ser abierto correctamente" << endl; salida << "x0 = [" << x0[0]; for(i = 1; i < n; i++){ salida << " " << x0[i]; } salida << "];" << endl; salida << "y0 = [" << y0[0]; for(i = 1; i < n; i++){ salida << " " << y0[i]; } salida << "];" << endl;

15

salida << "yp = [" << yp[0]; for(i = 1; i < n; i++){ salida << " " << yp[i]; } salida << "];" << endl;

//salida << "par(mfrow = c(2,1))" << endl; //salida << "plot(x0,y0, type = \"l\", lwd = 2, main = \"Temperatura contra x - Phi(x)\") salida << "axis([-10 10 -10 10])" << endl; salida << "plot(x0,y0,x0,yp,LineWidth,2)" << endl; salida << "grid on" << endl; //salida << "par(new = TRUE)" << endl; //salida << "plot(x0,yp,type = \"l\" , lwd = 2, col = \"red\")" << endl; salida.close(); } void GraficaArchivotxt(char *c, int npixX, int npixY){ ifstream entrada; entrada.open(c); if(entrada.good()) cout << "El archivo datos.txt fue abierto correctamente" << endl; else cout << "El archivo datos.txt no pudo ser abierto correctamente" << endl; float *x, *y; string caracter; int n = 0; while(!entrada.eof()){ entrada >> caracter; entrada >> caracter; n++; } cout << n << endl; entrada.close(); ifstream input; input.open(c); if(input.good()) cout << "El archivo datos.txt fue abierto correctamente" << endl; else cout << "El archivo datos.txt no pudo ser abierto correctamente" << endl; x = new float[n]; y = new float[n]; 16

int i = 0; while(!input.eof()){ input >> x[i]; //cout << x[i] << " "; input >> y[i]; //cout << y[i] << endl; i++; } input.close(); graficaFuncion(x,y,n-1,npixX,npixY,"-"); } // Potencial V1(x) float V1(float x){ float alpha = 1, lambda = 6; float masa = 1, hbarra = 1; float constante = pow(hbarra,2)/(2*masa); return constante*alpha*alpha*lambda*(lambda-1)*(0.5-1/pow(cosh(alpha*x),2)); } // Potencial V2(x) float V2(float x){ if(fabs(x) > 1) return 6.4; else return 0; } /* Algoritmo de Numerov para la ecuacion u"(x)+q(x)u(x)=s(x)*/ void Numerov2(float *u, float *q, float *s, int n, float h){ int i; float g,c0,c1,c2,di,ut; g = h*h/12; for(i = 1; i < n-1; ++i){ c0 = 1 + g*q[i-1]; c1 = 2 - 10*g*q[i]; c2 = 1 + g*q[i+1]; di = g*(s[i+1] + s[i-1] + 10*s[i]); ut = c1*u[i] - c0*u[i-1] + di; u[i+1] = ut/c2; //cout << u[i] << endl; //system("pause"); } } //*****************************************************************************// //*****************************************************************************// 17

/* "Outline the numerical procedure for solving the eigenvalue problem of the one-dimensional Schrodinger equation" Metodo Obtenido de An Introduction to Computational Physics de Tao Pang*/ float SchrodingerMod(float Emin, float Emax, int val, bool des, float &Eig){ /* Ecuacion General: u(x) + d(x)u(x) + q(x)u(x) = s(x)*/ /* Ecuacion Schrodinger: u(x) + (2m/hb^2)[E-V(x)]u(x) = 0*/ float float float float masa = 1.0, hbarra = 1.0; alpha = 1.0, lambda = 4.0; constante = 2*masa/pow(hbarra,2); E; // Energia

int i, istep, im, n, m, imax, nl, nr; float h, ea, eb, e1, xl0, xr0, xl, xr, f0, f1, fact, sum; float ul[NMAX],ur[NMAX],ql[NMAX],qr[NMAX],s[NMAX]; n = NMAX; // numero de puntos m = 5; imax = 1000; float dl = 1e-6; float de = 0.1; //h2m = 0.5; //c = 1/h2m; /* 1. "Choose the region of the numerical solution. This region should be large enough compared with the effective region of the potential to have a negligible effect on the solution."*/ xl0 = -10; // limite inferior xr0 = 10; // limite superior h = (xr0-xl0)/(n-1); // para diferencias finitas /* 2. "Provide a reasonable guess for the lowest eigenvalue e0. This can be found approximately from the analytical result of the case with an infinite well and the same range of well width". */ ea = Emin; // e0 eb = Emax; // Puntos iniciales para ul y ur /* 3. a) "We can choose zero to be the value of the first points of ul(x) and ur(x), and a small quantity to be the value of the second points of ul(x) 18

and ur(x), to start the integration with the Numerov algorithm" */ ul[0] = 0; ul[1] = 0.00001; ur[0] = 0; ur[1] = 0.00001; /* Calcular q(x) y s(x), pero de la Ec de Schrodinger */ E = ea; for (i = 0; i < n; ++i){ xl = xl0+i*h; xr = xr0-i*h; ql[i] = constante*(E-V1(xl)); qr[i] = constante*(E-V1(xr)); //cout << " p: " << ql[i] << " q: " << qr[i] ; s[i] = 0; } //graficaFuncion(ql,n,500,500,"-"); //graficaFuncion(qr,n,500,500,"-"); /* Encuentra el punto donde E = V(x) , donde q(x) = 0 (matching point at the right turning point)*/ if(des){ im = -100; for (i = 0; i < n-1; ++i){ if(((ql[i]*ql[i+1]) < 0) && (ql[i] > 0)) im = i; } if(im == -100) throw(HelpMe("No se encontro un Matching Point")); cout << "Matching Point = " << im << endl; } else{im = val;}

/* Usando el Metodo de Numerov de Derecha a Izquierda y Viceversa 3. b) "Integrate the equation for ul(x) from the left to the point xr + h and the one for ur(x) from the right to xr - h" */ nl = im+2; nr = n-im+1; Numerov2(ul,ql,s,nl,h); Numerov2(ur,qr,s,nr,h); /*cout << nl << " " << nr << " " << h << endl; graficaFuncion(ql,n,500,500,"-"); graficaFuncion(qr,n,500,500,"-"); 19

graficaFuncion(ul,nl,500,500,"-"); graficaFuncion(ur,nr,500,500,"-");*/ /* Reescalar la solucion izquierda: 3. c)"Before matching the solutions, rescale one of them to ensure that ul(xr) = ur(xr). For example, we can multiply ul(x) by ur(xr)/ul(xr) up to x = xr + h. This rescaling also ensures that the solutions have the correct nodal structure, that is, changing the sign of ul(x) if it is incorrect" */ fact = ur[nr-2]/ul[im]; for(i = 0; i < nl; ++i){ ul[i] = fact*ul[i]; //cout << ul[i] << " "; } //graficaFuncion(ul,nl,500,500,"-"); //graficaFuncion(ur,nr,500,500,"-"); /* 4. "Evaluar f(e0) = [ur(xr-h)-ur(xr+h)-ul(xr-h)+ul(xr+h)]/2h*ur(xr)"*/ f0 = ur[nr-1]+ul[nl-1]-ur[nr-3]-ul[nl-3]; f0 = f0/(2*h*ur[nr-2]); /* Metodo de la Biseccion para la raiz */ istep = 0; f1 = dl+1; //while((fabs(de) > dl) && (istep < imax)){ while((fabs(f1) > dl) && (istep < imax)){ e1 = E; E = (ea+eb)/2; for (i = 0; i < n; ++i){ xl = xl0+i*h; xr = xr0-i*h; ql[i] = constante*(E-V1(xl)); qr[i] = constante*(E-V1(xr)); } /* Encuentra el punto donde E = V(x) , donde q(x) = 0 (matching point at the right turning point)*/ if(des){ im = -100; for (i = 0; i < n-1; ++i){ if(((ql[i]*ql[i+1]) < 0) && (ql[i] > 0)) im = i; } if(im == -100) throw(HelpMe("No se encontro un Matching Point")); //cout << "Matching Point = " << im << endl; } 20

else{im = val;} /* Usando el Metodo de Numerov de Derecha a Izquierda y Viceversa nl = im+2; nr = n-im+1; Numerov2(ul,ql,s,nl,h); Numerov2(ur,qr,s,nr,h); //graficaFuncion(ul,nl,500,500,"-"); //graficaFuncion(ur,nr,500,500,"-"); /* Reescalar la solucion izquierda */ fact = ur[nr-2]/ul[im]; for(i = 0; i < nl; ++i){ ul[i] = fact*ul[i]; } /* 4. "Evaluar f(e0) = [ur(xr-h)-ur(xr+h)-ul(xr-h)+ul(xr+h)]/2h*ur(xr)"*/ f1 = ur[nr-1]+ul[nl-1]-ur[nr-3]-ul[nl-3]; f1 = f1/(2*h*ur[nr-2]); if ((f0*f1) < 0){ eb = E; de = eb-ea; } else{ ea = E; de = eb-ea; f0 = f1; } istep = istep+1; } // fin el while /* Pegar la Parte Derecha a la Izquierda y Encontrar el factor de Normalizacion*/ sum = 0; for (i = 0; i < n; ++i) { if (i > im) ul[i] = ur[n-i-1]; sum = sum+ul[i]*ul[i]; } sum = sqrt(h*sum); cout << endl << "Factor de Normalizacion: " << sum << endl; /* Numro de Ciclos y Numero de Ciclos Maximo*/ 21 */

cout << "Iteraciones: " << istep << " de " << imax << endl; /* EigenValor, Error del EigenValor, f0 y f1*/ cout << "Eigenvalor: " << E << " Error: " << de << " fs " << f0 << " " << f1 << endl; // Normalizando la Funcion de Onda (y se muestrea) int wt = 0; float Pot[n], xbase[n], Onda[n]; cout << endl << " Rango de x Potencial V Funcion de Onda (Eigenfuncion)" << endl << endl; for(i = 0; i < n; i = i+m){ xl = xl0+i*h; ul[i] = ul[i]/sum; Onda[wt] = E + ul[i]; Pot[wt] = V1(xl); xbase[wt] = xl; cout << setw(10) << setprecision(7) << fixed << xbase[wt] << " " << Pot[wt] << " " << ul[wt] << endl; wt++; } cout << wt << endl; graficaFuncion(xbase,Onda,wt,500,500,"-"); graficaFuncion(xbase,Pot,wt,500,500,"-"); //GraficarPuntosenR(xbase, Pot, Onda, wt, "n4.m"); Eig = E; return f1; }// fin de Schrodinger

int main() { try{ int i, n = 501; float xi = -10, xf = 10, x, eig; float h = (xf-xi)/(n-1); float val, e[10]; float q[501]; for(i = 0; i < n; i++){ x = xi+i*h; q[i] = V1(x); } //graficaFuncion(q,n,500,500,"-"); 22

float min = minimo(q,n); float max = maximo(q,n); //cout << min << " " << max << endl; float it; i = 0; for(it = min; it <= max; it++){ val = SchrodingerMod(it-1,it,288,false, eig); if(fabs(val) < 0.1){ e[i] = eig; i++; } } cout << "Eigenvalores " << endl; for(int j = 0; j < i; j++){ cout << j << " " << e[j] << endl; } }catch(HelpMe h){ cout << "ERROR: " << h.getMessage() << endl; } system("pause"); }

23

5.

Bibligraf a

1. Jeery M. Cooper. Introduction to Partial Dierential Equations with MATLAB. Birkhauser. (1998) 2. Stephen Gasiorowicz. Quantum Physics. John Wiley and Sons, INC. (2003) 3. Rubin H Landau, Manuel Jose Paez. Computational Physics. John Wiley and Sons, INC. (1997) 4. Tao Pang. An Introduction to Computational Physics. Cambridge. (2006)

24

Das könnte Ihnen auch gefallen