Grupo5 - Eq. Schroedinger: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Eliseuvf (discussão | contribs)
Sem resumo de edição
Eliseuvf (discussão | contribs)
Sem resumo de edição
Linha 114: Linha 114:
*Numerical Resolution Of The Schrödinger Equation. Jorgensen L., Lopes Cardozo D., Thivierge E. http://web.pa.msu.edu/people/duxbury/courses/phy480/SchrodingerDynamics.pdf
*Numerical Resolution Of The Schrödinger Equation. Jorgensen L., Lopes Cardozo D., Thivierge E. http://web.pa.msu.edu/people/duxbury/courses/phy480/SchrodingerDynamics.pdf
*Sherer, Philipp O.J., Computational Physics simulation of Classical and Quantum Systems. Springer, 2010.
*Sherer, Philipp O.J., Computational Physics simulation of Classical and Quantum Systems. Springer, 2010.
*Born, Max. Nobel lecture: The statistical interpretation of quantum mechanics. 11 de Dezembro de 1954.
*Born, Max. Nobel lecture: The statistical interpretation of quantum mechanics. 11 de Dezembro de 1954. https://www.nobelprize.org/nobel_prizes/physics/laureates/1954/born-lecture.pdf

Edição das 02h38min de 24 de outubro de 2017

A evolução temporal do estado quântico Ψ(𝐫,t) é dada pela equação de Schrödinger, a qual é postulada como:

itΨ(𝐫,t)=[22m2+V(𝐫,t)]Ψ(𝐫,t)

Posto em unidades atômicas (onde me e são unitários), o caso unidimensional de um elétron num potencial independente do tempo reduz-se a:

tΨ(x,t)=[i22x2iV(x)]Ψ(x,t)


Método numérico

Buscando resolver a equação numericamente, tem-se a discretização de 2Ψx2 :

Ψj1n2Ψjn+Ψj+1n(Δx)2

e as discretizações de Ψt (explícita e implícita, respectivamente):

Ψjn+1ΨjnΔt,ΨjnΨjn1Δt

Tanto no método explícito quanto no método implícito não é conservada a norma do estado (o que é estritamente necessário, já que o estado pode ser interpretado como uma onda de probabilidade). Por esse motivo, utiliza-se o método de Crank-Nicolson, o qual tem essa propriedade \cite{enswork}.

O método de Crank-Nicolson consiste em uma média aritmética dos métodos explícito e implícito. Excetuando manipulações algébricas triviais, verifica-se que a relação de recorrência do método é dada por:

aΨj1n+1+bjΨjn+1+aΨj+1n+1=a*Ψj1n+bj*Ψjn+a*Ψj+1n,

onde

aiΔt4(Δx)2 e bj1+iΔt2[1(Δx)2+V(jΔx)].

A integração numérica depende, portanto, do potencial em que o elétron está sujeito, bem como da sua condição inicial e suas das condições de contorno.

Que condições podemos impor para a fronteira? Quando se trata do problema analiticamente, costuma-se considerar que a função de onda tende a zero no infinito. Numericamente, pode-se fazer uma transposição disso, criando uma condição para bordas em pontos suficientemente distantes do centro da distribuição da função de onda, igualando-as a zero. Outra forma de tratar o problema numericamente é criando condições de contorno periódicas, em que para as bordas vale Ψ0n=Ψjmaxn para todo n (ou, para as bordas a e b há a relação Ψ(a,t)=Ψ(b,t) para todo t).

Condições de contorno iguais a zero

Para as condições de contorno Ψ0n=ΨLn=0, a iteração reduz-se à equação matricial:

(b1a0000ab2a000000abL2a0000abL1)(Ψ1n+1Ψ2n+1ΨL2n+1ΨL1n+1)=(b1*a*0000a*b2*a*000000a*bL2*a*0000a*bL1*)(Ψ1nΨ2nΨL2nΨL1n)


Condições de contorno periódicas

De maneira semelhante, a iteração do caso das condições de contorno periódicas - Ψ0n=ΨLn - reduz-se à equação matricial:

(b0a000aab1a000000abL1aa000abL)(Ψ0n+1Ψ2n+1ΨL1n+1ΨLn+1)=(b0*a*000a*a*b1*a*000000a*bL1*a*a*000a*bL*)(Ψ0nΨ2nΨL1nΨLn)


Condição inicial

Já a condição inicial é arbitrária, pois define o estado inicial do sistema que queremos tratar. Fazendo uma referência ao tratamento de sistemas clássicos, seria como definir posição e momento iniciais. É claro que, para ter o sentido físico de uma função de onda, deve-se ter o cuidado de criar uma condição inicial normalizada, satisfazendo

|Ψ(x,0)|2dx=1

bastando, então, inseri-la no programa.

Implementação em C

Condição de contorno limitada


void CN(double complex *u, double complex *u_aux, double complex *u_next, double complex a)
{
	//Nomeia-se E a matriz da equação matricial que multiplica o estado evoluído no tempo.
	//Tem-se L, dx e dt definidos

	//u 		-- vetor de estado atual
	//u_aux		-- conj(E) * u 
	//u_next 	-- o novo estado

	//Esta função resolve resolve E * u_next = conj(E) * u

	int i;

	//atualização do vetor u_aux

	for(i = 1; i < L; i++) u_aux[i] = conj(a) * (u[i-1+] + u[i+1]) + conj(b(i)) * u[i];

	//para resolver E * u_next = u_aux, utiliza-se do Método de Thomas:

	double complex c_new[L+1], d_new[L+1];

	c_new[1] = a / b(1);
	for(i = 2; i < L; i++) c_new[i] = a / (b(i) - c_new[i-1] * a);

	d_new[1] = u_aux[1] / b(1);
	for(i = 2; i < L; i++) d_new[i] = (u_aux[i] - d_new[i-1] * a) / (b(i) - c_new[i-1] * a);

	u_next[0] = u_next[L] = 0;
	u_next[L-1] = d_new[L-1];
	for(i = L-2; i > 0; i --) u_next[i] = d_new[i] - c_new[i] * u_next[i+1];
	
	//atualiza-se o valor do estado: u = u_next

	for(i = 0; i <= L; i++) u[i] = u_next[i];
}


Referências