Método de Verlet: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
(5 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: | Para o [[método de Euler]] implícito havíamos utilizado a derivada a esquerda: | ||
Linha 25: | Linha 27: | ||
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> | 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 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:
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
- The Second Derivative (Matthew Boelkins, David Austin & Steven Schlicker; LibreTexts)
- Verlet Method (Brasnislav K. Nikolic, Universidae de Delaware)