Método de Verlet: 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
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 1: Linha 1:
= O método =
= Método de Verlet =


Para o [[método de Euler]] implícito havíamos utilizado a derivada a esquerda:
Para o [[método de Euler]] implícito havíamos utilizado a derivada a esquerda:
Linha 49: Linha 49:
Logo temos um erro <math display="inline">\mathcal{O}\left(\Delta t^{2}\right)</math> na velocidade. Além do erro de truncação associado ao método de dierenças finita e que decai com o decaimento de <math display="inline">\Delta t</math>, 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 <math display="inline">\epsilon</math> em que para qualquer número <math display="inline">\alpha\leq\epsilon</math> então <math display="inline">1+\alpha=1</math>. <math display="inline">\epsilon</math> é o maior número que pode ser somado a <math display="inline">1</math> sem alterar o resultado.
Logo temos um erro <math display="inline">\mathcal{O}\left(\Delta t^{2}\right)</math> na velocidade. Além do erro de truncação associado ao método de dierenças finita e que decai com o decaimento de <math display="inline">\Delta t</math>, 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 <math display="inline">\epsilon</math> em que para qualquer número <math display="inline">\alpha\leq\epsilon</math> então <math display="inline">1+\alpha=1</math>. <math display="inline">\epsilon</math> é o maior número que pode ser somado a <math display="inline">1</math> sem alterar o resultado.


= Exemplo =  
== Exemplo ==
 


Aplicando o algoritmo para o sistema massa-mola visto no [[Método de Euler-Cromer | método de Euler-Cromer]]:
Aplicando o algoritmo para o sistema massa-mola visto no [[Método de Euler-Cromer | método de Euler-Cromer]]:
Linha 83: Linha 82:
#plt.plot(t[:len(t)-1],E)
#plt.plot(t[:len(t)-1],E)
plt.plot(x[:len(x)-1],v)
plt.plot(x[:len(x)-1],v)
</pre>
= 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 <math display="inline">\Delta t/2</math>, obtemos uma equação para velocidade:
<math display="block">a\left(t\right)\approx\frac{v\left(t+\Delta t/2\right)-v\left(t\right)}{\Delta t/2}\longrightarrow v\left(t+\Delta t/2\right)=v\left(t\right)+a\left(t\right)\frac{\Delta t}{2}\qquad\left(1\right)</math>
Fazendo o mesmo processo do leapfrog para a posição:
<math display="block">v\left(t+\Delta t/2\right)\approx\frac{x\left(t+\Delta t\right)-x\left(t\right)}{\Delta t}\longrightarrow x\left(t+\Delta t\right)=x\left(t\right)+v\left(t+\Delta t/2\right)\Delta t</math>
Ainda podemos reescrever, substituindo:
<math display="block">x\left(t+\Delta t\right)=x\left(t\right)+v\left(t\right)\Delta t+a\left(t\right)\frac{\Delta t^{2}}{2}\qquad\left(2\right)</math>
Isto é, partindo de um tempo <math display="inline">t</math> onde conhecemos posição e velocidade, calculamos a velocidade em <math display="inline">t+\frac{\Delta t}{2}</math> e usamos essa velociade para calcular a poição em <math display="inline">t+\Delta t</math>. Agora para a velocidade no instante <math display="inline">t+\Delta t</math> , começamo com uma derivada centrada:
<math display="block">v\left(t\right)=\frac{x\left(t+\Delta t\right)-x\left(t-\Delta t\right)}{2\Delta t}\longrightarrow v\left(t+\Delta t\right)=\frac{x\left(t+2\Delta t\right)-x\left(t\right)}{2\Delta t}\qquad\left(3\right)</math>
Então pegamos o método de Verlet e avançamos <math display="inline">\Delta t</math>:
<math display="block">\begin{align}
x\left(t+\Delta t\right) & =a\left(t\right)\Delta t^{2}-x\left(t-\Delta t\right)+2x\left(t\right)\\
x\left(t+2\Delta t\right) & =a\left(t+\Delta t\right)\Delta t^{2}-x\left(t\right)+2x\left(t+\Delta t\right)\end{align}</math>
E substituímos na velocidade (equação '''3'''):
<math display="block">\begin{align}
v\left(t+\Delta t\right) & =\frac{a\left(t+\Delta t\right)\Delta t^{2}-x\left(t\right)+2x\left(t+\Delta t\right)-x\left(t\right)}{2\Delta t}\\
= & a\left(t+\Delta t\right)\frac{\Delta t}{2}-+\frac{x\left(t+\Delta t\right)-x\left(t\right)}{\Delta t}\end{align}</math>
E usando então a equação para posição que encontramos (equação 2) para substituir <math display="inline">x\left(t+\Delta t\right)-x\left(t\right)</math> :
<math display="block">\begin{align}
v\left(t+\Delta t\right) & =a\left(t+\Delta t\right)\frac{\Delta t}{2}+\frac{x\left(t+\Delta t\right)-x\left(t\right)}{\Delta t}\\
= & v\left(t\right)+\left(a\left(t+\Delta t\right)+a\left(t\right)\right)\frac{\Delta t}{2}\end{align}</math>
Então agora utilizamos a posição em <math display="inline">t+\Delta t</math> para encontrarmos a velocidade no mesmo instante. Temos então:
<math display="block">\begin{align}
x\left(t+\Delta t\right) & =x\left(t\right)+v\left(t\right)\Delta t+a\left(t\right)\frac{\Delta t^{2}}{2}\\
v\left(t+\Delta t\right) & =v\left(t\right)+\left(a\left(t+\Delta t\right)+a\left(t\right)\right)\frac{\Delta t}{2}\end{align}</math>
Ou ainda simplesmente escrevendo explicitamente a equação '''1:'''
<math display="block">\begin{align}
v\left(t+\frac{\Delta t}{2}\right) & =v\left(t\right)+a\left(t\right)\frac{\Delta t}{2}\\
x\left(t+\Delta t\right) & =x\left(t\right)+v\left(t+\frac{\Delta t}{2}\right)\Delta t\\
v\left(t+\Delta t\right) & =v\left(t+\frac{\Delta t}{2}\right)+a\left(t+\Delta t\right)\frac{\Delta t}{2}\end{align}</math>
== Exemplo==
Resolvendo o mesmo exemplo anterior, temos:
<pre>
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)
</pre>
</pre>


Linha 88: Linha 165:


# [https://math.libretexts.org/Bookshelves/Calculus/Book%3A_Active_Calculus_(Boelkins_et_al)/01%3A_Understanding_the_Derivative/1.06%3A_The_Second_Derivative The Second Derivative] (Matthew Boelkins, David Austin & Steven Schlicker; LibreTexts)
# [https://math.libretexts.org/Bookshelves/Calculus/Book%3A_Active_Calculus_(Boelkins_et_al)/01%3A_Understanding_the_Derivative/1.06%3A_The_Second_Derivative The Second Derivative] (Matthew Boelkins, David Austin & Steven Schlicker; LibreTexts)
# [https://www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html Verlet Method] (Brasnislav K. Nikolic, Universidae de Delaware)

Edição atual tal como às 11h33min de 5 de março de 2022

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)