Procedimiento matricial de Numerov
Procedimiento matricial de Numerov
La ecuación de Schrödinger unidimensional independiente del tiempo para el potencial V(x) es
Denominaremos
Escribimos la ecuación de Schrödinger de la forma
Desarrollamos en serie la función Ψ(x)
donde δ es una cantidad pequeña. Sumamos y despejamos Ψ(2)(x)
Calculamos Ψ(4)(x) de forma similar
En estas dos últimas ecuaciones, sustituimos Ψ(2)(x) por f(x)Ψ(x), y Ψ(4)(x) por la expresión anterior
Denominamos
La ecuación anterior se escribe
Donde
Se transforma en
Ejemplo, sea N=4. Escribimos las ecuaciones para i=1,2,3,4
En forma matricial
En general
El procedimiento matricial de Numerov consiste en determinar los valores propios (energías) y vectores propios (funciones de onda) de la matriz, H=B-1A+V
Procedimiento
Hemos calculado los niveles de energía y representado las funciones de onda del potencial en forma de V
x=linspace(0,6,20); f=@(x) airy(0,-x); %función Ai(x) r1=raices(f,x); f=@(x) airy(1,-x); %derivada de Ai(x) r2=raices(f,x); En=sort([r1,r2]); hold on line([0,-6],[0,6], 'color','r', 'lineWidth',1.5) line([0,6],[0,6], 'color','r', 'lineWidth',1.5) n=3; f=@(x) airy(x-En(n)).^2; c=1/sqrt(2*integral(f,0,50)); %por simetría line([-8,8],[En(n),En(n)],'color','k') g=@(x) c*airy(x-En(n)); x=linspace(0,8,100); y=g(x); if rem(n,2)==1 %si es par i=1,3,5 yy=[fliplr(y)+En(n),y+En(n)]; else %si es impar yy=[-fliplr(y)+En(n),y+En(n)]; end plot([-fliplr(x),x],yy) plot(En(n),En(n),'bo','markersize',4,'markerfacecolor','b') plot(-En(n),En(n),'bo','markersize',4,'markerfacecolor','b') text(6.5,En(n)+0.2,sprintf('%1.3f',En(n))) ylim([0,7]) grid on xlabel('x') ylabel('\Psi(x)') title('Potencial V')
Para un nivel de energía En (línea horizontal de color negro) hay dos puntos de intersección con la función potencial V(x) (puntos de color rojo). Cuando nos alejamos hacia la izquierda y hacia la derecha de dichos puntos, la función de onda (en azul) decrece rápidamente a cero

