Método de Euler-Cromer: 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 98: Linha 98:


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


#Método de Euler
#Método de Euler-Cromer
for it  in range(Np):
for it  in range(Np):
   x.append(x[it]+dt*v[it])   
   x.append(x[it]+dt*v[it])   

Edição atual tal como às 16h22min de 22 de fevereiro de 2022

Lembrando do que vimos no Método de Euler, o sistema de equações para o sistema massa-mola era:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align}\frac{dv}{dt} & =-\omega^{2}x\left(t\right)\\ \frac{dx}{dt} & =v\left(t\right) \end{align}}

Aplicando o método de Euler então:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align}v\left(t+\Delta t\right) & =v\left(t\right)-\omega^{2}x\left(t\right)\Delta t\\ x\left(t+\Delta t\right) & =x\left(t\right)+v\left(t\right)\Delta t \end{align}}

Em notação matricial temos:

Porém a matriz transforma o vetor no vetor , representando então a evolução no espao de fases e seu determinante representa a variação dovolume no espaço de fases. Para um problema conservativo, logo o determinante deve ser , uma vez que essevolume deve se manter constante. Para o método de Euler temos:

Outra forma de analisar o caso da oscilção quando usado o método explícito de Euler, é abrindo as contas. Escrevendo então a energia como:

Onde fazemos . Usando então:

Temos:

FIcamos então apenas:

Ou ainda:

Então a cada passo, a energia aumenta com um fator .


O método de Euler-Crome propõe usar no lugar de para calcular . Manipulando temos, lembrando que podemos substituir o valor de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t+\Delta t\right)} :

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align}x\left(t+\Delta t\right) & =x\left(t\right)+v\left(t\right)\Delta t\\ & =x\left(t\right)+v\left(t+\Delta t\right)\Delta t\\ & =x\left(t\right)+\left[v\left(t\right)-\omega^{2}x\left(t\right)\Delta t\right]\Delta t\\ & =x\left(t\right)\left(1-\omega^{2}\Delta t^{2}\right)+v\left(t\right)\Delta t \end{align}}

Atualizando então a notação matricial temos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align}\left(\begin{array}{c} x\left(t+\Delta t\right)\\ v\left(t+\Delta t\right) \end{array}\right) & =\left(\begin{array}{cc} 1-\omega^{2}\Delta t^{2} & \Delta t\\ -\omega^{2}\Delta t & 1 \end{array}\right)\left(\begin{array}{c} x\left(t\right)\\ v\left(t\right) \end{array}\right)\\ \boldsymbol{u}\left(t+\Delta t\right) & =\overline{M}\boldsymbol{u}\left(t\right) \end{align}}

Calculando então o novo determinante, temos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \det\left(\overline{M}\right)=1-\omega^{2}\Delta t^{2}+\left(\omega\Delta t\right)^{2}=1}

Algumas observações que podem ser feitas: a primeira é que também podemos fazer diferente e usar Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle x\left(t+\Delta t\right)} no lugar de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle x\left(t\right)} para calcular Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t+\Delta t\right)} . E a segunda é que quando olhamos para nossa aproximação, temos um intervalo de tempo Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \Delta t} entre Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t+\Delta t\right)} e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t\right)} . No método de Euler original, usamo a velocidade no começo intervalo (Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t\right)} ) para calcular a nova posição (Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle x\left(t+\Delta t\right)} , no de Euler-Cramer usamos no fim do intervalo (Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle v\left(t+\Delta t\right)} ), mas de certa forma tem a mesma natureza de aproximação. Como para uma equação tivemos o método de Euler-implícito, porém agora trabalhamos com um sistema de equações. Esse método também é chamado de ’semi-implícito.

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-Cromer
for it  in range(Np):
  x.append(x[it]+dt*v[it])  
  v.append(v[it]-dt*x[it+1]*w2) #Usamos x[it+1] ao invés de x[it]
  E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
  t.append(dt+it*dt)

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