Equação de Dirac: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
Linha 521: Linha 521:
Para todos os casos utilizou-se uma condição inicial de um pacote gaussiano de desvio padrão <math>\sigma</math> sob uma das componentes de <math>\mathbf{\Phi}</math> e outra nula, o quadrado deste deve ter área unitária dentro da malha utilizada, por isso a constante de normalização deve ser <math>\frac{1}{\sqrt{\sigma\sqrt{\pi}}}</math>.  
Para todos os casos utilizou-se uma condição inicial de um pacote gaussiano de desvio padrão <math>\sigma</math> sob uma das componentes de <math>\mathbf{\Phi}</math> e outra nula, o quadrado deste deve ter área unitária dentro da malha utilizada, por isso a constante de normalização deve ser <math>\frac{1}{\sqrt{\sigma\sqrt{\pi}}}</math>.  


Segue trecho do código comum a todos as simulações realizadas:
Segue trecho do código comum a todos as simulações realizadas, a única diferença é que em um caso do OHS o pacote gaussiano é deslocado do meio da malha para a posição<math>x=18</math>:


<br />
<source lang="julia">
using Plots
using LaTeXStrings
using LinearAlgebra
using Integrals
function init(x, sigma)
arg1 = @. ((-(x-25)^2)/(2*sigma^2))
arg2 = 1/sqrt(sqrt(pi)*sigma)
return arg2*exp.(arg1) ##Inicializo com um pacote gaussiano
end
function OHS(V,x, k)
V = @. 0.5*k*(x-25)^2
return V
end
function poco(V, h)
#Quero colocar nas posições 18 e 32
V[round(Int64, 18/h)] = 100000
V[round(Int64, 32/h)] = 100000
return V
end
##Matrizes do método de Crank-Nicholson
function matriz(dt,h,L, V)
A = Diagonal(ones(L).*(1 .+ im*dt*0.5.*(V.+1))) 
B = LinearAlgebra.Tridiagonal(ones(L-1).*(-dt/(4*h)), zeros(L), ones(L-1).*(dt/(4*h)))
C = Diagonal(ones(L).*(1 .+ im*dt*0.5.*(V.-1)))
A = Array(A)
B = Array(B)
C = Array(C)
A_i = inv(A)
B_i = inv(B)
C_i = inv(C)
AiB = A_i*B
CiB = C_i*B
D = B_i*conj(A) + CiB
E = I(L) + C_i*conj(C)
F = B_i*A -CiB
G = A_i*conj(A) + I(L)
H = AiB + B_i*conj(C)
J = AiB - B_i*conj(C)
F_i = inv(F)
J_i = inv(J)
K = F_i*D
L = F_i*E
M = J_i*G
N = J_i*H
return K, L, M, N
end
function CN(size, h, tsize, V, dt, ci)
f = zeros(Complex, tsize, size) #Cada linha representa vetor posição em um tempo diferente. ## phi 1
g = zeros(Complex, tsize, size) ##phi 4
A, B, C, D = matriz(dt, h, size, V) #Matrizes do método Crank-Nicholson
f[1, :] = ci ##Condição Inicial
g[1, :] = zeros(size)
##Condições de Contorno
f[:, 1] = zeros(tsize)
f[:, end] = zeros(tsize)
g[:, 1] = zeros(tsize)
g[:, end] = zeros(tsize)
i=2 #Não interfiro nos contornos
while i<tsize
f[i, :] = A*f[i-1, :] - B*g[i-1, :]
g[i, :] = C*f[i-1, :] - D*g[i-1, :]
i+=1
end
return f, g
end
</source><br />
=Partícula Livre=
Aplicou-se o código demonstrado com potencial nulo para simular o caso da partícula livre, segue abaixo código utilizado para gerar a animação:


[[Arquivo:Diracfree.gif]]
[[Arquivo:Diracfree.gif]]


Segue abaixo o código utilizado
<br />
<source lang="julia">
 
function main()
 
L = 50 #Dimensão espacial matriz
k=0.1 #"Constante Elástica" do oscilador harmônico
sigma = 1 #Largura do pacote gaussiano
dt = 0.02
size= 10*L
h = L/size ##Passo espacial
tmax = 15
tsize = round(Int64, tmax/dt) #Tamanho do vetor tempo
t = LinRange(0, tmax, tsize)
x = LinRange(0, L, size)
V = zeros(size)
 
xi = init(LinRange(0, L, size), sigma) #Condição inicial pacote gaussiano
 


<br />
f,g =CN(size,h,tsize, V, dt,xi)
<source>
 