Sea el potencial V(x) de la figura. Se establece una energía máxima Em. Se calculan las abscisas z1 y z2 de los puntos de intersección V(x)=Em, Cuando el potencial es simétrico z1=-z2.
Se establecen un márgen a la izquierda y a la derecha de dichos puntos
Supondremos que la función de onda es nula en x0 y xN+1, lo que equivale a resolver la ecuación Schrödinger en el potencial
Se ha situado el potencial V(x) dentro de un pozo de potencial de altura infinita
El mínimo valor de la longitud de onda de de Broglie es
Estableceremos como espaciado entre puntos, δ=λ
Si el potencial es simétrico, dejamos márgenes iguales de 4πδ, si no es simétrico se pueden dejar márgenes distintos, mayor a la derecha que a la izquierda como se muestra en la figura
Potencial en forma de V
En la página titulada, Potencial en forma de V. Función de Airy hemos obtenido los niveles de energía y representado las funciones de onda para un potencial mg|x|.
Niveles de energía
Exactos
Los niveles de energía E'=αE son las raíces de la función de Airy Ai o de su derivada. La constante α es
Establecemos un sistema de unidades en el que las constantes ℏ, m, g valen la unidad, entonces,
Los primeros niveles de energía E=E'/α son
x=linspace(0,25,100); f=@(x) airy(0,-x); %función Ai(x) r1=raices(f,x); f=@(x) airy(1,-x); %derivada de Ai(x) r2=raices(f,x); alfa=2^(1/3); En=sort([r1,r2])/alfa;
>> En(1:4) ans = 0.8086 1.8558 2.5781 3.2446 >> En(10) ans = 6.3053 >> En(20) ans = 10.1822 >> En(50) ans = 18.9469
Aproximados
Establecemos una energía máxima Em. Las abscisas de los puntos de intersección V(x)=Em son, ±z1=±Em. Establecemos además, un margen a la izquerda y derecha de 4πδ
El número de puntos es el entero más próximo a
Se crean las matrices A, B y Ep con el comando
Em=20; %energía máxima h=1/sqrt(2*Em); %paso z1=Em; %abscida punto de intersección N=round(2*(z1/h+4*pi)); %número de puntos xx=-h*N/2+h/2:h:h*N/2-h/2;%abscisas; %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial f=@(x) abs(x); %función potencial Ep=diag(f(xx)); %matriz H H=-inv(B)*A/2+Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V En=sort(diag(D)); %ordena los valores propios de menor a mayor
>> En(1:4) ans = 0.8099 1.8557 2.5785 3.2445 >> En(10) ans = 6.3049 >> En(20) ans = 10.1806 >> En(50) ans = 18.9364
Comparación
Los valores exactos y aproximados de los niveles de energía n=1,2,3,4,10,20,50, se recogen en la tabla
n=1 | 2 | 3 | 4 | 10 | 20 | 50 | |
---|---|---|---|---|---|---|---|
Exactos | 0.8086 | 1.8558 | 2.5781 | 3.2446 | 6.3053 | 10.1822 | 18.9469 |
Aproximados | 0.8099 | 1.8557 | 2.5785 | 3.2445 | 6.3049 | 10.1806 | 18.9364 |
Función de onda
Exacta
La función de onda para un nivel de energía En es
El coeficiente C se calcula de modo que
Aproximada
La función de onda correpondiente al valor popio En es proporcional al vector propio (columna) n. Utilizamos la función
Los valores propios de la matriz H aparecen desordendos y hay que ordenarlos de menor a mayor, creamos una función denominada
Representamos la función de onda correspondiente al nivel de energía n=50, mediante una curva continua y el vector propio correspondiente al valor popio En mediante puntos de color rojo
function numerov_2 %exacto x=linspace(0,25,100); f=@(x) airy(0,-x); %función Ai(x) r1=raices(f,x); f=@(x) airy(1,-x); %derivada de Ai(x) r2=raices(f,x); alfa=2^(1/3); E=sort([r1,r2])/alfa; n=50; %nivel de energía (cambiar) f=@(x) airy(alfa*(x-E(n))).^2; c=1/sqrt(2*integral(f,0,50)); %por simetría g=@(x) airy(alfa*(x-E(n)))*c; x=linspace(0,25,400); y=g(x); if rem(n,2)==1 %si es par i=1,3,5 yy=[fliplr(y),y]; else %si es impar yy=[-fliplr(y),y]; end hold on plot([-fliplr(x),x],yy) %aproximado Em=20; %energía máxima h=1/sqrt(2*Em); %paso z1=Em; %abscida punto de intersección, Em=V(x) N=round(2*(z1/h+4*pi)); %número de puntos xx=-h*N/2+h/2:h:h*N/2-h/2;%abscisas; %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial V f=@(x) abs(x); %función potencial Ep=diag(f(xx)); %matriz H H=-inv(B)*A/2 + Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V [En,F]=ordenar(diag(D),V); c=1/sqrt(trapz(xx, F(:,n).^2)); plot(xx,-F(:,n)*c,'ro','markersize',2,'markerfacecolor','r') text(-24, 0.1,num2str(En(n)),'VerticalAlignment','bottom', 'HorizontalAlignment','left'); hold off grid on xlabel('x') ylabel('\Psi(x)') title('Función de onda') function [x,M]=ordenar(x,M) m=length(x); for i=1:m for j=i+1:m if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; w=M(:,j); M(:,j)=M(:,i); M(:,i)=w; end end end end end
La representación gráfica (en azul) de la función de onda correspondiente al nivel (valor propio) n=50, cuya energía se muestra a la izquierda, junto al vector propio (puntos de color rojo) correspondiente, es un ejemplo de la exactitud del procedimiento numérico de Numerov.
Para ciertos valores de n es necesario cambiar el signo del vector propio
El oscilador armónico cuántico
En la página titulada, El oscilador armónico cuántico hemos obtenido los niveles de energía y representado las funciones de onda para un potencial
Tomando una escala de energías y distancias de la forma
La ecuación de Schrödinger se transforma en otra más simple
Exactos
Los niveles de energía son
La función de onda correspondiente al nivel de energía n es
Aproximados
Establecemos una energía máxima Em. Las abscisas de los puntos de intersección V(x)=Em son . Establecemos además, un margen a la izquerda y derecha de 4πδ
El número de puntos es el entero más próximo a
Se crean las matrices A, B y Ep con el comando
Los vectores y matrices en MATLAB comienzan con el índice i=1. El nivel de energía n, se corresponde con el índice n+1 en el cálculo aproximado mediante el procedimiento de Numerov
Representamos la función de onda correspondiente al nivel de energía n=10, mediante una curva continua y el vector propio correspondiente al valor popio εn mediante puntos de color rojo
function numerov_1 Em=20; %energía máxima h=1/sqrt(2*Em); %paso z1=sqrt(2*Em); %abscida punto de intersección, Em=V(x) N=round(2*(z1/h+4*pi)); %número de puntos x=-h*N/2+h/2:h:h*N/2-h/2;%abscisas; %exacto n=10; %nivel de energía (cambiar) y=hermiteH(n,x).*exp(-x.^2/2)/sqrt(2^n*sqrt(pi)*factorial(n)); hold on plot(x,y) %aproximado %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial V f=@(x) x.^2/2; %función potencial Ep=diag(f(x)); %matriz H H=-inv(B)*A/2+Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V [En,F]=ordenar(diag(D),V); c=1/sqrt(trapz(x, F(:,n+1).^2)); plot(x,-F(:,n+1)*c,'ro','markersize',2,'markerfacecolor','r') text(-9, 0.1,num2str(En(n+1)),'VerticalAlignment','bottom', 'HorizontalAlignment','left'); hold off grid on xlabel('x') ylabel('\Psi(x)') title('Función de onda') function [x,M]=ordenar(x,M) m=length(x); for i=1:m for j=i+1:m if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; w=M(:,j); M(:,j)=M(:,i); M(:,i)=w; end end end end end
Para n=10, el valor exacto de la energía es εn=10+1/2=10.5. El valor aproximado que obtenemos, mediante el procedimiento matricial de Numerov, es 10.4961
Para ciertos valores de n es necesario cambiar el signo del vector propio
Otros potenciales
En este apartado, calculamos los niveles de energía y representamos las funciones de onda para el potencial
Establecemos un sistema de unidades en el que ℏ=m=1
Representamos el potencial para a=1, b=-4.9497, para tres valores de α=2, 3, 4
a=1; b=-4.9497; hold on for alfa=2:4 fplot(@(x) a*x.^(2*alfa)+b*x.^2,[-3,3],'displayName',num2str(alfa)) end hold off ylim([-10,15]) grid on legend('-DynamicLegend','location','best') xlabel('x') ylabel('V(x)') title('Potencial')
Aplicamos el procedimiento matricial de Numerov para el caso α=3
function numerov_7 alfa=3; a=1; b=-4.9497; Em=20; %energía máxima raices=roots([1,0,0,0,b,0,-Em]); %intersección Em=V(x) z1=-raices(1); h=1/sqrt(2*Em); %paso N=round(2*(z1/h+4*pi)); %número de puntos x=-h*N/2+h/2:h:h*N/2-h/2;%abscisas; %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial V f=@(x) a*x.^(2*alfa)+b*x.^2; %función potencial Ep=diag(f(x)); %matriz H H=-inv(B)*A/2+Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V [En,F]=ordenar(diag(D),V); fplot(@(x) a*x.^(2*alfa)+b*x.^2,[-3,3]) %energía potencial for k=1:7 %niveles de energía raices=roots([1,0,0,0,b,0,-En(k)]); for m=1:length(raices) if isreal(raices(m)) z1=real(raices(m)); break; end end line([-z1,z1],[En(k),En(k)],'color','r') end grid on ylim([-5,15]) xlabel('x') ylabel('E_n') title('Niveles de energía') disp(En(1:10)) %funciones de onda figure hold on for n=1:3 c=1/sqrt(trapz(x, F(:,n).^2)); plot(x,F(:,n)*c,'-o','markersize',2,'markerfacecolor','r', 'displayName',num2str(n)) end hold off xlim([-2.5,2.5]) grid on legend('-DynamicLegend','location','best') xlabel('x') ylabel('\Psi(x)') title('Función de onda') function [x,M]=ordenar(x,M) m=length(x); for i=1:m for j=i+1:m if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; w=M(:,j); M(:,j)=M(:,i); M(:,i)=w; end end end end end
Se comparan los niveles de energía calculados mediante este script (1), con los que aparecen en la Tabla I (2) del segundo artículo mencionado en las referencias
n | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
(1) | -1.6821 | -1.3473 | 1.6807 | 4.2761 | 7.7245 | 11.6998 |
(2) | -1.6815 | -1.3475 | 1.6815 | 4.2795 | 7.7355 | 11.7255 |
Las funciones de onda correspondientes a los tres primeros niveles de energía son
Cambiamos el valor del coeficiente b=-10.6066 manteniendo el valor de α=3
function numerov_8 alfa=3; a=1; b=-10.6066; Em=20; raices=roots([1,0,0,0,b,0,-Em]); %intersección Em=V(x) z1=-raices(1); h=1/sqrt(2*Em); %paso N=round(2*(z1/h+4*pi)); %número de puntos x=-h*N/2+h/2:h:h*N/2-h/2;%abscisas; %aproximado %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial V f=@(x) a*x.^(2*alfa)+b*x.^2; %energía potencial Ep=diag(f(x)); %matriz H H=-inv(B)*A/2+Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V [En,F]=ordenar(diag(D),V); fplot(@(x) a*x.^(2*alfa)+b*x.^2,[-3,3]) for k=1:8 raices=roots([1,0,0,0,b,0,-En(k)]); for m=1:length(raices) if isreal(raices(m)) z1=real(raices(m)); break; end end line([-z1,z1],[En(k),En(k)],'color','r') end grid on ylim([-15,15]) xlabel('x') ylabel('E_n') title('Niveles de energía') disp(En(1:10)) %funciones de onda figure hold on for n=1:3 c=1/sqrt(trapz(x, F(:,n).^2)); plot(x,F(:,n)*c,'-o','markersize',2,'markerfacecolor','r' ,'displayName',num2str(n)) end hold off xlim([-2.5,2.5]) grid on legend('-DynamicLegend','location','best') xlabel('x') ylabel('\Psi(x)') title('Función de onda') function [x,M]=ordenar(x,M) m=length(x); for i=1:m for j=i+1:m if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; w=M(:,j); M(:,j)=M(:,i); M(:,i)=w; end end end end end
Se comparan los niveles de energía calculados mediante este script (1), con los que aparecen en la Tabla II (2) del segundo artículo mencionado en las referencias
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
(1) | -8.9668 | -8.9615 | -2.1213 | -1.6321 | 2.1061 | 5.0461 | 8.9177 | 13.2429 |
(2) | -8.9655 | -8.9605 | -2.1165 | -1.6265 | 2.1165 | 5.0695 | 8.9655 | 13.3315 |
Las funciones de onda correspondientes a los tres primeros niveles de energía son
El lector puede cambiar el parámetro α a los valores 1 y 4 y observar los resultados, comparándolos con los de la tabla I (b=-4.9497) y la tabla II (b=-10.6066) del segundo artículo mencionado en las referencias
El potencial Morse
En la página titulada Potencial de Morse y potencial de Pöschl–Teller, hemos calculado los niveles de energía y las funciones de onda de una molécula de CO. Los datos son
- Masa del Carbono, 12.0115, amu
- Masa del Oxígeno, 15.994, amu
- Parámetro D=10.970, eV
- Parámetro α=2.325, Å-1
La masa reducida m=m1·m2/(m1+m2)=6.8608 amu
Los puntos de intersección de la recta y=E y la función potencial y=Dexp(-2αx)-2Dexp(-αx) se han calculado en la página titulada el El potencial de Morse
D=10.970; %eV alfa=2.325; %A^-1 mC=12.0115; %amu f=@(x) D*exp(-2*alfa*x)-2*D*exp(-alfa*x); %en eV fplot(f,[-0.35,3]) E=-4; hold on line([-0.35,3],[E,E]) x1=-log(1+sqrt((E+D)/D))/alfa; x2=-log(1-sqrt((E+D)/D))/alfa; plot(x1,f(x1),'ro','markersize',3,'markerfacecolor','r') plot(x2,f(x2),'ro','markersize',3,'markerfacecolor','r') hold off grid on xlabel('x') ylabel('V(x)') title('Potencial V(x)')
Aplicamos el procedimiento Numerov, comparando la solución analítica y numérica
Expresamos el potencial V(x) en eV y la energía E en eV
function numerov D=10.970; %eV alfa=2.325; %A^-1 mC=12.0115; %amu mO=15.9994; mu=mO*mC*1.6604e-27/(mO+mC); %masa reducida, en kg f=@(x) D*exp(-2*alfa*x)-2*D*exp(-alfa*x); %potencial en eV lambda=sqrt(2*mu*D*1.6e-19)/(alfa*1e10*1.0545e-34); n=2; %numero de nivel (cambiar) %solución analítica E=(-D*1.6e-19+alfa*1e10*1.0545e-34*sqrt(2*D*1.6e-19/mu)*(n+1/2)- (alfa*1e10*1.0545e-34)^2*(n+1/2).^2/(2*mu))/1.6e-19; %en eV z1=-log(1+sqrt((E+D)/D))/alfa; z2=-log(1-sqrt((E+D)/D))/alfa; hold on text(2*z2, 0,num2str(E),'VerticalAlignment','bottom', 'HorizontalAlignment', 'right'); g=@(x) fOnda(n,x).^2; c2=integral(g,3*z1,5*z2); x=linspace(2*z1,2*z2,200); y=fOnda(n,x)/sqrt(c2); %normaliza plot(x,y) %procedimiento numérico matricial de Numerov Em=-6; %energía máxima z1=-log(1+sqrt((Em+D)/D))/alfa; z2=-log(1-sqrt((Em+D)/D))/alfa; %paso en A, h=6.6256e-34 Js, 1eV=1.6021e-19 J h=6.6256e-34*1e10/sqrt(2*mu*D*1.6e-19)/10; xx=z1-4*pi*h:h:z2+4*pi*h;%abscisas; N=length(xx); constante=1.0545e-34^2/(2*mu*1e-10^2*1.6e-19); %en eV/A^2 %matriz B B=diag(10*ones(1,N)/12)+diag(ones(1,N-1)/12,1)+diag(ones(1,N-1)/12,-1); %matriz A A=diag(-2*ones(1,N)/h^2)+diag(ones(1,N-1)/h^2,1)+diag(ones(1,N-1)/h^2,-1); %matriz potencial V Ep=diag(f(xx)); %matriz H H=-constante*inv(B)*A+Ep; [V,D]=eig(H); % valores propios, matriz D. Vectores propios, matriz V [En,F]=ordenar(diag(D),V); disp(En(1:6)) c2=1/sqrt(trapz(xx, F(:,n+1).^2)); plot(xx,-F(:,n+1)*c2,'ro','markersize',2,'markerfacecolor','r') text(z1, 0.1,num2str(En(n+1)),'VerticalAlignment','bottom', 'HorizontalAlignment','left'); hold off grid on xlabel('x') ylabel('\Psi(x)') title('Función de onda') function res=fOnda(n,x) m=round(2*lambda-2*n-1); z=2*lambda*exp(-alfa*x); res=exp(-z/2).*z.^(lambda-n-1/2).*laguerreL(n,m,z); end function [x,M]=ordenar(x,M) m=length(x); for i=1:m for j=i+1:m if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; w=M(:,j); M(:,j)=M(:,i); M(:,i)=w; end end end end end
Los niveles de energía exactos y aproximados casi coinciden
n | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
En (eV), exactos | -10.8359 | -10.5702 | -10.3078 | -10.0487 | -9.7929 | -9.5404 |
En (eV), aprox. | -10.8359 | -10.5702 | -10.3078 | -10.0487 | -9.7929 | -9.5404 |
Se cambia el número de nivel n=0,1,2,3,... en la línea de código
Para n=2
Para n=5
A la izquerda, el valor exacto de la energía del nivel seleccionado, En; a la derecha, el valor aproximado
Como podemos apreciar, el procedimiento numérico matricial de Numerov reproduce los cálculos analíticos.
Referencias
Mohandas Pillai, Joshua Goglio, Thad G. Walker. Matrix Numerov method for solving Schrödinger’s equation. Am. J. Phys. 80 (11), November 2012. pp. 1017-1019
N. Al Sdran, F. Maiz. Airy function approach and Numerov method to study the anharmonic oscillator potential V(x)=Ax2α+Bx2. AIP Advances 6, 065323 (2016); https://doi.org/10.1063/1.4954923