Método de Verlet: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
Linha 1: | Linha 1: | ||
= O método = | |||
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 46: | Linha 48: | ||
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 = | |||
Aplicano o algoritmo para: | |||
<math display="block"> \frac{d^{2}x}{dt^{2}}=-\frac{k}{m}x=\omega^{2}x </math> | |||
<pre> | <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> | </pre> | ||
Edição das 16h20min de 22 de fevereiro de 2022
O método
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
Aplicano o algoritmo para:
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)
Principais materiais utilizados
- The Second Derivative (Matthew Boelkins, David Austin & Steven Schlicker; LibreTexts)