Método de Verlet

De Física Computacional
Ir para navegação Ir para pesquisar

Método de Verlet

Para o método de Euler implícito havíamos utilizado a derivada a esquerda:

Então se a segunda derivada é , pela definição, da derivada a direita:

Logo utilizando as aproximações:

Isolando então :

Temos o método de Verlet. Podemos notar que precisamos conhecer em dois tempos anteriores. Podemos utilizar outro algoritmo para o primeiro passo. Se é posição, então logo podemos reescrever:

Para calcular a energia, podemos obter a velocidade então utilizando a derivada centrada:

Alternativamente podemos obter o mesmo resultado em termos da expansão de Taylor:

Somando os dois termos, ficamos então com:

Obtemos então não só o algoritmo de Verlet, além de que sabemos que é uma expansão até a terceir ordem. Então o erro envolvido na truncação é , e este é o erro local, associao a um único passo.

Além disso, se fizermos a diferença, obtemos o algoritmo da velocidade:

Então:

Logo temos um erro na velocidade. Além do erro de truncação associado ao método de dierenças finita e que decai com o decaimento de , também podemos lembrar que um erro de arredondamento, pois o computador usa uma quantidade finita de memória para representar os números. Isto, é, existe um número em que para qualquer número então . é o maior número que pode ser somado a sem alterar o resultado.

Exemplo

Aplicando o algoritmo para o sistema massa-mola visto no método de Euler-Cromer:

Podemos ressaltar ainda que e .

import matplotlib.pyplot as plt            #Biblioteca para plotar gráficos
import numpy as np                         #Biblitoeca de cálculos científicos

#Constantes
m=1  ; k= 1.; w2= k/m
#Valores iniciais
x=[1]; v=[0]; t=[0] ; E=[k*(x[0]**2)/2+m*(v[0]**2)/2] 
#Parâmetros
dt  = 0.1 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)

#Método de Euler-Cormer para obter o primeiro passo:
x.append(x[0]+dt*v[0])  
t.append(dt)

#Método de Verlet:
for it in range(1,Np):
  x.append(-w2*x[it]*dt*dt-x[it-1]+2*x[it]) #Método de Verlet
  v.append((x[it+1]-x[it-1])/(2*dt))
  E.append(k*x[it]**2/2+m*v[it]**2/2)
  t.append(dt+it*dt)

#plt.plot(t,x)
#plt.plot(t[:len(t)-1],v) #Velocidade tem um elemento a menos
#plt.plot(t[:len(t)-1],E)
plt.plot(x[:len(x)-1],v)

Método Velocidade de Verlet

O método de verlet é similar ao leapfrog, mas é síncrono e não exige inicialização. Pela derivada à direita com uma variação de , obtemos uma equação para velocidade:

Fazendo o mesmo processo do leapfrog para a posição:

Ainda podemos reescrever, substituindo:

Isto é, partindo de um tempo onde conhecemos posição e velocidade, calculamos a velocidade em e usamos essa velociade para calcular a poição em . Agora para a velocidade no instante , começamo com uma derivada centrada:

Então pegamos o método de Verlet e avançamos :

E substituímos na velocidade (equação 3):

E usando então a equação para posição que encontramos (equação 2) para substituir  :

Então agora utilizamos a posição em para encontrarmos a velocidade no mesmo instante. Temos então:

Ou ainda simplesmente escrevendo explicitamente a equação 1:


Exemplo

Resolvendo o mesmo exemplo anterior, temos:

import matplotlib.pyplot as plt            #Biblioteca para plotar gráficos
import numpy as np                         #Biblitoeca de cálculos científicos

#Constantes
m=1  ; k= 1.; w2= k/m
#Valores iniciais
x=[1]; v=[0]; t=[0] ; E=[k*(x[0]**2)/2+m*(v[0]**2)/2] 
#Parâmetros
dt  = 0.1 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)

#Método de Velocidade Verlet:
for it in range(Np):
  x.append(x[it]+v[it]*dt-w2*x[it]*dt**2/2)
  v.append(v[it]+(-w2*x[it+1]-w2*x[it])*dt/2)
  E.append(k*x[it]**2/2+m*v[it]**2/2)
  t.append(dt+it*dt)

#plt.plot(t,x)
#plt.plot(t,v)
#plt.plot(t,E)
plt.plot(x,v)

Principais materiais utilizados

  1. The Second Derivative (Matthew Boelkins, David Austin & Steven Schlicker; LibreTexts)
  2. Verlet Method (Brasnislav K. Nikolic, Universidae de Delaware)