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:
![{\displaystyle k_{2}\approx \left[f\left(t_{n},y_{n}\right)+d\Delta t{\frac {\partial }{\partial t}}f\left(t_{n},y_{n}\right)+ck_{1}{\frac {\partial }{\partial y}}f\left(t_{n},y_{n}\right)\right]\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/10bb8199985f29badd44796ca7e63524a9566294)
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:
![{\displaystyle y_{n+1}=y_{n}+af\left(t_{n},y_{n}\right)\Delta t+b\left[f\left(t_{n},y_{n}\right)+d\Delta t{\frac {\partial }{\partial t}}f\left(t_{n},y_{n}\right)+cf\left(t_{n},y_{n}\right)\Delta t{\frac {\partial }{\partial y}}f\left(t_{n},y_{n}\right)\right]\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/45b93c9c39adcf56eb02baa3be698e0b5b9e71f8)
Manipulando:
![{\displaystyle y_{n+1}=y_{n}+\left(a+b\right)f\left(t_{n},y_{n}\right)\Delta t+\left[2bd{\frac {\partial }{\partial t}}f\left(t_{n},y_{n}\right)+2bcf\left(t_{n},y_{n}\right){\frac {\partial }{\partial y}}f\left(t_{n},y_{n}\right)\right]{\frac {\Delta t^{2}}{2}}\qquad \left(3\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5f54c94ed040c30dcf26e8b2c364bde41a533715)
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