Método de Verlet: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Jhordan (discussão | contribs)
Criou página com '= Principais materiais utilizados = # [https://math.libretexts.org/Bookshelves/Calculus/Book%3A_Active_Calculus_(Boelkins_et_al)/01%3A_Understanding_the_Derivative/1.06%3A_Th...'
 
Jhordan (discussão | contribs)
Sem resumo de edição
 
(6 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
= Método de Verlet =
Para o [[método de Euler]] implícito havíamos utilizado a derivada a esquerda:
<math display="block">f'\left(t\right)\approx\frac{f\left(t\right)-f\left(t-\Delta t\right)}{\Delta t}</math>
Então se <math display="inline">y\left(t\right)=f'\left(t\right)</math> a segunda derivada é <math display="inline">y'\left(t\right)=f''\left(t\right)</math>, pela definição, da derivada a direita:
<math display="block">y'\left(t\right)=\lim_{\Delta t\rightarrow0}\frac{y\left(t+\Delta t\right)-y\left(t\right)}{\Delta t}=\lim_{\Delta t\rightarrow0}\frac{f'\left(t+\Delta t\right)-f'\left(t\right)}{\Delta t}</math>
Logo utilizando as aproximações:
<math display="block">\begin{align}
f''\left(t\right) & \approx\frac{1}{\Delta t}\left(f'\left(t+\Delta t\right)-f'\left(t\right)\right)\\
& \approx\frac{1}{\Delta t}\left(\frac{f\left(t+\Delta t\right)-f\left(t+\Delta t-\Delta t\right)}{\Delta t}-\frac{f\left(t\right)-f\left(t-\Delta t\right)}{\Delta t}\right)\\
& \approx\frac{f\left(t+\Delta t\right)+f\left(t-\Delta t\right)-2f\left(t\right)}{\left(\Delta t\right)^{2}}\end{align}</math>
Isolando então <math display="inline">f\left(t+\Delta t\right)</math>:
<math display="block">\begin{align}
f\left(t+\Delta t\right) & =\left(\Delta t\right)^{2}f''\left(t\right)-f\left(t-\Delta t\right)+2f\left(t\right)\end{align}</math>
Temos o método de Verlet. Podemos notar que precisamos conhecer <math display="inline">f\left(t\right)</math> em dois tempos anteriores. Podemos utilizar outro algoritmo para o primeiro passo. Se <math display="inline">f\left(t\right)=x\left(t\right)</math> é posição, então <math display="inline">f''\left(t\right)=\ddot{x}\left(t\right)=a\left(x,t\right)</math> logo podemos reescrever:
<math display="block">\begin{align}
x\left(t+\Delta t\right) & =a\left(x,t\right)\left(\Delta t\right)^{2}-x\left(t-\Delta t\right)+2x\left(t\right)\end{align}</math>
Para calcular a energia, podemos obter a velocidade então utilizando a derivada centrada: <math display="block">v\left(t\right)=\dot{x}\left(t\right)=\frac{x\left(t+\Delta t\right)-x\left(t-\Delta t\right)}{2\Delta t}</math>
Alternativamente podemos obter o mesmo resultado em termos da expansão de Taylor:
<math display="block">\begin{align}
x\left(t+\Delta t\right) & =x\left(t\right)+v\left(t\right)\Delta t+\frac{1}{2}a\left(t\right)\Delta t^{2}+\frac{1}{6}a'\left(t\right)\Delta t^{3}+\dots\\
x\left(t-\Delta t\right) & =x\left(t\right)-v\left(t\right)\Delta t+\frac{1}{2}a\left(t\right)\Delta t^{2}-\frac{1}{6}a'\left(t\right)\Delta t^{3}+\dots\end{align}</math>
Somando os dois termos, ficamos então com:
<math display="block">x\left(t+\Delta t\right)+x\left(t-\Delta t\right)=2x\left(t\right)+a\left(t\right)\Delta t^{2}+\mathcal{O}\left(\Delta t^{4}\right)</math>
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 é <math display="inline">\mathcal{O}\left(\Delta t^{4}\right)</math>, e este é o erro local, associao a um único passo.
Além disso, se fizermos a diferença, obtemos o algoritmo da velocidade:
<math display="block">x\left(t+\Delta t\right)+x\left(t-\Delta t\right)=2v\left(t\right)+\frac{1}{3}a'\left(t\right)\Delta t^{3}</math>
Então:
<math display="block">v\left(t\right)=\frac{x\left(t+\Delta t\right)+x\left(t-\Delta t\right)}{\Delta t}-\frac{1}{3}a'\left(t\right)\Delta t^{2}</math>
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 ==
Aplicando o algoritmo para o sistema massa-mola visto no [[Método de Euler-Cromer | método de Euler-Cromer]]:
<math display="block"> \frac{d^{2}x}{dt^{2}}=-\frac{k}{m}x=-\omega^{2}x </math>
Podemos ressaltar ainda que <math>a =-\omega^{2}x </math>  e <math>  \frac{dv}{dt}=\frac{d^{2}x}{dt^{2}}</math>.
<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 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)
</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>
= Principais materiais utilizados =
= Principais materiais utilizados =