i=1
anim = @animate while i<=tsize
f_real = real(f[i, :])
f_imag = imag(f[i, :])
g_real = real(g[i, :])
g_imag = imag(g[i, :])
probf = abs2.(f[i, :])
probg = abs2.(g[i, :])
prob = probf + probg
 
p=plot(x, probf, label=L"$|\phi_1|^2$", legendfont=font(15))
plot!(x, probg, label=L"$|\phi_4|^2$", legendfont=font(15))
titulo = "Partícula Livre"*", "*L"$\sigma=$"*string(sigma)*", "* L"$dt=$"*string(dt)* ", " *L"$t=$" * string(round(t[i], digits=3))
plot!(title=titulo,
xlabel = "x",
xlim=(0,50),
xticksfont = font(13),
ticksfontsize = 10,
ylim=(0,1),
yticksfont=font(13),
)
 
i+=1
end
arquivo = "diracfree.gif"
gif(anim, arquivo, fps=30)
 
end
 
main()


</source><br />
</source><br />


=Referências=
=Referências=

Edição das 17h54min de 4 de maio de 2024

Grupo: André Luis Della Valentina, Lucas dos Santos Assmann, Vinícius Bayne Müller

Introdução

A equação de Dirac descreve uma partícula relativística de spin , como o elétron, com estrutura análoga a da equação de Schrödinger. Ela surgiu inicialmente como tentativa de explicar discrepâncias entre experimentos e teoria para o espectro do átomo de hidrogênio, possibilitando correções para o cálculo da energia do elétron em diferentes níveis (as chamadas correções de estrutura fina). Além disso, por meio dela foi possível prever a existência de antimatéria: descrevendo o elétron, ela também descreve o pósitron.

A fim de compatibilizar a Mecânica Quântica com a Relatividade Especial, a equação diferencial parcial é de primeira ordem tanto no tempo quanto no espaço (diferentemente da equação de Schrödinger, que é de segunda ordem no espaço). A equação de Dirac pode ser escrita de diversas formas; aqui, apresentamo-la explicitamente como um sistema de EDPs acopladas, mais conveniente para os propósitos do trabalho.

Assim como a equação de Schrödinger, a construção da equação de Dirac vem a partir do operador Hamiltoniano, que descreve a evolução temporal do estado quântico em questão:

onde, como anteriormente, os autovalores de correspondem aos valores possíveis de energia que o sistema pode assumir.

A mudança com relação à Mecânica Quântica não relativística acontece quando consideramos a energia relativística da partícula:

Assim, o Hamiltoniano é modificado para representar a medida da energia relativística total.

Diferentemente da equação de Schrödinger, aqui não representa apenas uma função de onda, mas sim um conjunto de quatro delas. Usando a notação

,

as componentes de representam as funções de onda associadas ao elétron e ao pósitron: () representa a função de onda do elétron com spin up (down), e () representa a função de onda do pósitron com spin up (down). O objeto é chamado de spinor.

Dedução da equação de Dirac em uma e duas dimensões

Consideraremos neste trabalho a equação de Dirac em uma e duas dimensões, e . A escolha dessas coordenadas se dá pela conveniência do acoplamento das EDPs: nesse caso, as quatro equações acopladas passam a ser acopladas duas a duas, facilitando o estudo do sistema.

Construção do Hamiltoniano completo

Consideremos uma partícula sob ação de um potencial (onde ), que afeta a energia potencial da partícula, e de um potencial "escalar" , que afeta a massa de repouso da mesma. Seguindo uma das propostas possíveis para o Hamiltoniano, temos

onde ; e são matrizes 4x4 adimensionais e é o vetor momento linear da partícula.

Pode-se mostrar que e devem satisfazer certos vínculos, limitando as escolhas possíveis para essas matrizes. A escolha mais simples e usualmente adotada consiste em tomar

Sendo , podemos escrever o produto escalar como

Portanto, em notação matricial o Hamiltoniano pode ser escrito como

Unidades naturais e redução para duas dimensões

A fim de simplificar o formalismo, adotamos as chamadas "unidades naturais", onde . Note que isso equivale a reescalar as quantidades físicas do problema por um fator adequado. Ao fazer , também assumimos que a partícula está no limite relativístico.

Além disso, queremos estudar o problema em duas dimensões. Observamos que ; logo, . Portanto, temos o Hamiltoniano simplificado

Forma explícita final

Retornando ao problema original, queremos resolver

Novamente utilizando a notação matricial, obtemos

Realizando a multiplicação matricial, pode-se ver que se obtém dois sistemas acoplados: com e com . Escolhendo o sistema de com :


Simplificando e isolando a derivada temporal, obtemos por fim

Por fim, a equação em uma dimensão () é facilmente obtida: basta fazer

Discretização

A equação de Dirac 1D pode ser escrita, na forma matricial, como

