|
|
Linha 77: |
Linha 77: |
|
| |
|
| ==Exemplo == | | ==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> | | <pre> |
Linha 97: |
Linha 103: |
| #Método Range-Kutta de segunda ordem, no método do ponto médio | | #Método Range-Kutta de segunda ordem, no método do ponto médio |
| for it in range(Np): | | for it in range(Np): |
| #Posição | | #Primeira etapa |
| k1 = fx(v[it])*dt | | k1x = fx(v[it])*dt |
| k2 = fx(v[it]+k1/2)*dt | | k1v = fv(x[it],w2)*dt |
| x.append(x[it]+k2) | | #Segunda etapa |
| #Velocidade | | k2x = fx(v[it]+k1v/2)*dt |
| k1 = fv(x[it],w2)*dt
| | k2v = fv(x[it]+k1x/2,w2)*dt |
| k2 = fv(x[it]+k1/2,w2)*dt | | #Solução |
| v.append(v[it]+k2) | | x.append(x[it]+k2x) |
| | v.append(v[it]+k2v) |
| #Energia | | #Energia |
| E.append(k*x[it+1]**2/2+m*v[it+1]**2/2) | | E.append(k*x[it+1]**2/2+m*v[it+1]**2/2) |
Linha 110: |
Linha 117: |
| t.append(dt+it*dt) | | t.append(dt+it*dt) |
|
| |
|
| plt.plot(t,x) | | #plt.plot(t,x) |
| plt.plot(t,v) | | #plt.plot(t,v) |
| plt.plot(t,E) | | #plt.plot(t,E) |
| #plt.plot(x,v)
| | plt.plot(x,v) |
| </pre> | | </pre> |
|
| |
|
Linha 148: |
Linha 155: |
| m=1 ; k= 1.; w2= k/m | | m=1 ; k= 1.; w2= k/m |
| #Parâmetros | | #Parâmetros |
| dt = 0.00001 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt) | | dt = 0.01 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt) |
| #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 154: |
Linha 161: |
| #Método Range-Kutta de quarta ordem | | #Método Range-Kutta de quarta ordem |
| for it in range(Np): | | for it in range(Np): |
| #Posição | | #Primeira etapa |
| k1 = fx(v[it])*dt | | k1x = fx(v[it])*dt |
| k2 = fx(v[it]+k1/2)*dt | | k1v = fv(x[it] ,w2)*dt |
| k3 = fx(v[it]+k2/2)*dt | | #Segunda etapa |
| k4 = fx(v[it]+k3)*dt | | k2x = fx(v[it]+k1v/2)*dt |
| x.append(x[it]+(k1+2*k2+2*k3+k4)/6) | | k2v = fv(x[it]+k1x/2,w2)*dt |
| #Velocidade | | #Terceira etapa |
| k1 = fv(x[it] ,w2)*dt
| | k3x = fx(v[it]+k2v/2)*dt |
| k2 = fv(x[it]+k1/2,w2)*dt | | k3v = fv(x[it]+k2x/2,w2)*dt |
| k3 = fv(x[it]+k2/2,w2)*dt | | #Quarta etapa |
| k4 = fv(x[it]+k3 ,w2)*dt | | k4x = fx(v[it]+k3v)*dt |
| v.append(v[it]+(k1+2*k2+2*k3+k4)/6) | | k4v = fv(x[it]+k3x,w2)*dt |
| | #Solução: |
| | x.append(x[it]+(k1x+2*k2x+2*k3x+k4x)/6) |
| | v.append(v[it]+(k1v+2*k2v+2*k3v+k4v)/6) |
| #Energia | | #Energia |
| E.append(k*x[it+1]**2/2+m*v[it+1]**2/2) | | E.append(k*x[it+1]**2/2+m*v[it+1]**2/2) |
Linha 176: |
Linha 186: |
| #plt.plot(x,v) | | #plt.plot(x,v) |
| </pre> | | </pre> |
| | |
| | Ainda podemos chamar a atenção para o fato de que devemos intercalar os coeficientes <math>k_i</math> em ambos os métodos, uma vez que coeficientes seguintes dependem dos valores anteriores. |
|
| |
|
| = Principais materiais utilizados = | | = Principais materiais utilizados = |
Runge-Kutta 2ª ordem
No método explícito de euler tínhamos:
Sendo . Podemos reescrever como:
Onde e . Agor se supormos uma solução:
Com o termo adicional dependendo de uma posição genérica
em um tempo genérico
, isto é
. Usando o fato de que
, podemos escrever então que:
Agora lembrando a expansão em série de taylor que também vimos no método explícito e Euler:
Abrindo a segunda derivada, temos:
Substituindo então, e escrevendo apenas , temos a seguinte expansão em série de Taylor:
Vamos expandir . Uma expansão de Taylor de primeira ordem para uma função de 2 variáveis em torno de é dado por [1]:
Onde denota a derivada da função na variável . Para o nosso caso, temos então para uma expansão em torno de :
Expandindo então em torno de temos:
Aqui podemos notar que multiplica a expansão da função, então quando desprezamos os termos de segunda ordem da expansão de , deprezamos os termos de terceira ordem de . Substituindo então o aproximado e na equação 1, temos:
Manipulando:
Comparando a aproximação 3 com a expansão 2 temos a seguinte relação:
Diferentes conjuntos de valore satisfazem este sistema. O método do ponto médio é obtido se ecolhermos:
,
e
:
Então:
O método de Heun é obtido se for escolhido e :
Uma observação, é que o erro global no algoritmo de Runge-Kutta de segunda ordem é e o local é .
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
#Taxas de variação
def fv(x,w2): #Velocidade
return (-w2*x)
def fx(v):
return (v) #Posição
#Constantes
m=1 ; k= 1.; w2= k/m
#Parâmetros
dt = 0.0001 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
#Valores iniciais
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]
#Método Range-Kutta de segunda ordem, no método do ponto médio
for it in range(Np):
#Primeira etapa
k1x = fx(v[it])*dt
k1v = fv(x[it],w2)*dt
#Segunda etapa
k2x = fx(v[it]+k1v/2)*dt
k2v = fv(x[it]+k1x/2,w2)*dt
#Solução
x.append(x[it]+k2x)
v.append(v[it]+k2v)
#Energia
E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
#Tempo
t.append(dt+it*dt)
#plt.plot(t,x)
#plt.plot(t,v)
#plt.plot(t,E)
plt.plot(x,v)
Runge-Kutta 4ª ordem
O método de Runge-Kutta de quarta ordem segue uma ideia similar e pode ser obtido utilizando a mesma técnica. Porém agora vamos ignorar termos de ordem ou superior, então será necessário lidar com uma enorme quantidade de termos, o que torna a tarefa exaustiva e repetitiva. Logo não será feito esta demonstração aqui, mas o algoritmo de Runge-Kutta de quarta ordem pode ser dado por:
E por fim, temos então que o novo valor será dado por:
Exemplo
Vamos resolver o mesmo exemplo anterior, porém agora utilizando o Range-Kutta de quarta ordem.
import matplotlib.pyplot as plt #Biblioteca para plotar gráficos
import numpy as np #Biblitoeca de cálculos científicos
#Taxas de variação
def fv(x,w2): #Velocidade
return (-w2*x)
def fx(v):
return (v) #Posição
#Constantes
m=1 ; k= 1.; w2= k/m
#Parâmetros
dt = 0.01 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
#Valores iniciais
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]
#Método Range-Kutta de quarta ordem
for it in range(Np):
#Primeira etapa
k1x = fx(v[it])*dt
k1v = fv(x[it] ,w2)*dt
#Segunda etapa
k2x = fx(v[it]+k1v/2)*dt
k2v = fv(x[it]+k1x/2,w2)*dt
#Terceira etapa
k3x = fx(v[it]+k2v/2)*dt
k3v = fv(x[it]+k2x/2,w2)*dt
#Quarta etapa
k4x = fx(v[it]+k3v)*dt
k4v = fv(x[it]+k3x,w2)*dt
#Solução:
x.append(x[it]+(k1x+2*k2x+2*k3x+k4x)/6)
v.append(v[it]+(k1v+2*k2v+2*k3v+k4v)/6)
#Energia
E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
#Tempo
t.append(dt+it*dt)
plt.plot(t,x)
plt.plot(t,v)
plt.plot(t,E)
#plt.plot(x,v)
Ainda podemos chamar a atenção para o fato de que devemos intercalar os coeficientes em ambos os métodos, uma vez que coeficientes seguintes dependem dos valores anteriores.
Principais materiais utilizados
- Métodos de Runge-Kutta explícitos (REAMAT, UFRGS)
- Runge-Kutta Methods (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts)
- Second Order Runge-Kutta (Erik Cheever, Swarthmore)
Citações