# [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 14h33min 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:

f(t)f(t)f(tΔt)Δt

Então se y(t)=f(t) a segunda derivada é y(t)=f(t), pela definição, da derivada a direita:

y(t)=limΔt0y(t+Δt)y(t)Δt=limΔt0f(t+Δt)f(t)Δt

Logo utilizando as aproximações:

f(t)1Δt(f(t+Δt)f(t))1Δt(f(t+Δt)f(t+ΔtΔt)Δtf(t)f(tΔt)Δt)f(t+Δt)+f(tΔt)2f(t)(Δt)2

Isolando então f(t+Δt):

f(t+Δt)=(Δt)2f(t)f(tΔt)+2f(t)

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

x(t+Δt)=a(x,t)(Δt)2x(tΔt)+2x(t)

Para calcular a energia, podemos obter a velocidade então utilizando a derivada centrada: v(t)=x˙(t)=x(t+Δt)x(tΔt)2Δt Alternativamente podemos obter o mesmo resultado em termos da expansão de Taylor:

x(t+Δt)=x(t)+v(t)Δt+12a(t)Δt2+16a(t)Δt3+x(tΔt)=x(t)v(t)Δt+12a(t)Δt216a(t)Δt3+

Somando os dois termos, ficamos então com:

x(t+Δt)+x(tΔt)=2x(t)+a(t)Δt2+𝒪(Δt4)

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 é 𝒪(Δt4), e este é o erro local, associao a um único passo.

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

x(t+Δt)+x(tΔt)=2v(t)+13a(t)Δt3

Então:

v(t)=x(t+Δt)+x(tΔt)Δt13a(t)Δt2

Logo temos um erro 𝒪(Δt2) na velocidade. Além do erro de truncação associado ao método de dierenças finita e que decai com o decaimento de Δt, 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 1+α=1. ϵ é o maior número que pode ser somado a 1 sem alterar o resultado.

Exemplo

Aplicando o algoritmo para o sistema massa-mola visto no método de Euler-Cromer: d2xdt2=kmx=ω2x

Podemos ressaltar ainda que a=ω2x e dvdt=d2xdt2.

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 Δt/2, obtemos uma equação para velocidade:

a(t)v(t+Δt/2)v(t)Δt/2v(t+Δt/2)=v(t)+a(t)Δt2(1)

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

v(t+Δt/2)x(t+Δt)x(t)Δtx(t+Δt)=x(t)+v(t+Δt/2)Δt

Ainda podemos reescrever, substituindo:

x(t+Δt)=x(t)+v(t)Δt+a(t)Δt22(2)

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

v(t)=x(t+Δt)x(tΔt)2Δtv(t+Δt)=x(t+2Δt)x(t)2Δt(3)

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

x(t+Δt)=a(t)Δt2x(tΔt)+2x(t)x(t+2Δt)=a(t+Δt)Δt2x(t)+2x(t+Δt)

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

v(t+Δt)=a(t+Δt)Δt2x(t)+2x(t+Δt)x(t)2Δt=a(t+Δt)Δt2+x(t+Δt)x(t)Δt

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

v(t+Δt)=a(t+Δt)Δt2+x(t+Δt)x(t)Δt=v(t)+(a(t+Δt)+a(t))Δt2

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

x(t+Δt)=x(t)+v(t)Δt+a(t)Δt22v(t+Δt)=v(t)+(a(t+Δt)+a(t))Δt2

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

v(t+Δt2)=v(t)+a(t)Δt2x(t+Δt)=x(t)+v(t+Δt2)Δtv(t+Δt)=v(t+Δt2)+a(t+Δt)Δt2


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)