onde e é matriz identidade de dimensão 2. As matrizes de Pauli são escritas, aqui, como e .

Para discretizar uma equação diferencial parcial como essa, é necessário discretizar o espaço e o tempo. Convenciona-se como um passo finito de tempo e como um passo finito no espaço, de tal forma que , onde são números inteiros. Define-se a notação e também . Discretiza-se as derivadas parciais explicitamente com uma expansão em série de taylor da própria função:

Considerando uma derivada discretizada e truncando na primeira ordem:

O processo é completamente análogo para a derivada espacial, porém para facilitar a aplicação do método mantém-se o espaço centrado em , em outras palavras faz-se uma expansão em torno de , obtendo:

Com isso, obtém-se uma equação para um método explícito no tempo da equação de Dirac 1D.

Pode-se também desenvolver um método implícito no tempo fazendo a expansão de em torno de , obtendo:

Ao aplicar esta aproximação na equação discretizada basta dar um passo a frente em todos os elementos, obtendo um método implícito no tempo, já que há dependência com .

Método de Crank-Nicolson

O método de Crank-Nicolson (CN) consiste em uma média entre um método explícito e outro implícito no espaço. Utilizar-se-á a notação para representar justamente a média entre ambos os métodos, ou seja:

Define-se a notação:

Dessa maneira, enuncia-se o método CN para a equação de Dirac 1D como:

,

onde são as discretizações explícitas das derivadas.


Para que seja possível aplicar e estudar o método, é necessário passar da notação matricial para escalar:


Isolando cada tempo em um lado da igualdade:


Abrindo as matrizes e e operando-as sobre o vetor na equação, tem-se:


Pode-se realizar as operações matriciais e escrever duas equações escalares. Para facilitar a notação, utiliza-se e :


Tem-se então um número de equações onde é o número de elementos do espaço discretizado. Portanto o primeiro termo das duas equações gera uma matriz diagonal, pois multiplica os termos espaciais dependentes de ; já o segundo termo gera uma matriz tridiagonal com diagonal principal nula. Nota-se que os primeiros termos dos dois lados da igualdade são o conjugado um do outro: define-se, portanto, e .


Considerando que o potencial é só função da posição, escreve-se o método como:

,

onde

.


Por fim, pode-se escrever o método resolvendo o sistema

,

onde , , , , e .


Com isso, e com condições iniciais e de contorno bem estabelecidas, já é possível aplicar o método, dado que todas essas matrizes dependem somente dos parâmetros do sistema.

Estabilidade Crank-Nicolson

Utilizar-se-á o método de von Neumann para analisar a estabilidade do método de Crank-Nicolson para a equação de Dirac unidimensional. Para tanto, supõe-se que a função pode ser dada pela série de Fourier

Devido à independência linear de cada termo do somatório, ao substituir na equação do método haverá uma equação para cada ente do somatório. Se , então pode-se dizer que o método estável, já que dessa forma garante-se uma não divergência.

Aplica-se um termo geral da série de índice no método CN para a equação de Dirac 1D:

Divide-se tudo por e isola-se :

Nota-se que os termos que multiplicam o fator são o conjugado um do outro. Define-se como a componente l escalarda multiplicação da matriz pelo vetor :

,

onde é sempre diferente de zero, visto que a parte real é dada por uma matriz identidade constante.

Mostra-se, portanto, que a razão entre os coeficientes da série de Fourier nunca diverge, ou seja, o método é incondicionalmente estável.

Simulações em Julia

Fez-se simulações do método de Crank-Nicholson para a equação de Dirac unidimensional em três configurações de potenciais diferentes: Nulo (Partícula Livre), Poço Infinito, Oscilador Harmônico Simples. Para todos os casos utilizou-se uma condição inicial de um pacote gaussiano de desvio padrão sob uma das componentes de e outra nula, o quadrado deste deve ter área unitária dentro da malha utilizada, por isso a constante de normalização deve ser .

Segue trecho do código comum a todos as simulações realizadas, a única diferença é que em um caso do OHS o pacote gaussiano é deslocado do meio da malha para a posição:


using Plots
using LaTeXStrings
using LinearAlgebra
using Integrals

function init(x, sigma)
	arg1 = @. ((-(x-25)^2)/(2*sigma^2))
	arg2 = 1/sqrt(sqrt(pi)*sigma)
	return arg2*exp.(arg1) ##Inicializo com um pacote gaussiano
end

function OHS(V,x, k)
	V = @. 0.5*k*(x-25)^2
	return V

end

function poco(V, h)
	
	#Quero colocar nas posições 18 e 32
	V[round(Int64, 18/h)] = 100000
	V[round(Int64, 32/h)] = 100000
	
	return V
end

##Matrizes do método de Crank-Nicholson

function matriz(dt,h,L, V)

	A = Diagonal(ones(L).*(1 .+ im*dt*0.5.*(V.+1)))  
	B = LinearAlgebra.Tridiagonal(ones(L-1).*(-dt/(4*h)), zeros(L), ones(L-1).*(dt/(4*h)))
	C = Diagonal(ones(L).*(1 .+ im*dt*0.5.*(V.-1)))
	
	A = Array(A)
	B = Array(B)
	C = Array(C)
	
	A_i = inv(A) 
	B_i = inv(B)
	C_i = inv(C)
	AiB = A_i*B
	CiB = C_i*B
	
	
	D = B_i*conj(A) + CiB
	E = I(L) + C_i*conj(C)
	F = B_i*A -CiB
	G = A_i*conj(A) + I(L)
	H = AiB + B_i*conj(C)
	J = AiB - B_i*conj(C)
	
	F_i = inv(F)
	J_i = inv(J)
	
	K = F_i*D
	L = F_i*E
	
	M = J_i*G
	N = J_i*H
	
	return K, L, M, N

end

function CN(size, h, tsize, V, dt, ci)

	f = zeros(Complex, tsize, size) #Cada linha representa vetor posição em um tempo diferente. ## phi 1
	g = zeros(Complex, tsize, size) ##phi 4
	
	A, B, C, D = matriz(dt, h, size, V) #Matrizes do método Crank-Nicholson
	
	f[1, :] = ci ##Condição Inicial
	g[1, :] = zeros(size)
	
	##Condições de Contorno
	f[:, 1] = zeros(tsize)
	f[:, end] = zeros(tsize)
	
	g[:, 1] = zeros(tsize)
	g[:, end] = zeros(tsize)
	
	i=2 #Não interfiro nos contornos
	while i<tsize
		
		f[i, :] = A*f[i-1, :] - B*g[i-1, :]
		g[i, :] = C*f[i-1, :] - D*g[i-1, :]
		i+=1
		
	end
	return f, g
end


Partícula Livre

Aplicou-se o código demonstrado com potencial nulo para simular o caso da partícula livre, segue abaixo código utilizado para gerar a animação:

Diracfree.gif


function main()

	
	L = 50 #Dimensão espacial matriz
	k=0.1 #"Constante Elástica" do oscilador harmônico
	sigma = 1 #Largura do pacote gaussiano
	dt = 0.02
	size= 10*L
	h = L/size ##Passo espacial
	tmax = 15
	tsize = round(Int64, tmax/dt) #Tamanho do vetor tempo
	
	t = LinRange(0, tmax, tsize)
	x = LinRange(0, L, size)
	V = zeros(size)

	xi = init(LinRange(0, L, size), sigma) #Condição inicial pacote gaussiano


	f,g =CN(size,h,tsize, V, dt,xi)

	
	i=1
	anim = @animate while i<=tsize
		f_real = real(f[i, :])
		f_imag = imag(f[i, :])
		g_real = real(g[i, :])
		g_imag = imag(g[i, :])
		probf = abs2.(f[i, :])
		probg = abs2.(g[i, :])
		prob = probf + probg
		

		p=plot(x, probf, label=L"$|\phi_1|^2$", legendfont=font(15))
		plot!(x, probg, label=L"$|\phi_4|^2$", legendfont=font(15))
		titulo = "Partícula Livre"*", "*L"$\sigma=$"*string(sigma)*", "* L"$dt=$"*string(dt)* ", " *L"$t=$" * string(round(t[i], digits=3))
		plot!(title=titulo, 
		xlabel = "x", 
		xlim=(0,50),
		xticksfont = font(13),
		ticksfontsize = 10,
		ylim=(0,1),
		yticksfont=font(13),
		)

		i+=1
	end
	
	arquivo = "diracfree.gif"
	gif(anim, arquivo, fps=30)

end

main()



Referências

  1. The quantum theory of the electron. Proceedings of the Royal Society of London A, v. 117, n. 778, p. 610–624, fev. 1928.
  2. SAKURAI, J. J. Mecânica quântica moderna. 2. ed. Porto Alegre: Bookman, 2012.
  3. BAO, W. et al. Numerical Methods and Comparison for the Dirac Equation in the Nonrelativistic Limit Regime. Journal of Scientific Computing, v. 71, n. 3, p. 1094–1134, jun. 2017.
  4. SOFF, G. et al. Solution of the Dirac Equation for Scalar Potentials and its Implications in Atomic Physics. Zeitschrift für Naturforschung A, v. 28, n. 9, p. 1389–1396, 1 set. 1973.
  5. THALLER, B. The Dirac equation. Berlin: Springer, 2010.