# Método de Runge-Kutta

Em análise numérica, os métodos de Runge–Kutta formam uma família importante de metódos iterativos implícitos e explícitos para a resolução numérica (aproximação) de soluções de equações diferenciais ordinárias. Estas técnicas foram desenvolvidas por volta de 1900 pelos matemáticos C. Runge e M.W. Kutta.
Veja o artigo sobre métodos numéricos para equações diferenciais ordinárias para maior entendimento e para outros métodos. Veja ainda a lista de métodos Runge-Kutta.
Trata-se de um método por etapas que tem a seguinte expressão genérica:
$u^{n+1}=u^{n}+\Delta t\sum _{i=1}^{e}b_{i}k_{i},$
onde
$k_{i}=F(u^{n}+\Delta t\sum _{j=i}^{e}a_{ij}k_{j};t_{n}+c_{i}\Delta t)$ $i=1,...,e$
com $a_{ij},b_{i},c_{i}$ constantes próprias do esquema numérico. Os esquemas Runge-Kutta podem ser explícitos ou implícitos dependendo das constantes $a_{ij}$ do esquema. Se esta matriz é triangular inferior com todos os elementos da diagonal principal iguais a zero; quer dizer, $a_{ij}=0$ para $j=i,...,e,$ os esquemas são explícitos.
O método de runge-kutta é muitas vezes confundido com o metodo "predictor-corrector"sendo este o resultado da junção do método dos trapézios e do método de Euler.

## O método Runge–Kutta clássico de quarta ordem

Um membro da família de métodos Runge–Kutta é usado com tanta frequência que costuma receber o nome de "RK4" ou simplesmente "o método Runge–Kutta".
Seja um problema de valor inicial (PVI) especificado como segue:
$y'=f(t,y),\quad y(t_{0})=y_{0}.$
Então o método RK4 para este problema é dado pelas seguintes equações:
${\begin{aligned}y_{n+1}&=y_{n}+{h \over 6}\left(k_{1}+2k_{2}+2k_{3}+k_{4}\right)\\t_{n+1}&=t_{n}+h\\\end{aligned}}$
onde $y_{n+1}$ é a aproximação por RK4 de $y(t_{n+1}),$ e
${\begin{aligned}k_{1}&=f\left(t_{n},y_{n}\right)\\k_{2}&=f\left(t_{n}+{h \over 2},y_{n}+{h \over 2}k_{1}\right)\\k_{3}&=f\left(t_{n}+{h \over 2},y_{n}+{h \over 2}k_{2}\right)\\k_{4}&=f\left(t_{n}+h,y_{n}+hk_{3}\right)\\\end{aligned}}$
Então, o próximo valor (y$_{n+1}$) é determinado pelo valor atual (y$_n$) somado com o produto do tamanho do intervalo (h) e uma inclinação estimada. A inclinação é uma média ponderada de inclinações:
* k$_1$ é a inclinação no início do intervalo;
* k$_2$ é a inclinação no ponto médio do intervalo, usando a inclinação k$_1$ para determinar o valor de y no ponto t$_n$ + h/2 através do método de Euler;
* k$_3$ é novamente a inclinação no ponto médio do intervalo, mas agora usando a inclinação k$_2$ para determinar o valor de y;
* k$_4$ é a inclinação no final do intervalo, com seu valor y determinado usando k$_3$.
Ao fazer a média das quatro inclinações, um peso maior é dado para as inclinações no ponto médio:
${\mbox{inclinação}}={\frac {k_{1}+2k_{2}+2k_{3}+k_{4}}{6}}.$
O método RK4 é um método de quarta ordem, significando que o erro por passo é da ordem de h$^5$, enquanto o erro total acumulado tem ordem h$^4$.
Note que as fórmulas acima são válidas tanto para funções escalares quanto para funções vetoriais (ou seja, quando y pode ser um vetor e $f$ um operador). Por exemplo, pode-se integrar a equação de Schrödinger usando o operador Hamiltoniano como função $f.$

## Métodos Runge–Kutta explícitos

A família de métodos Runge–Kutta explícitos é uma generalização do método RK4 mencionado acima.
Ela é dada por $y_{n+1}=y_{n}+h\sum _{i=1}^{s}b_{i}k_{i},$ onde $k_{1}=f(t_{n},y_{n}),$ $k_{2}=f(t_{n}+c_{2}h,y_{n}+a_{21}hk_{1}),$ $k_{3}=f(t_{n}+c_{3}h,y_{n}+a_{31}hk_{1}+a_{32}hk_{2}),$ $\vdots$ $k_{s}=f(t_{n}+c_{s}h,y_{n}+a_{s1}hk_{1}+a_{s2}hk_{2}+\cdots +a_{s,s-1}hk_{s-1}).$
    (Nota: as equações acima têm definições diferentes em diferentes textos, apesar de equivalentes).
Para especificar um método em particular, é necessário fornecer o inteiro s (número de estágios), e os coeficiêntes a$_{ij}$ (para 1 ≤ j <i ≤ s), b$_i$ (para i = 1, 2, ..., s) e c$_i$ (para i = 2, 3, ..., s). Esses dados são geralmente dispostos de forma mnemônica, conhecida como matriz de Butcher (de John Charles Butcher):
| 0 |
| $c_{2}$ | $a_{21}$ |
| $c_{3}$ | $a_{31}$ | $a_{32}$ |
| $\vdots$ | $\vdots$ | | $\ddots$ |
| $c_{s}$ | $a_{s1}$ | $a_{s2}$ | $\cdots$ | $a_{s,s-1}$ | |
| | $b_{1}$ | $b_{2}$ | $\cdots$ | $b_{s-1}$ | $b_{s}$ |
O método Runge–Kutta é consistente se $\sum _{j=1}^{i-1}a_{ij}=c_{i}\ \mathrm {para} \ i=2,\ldots ,s.$
Existem ainda exigências extras se for imposto que o método tenha certa ordem p, significando que o erro de truncamento é O(h$^{p+1}$). Tais condições podem ser deduzida da própria definição de erro de truncamento. Por exemplo, um método de 2 estágios tem ordem 2 se b$_1$ + b$_2$ = 1, b$_2$c$_2$ = 1/2, e b$_2$a$_{21}$ = 1/2.

### Exemplos

O método RK4 se enquadra nesta categoria. Seu tableau é:
| 0 |
| 1/2 | 1/2 |
| 1/2 | 0 | 1/2 |
| 1 | 0 | 0 | 1 | |
| | 1/6 | 1/3 | 1/3 | 1/6 |
No entanto, o método Runge–Kutta mais simples é o (forward) Euler, dado pela fórmula $y_{n+1}=y_{n}+hf(t_{n},y_{n}).$ Este é o único método Runge–Kutta explícito de um estágio que é consistente. A tableau correspondente é:
| 0 | |
| | 1 |
Um exemplo de um método de segunda ordem com dois estágios é o método do ponto médio (midpoint method, em inglês) $y_{n+1}=y_{n}+hf\left(t_{n}+{\frac {h}{2}},y_{n}+{\frac {h}{2}}f(t_{n},y_{n})\right).$ A tableau correspondente é:
| 0 |
| 1/2 | 1/2 | |
| | 0 | 1 |
Note que este método do 'ponto médio' não é o método RK2 ótimo. Uma alternativa é fornecida pelo método de Heun, onde os 1/2's da tableau acima são simplesmente substituídos por 1's. Caso se queira minimizar o erro de truncamento, o método abaixo deve ser utilizado (Atkinson p. 423). Outros métodos importantes são Fehlberg, Cash-Karp e Dormand-Prince. Leia ainda, o artigo sobre tamanho de passo Adaptativo.

## Uso

O que segue é um exemplo de uso de um método Runge–Kutta explícito de dois estágios:
| 0 |
| 2/3 | 2/3 | |
| | 1/4 | 3/4 |
para resolver o problema de valor inicial $y'=(\tan {y})+1,\quad y(1)=1,\ t\in [1,1.1]$ com tamanho de passo h=0.025.
A tableau acima gera as seguintes equações equivalentes que definem o método: $k_{1}=y_{n}$ $k_{2}=y_{n}+2/3hf(t_{n},k_{1})$ $y_{n+1}=y_{n}+h(1/4f(t_{n},k_{1})+3/4f(t_{n}+2/3h,k_{2}))$
| $t_{0}=1$ | | |
| | $y_{0}=1$ |
| $t_{1}=1.025$ |
| | $k_{1}=y_{0}=1$ | $f(t_{0},k_{1})=2.557407725$ | $k_{2}=y_{0}+2/3hf(t_{0},k_{1})=1.042623462$ |
| | $y_{1}=y_{0}+h(1/4*f(t_{0},k_{1})+3/4*f(t_{0}+2/3h,k_{2}))=1.066869388$ | $y_{1}=y_{0}+h(1/4*f(t_{0},k_{1})+3/4*f(t_{0}+2/3h,k_{2}))=1.066869388$ |
| $t_{2}=1.05$ |
| | $k_{1}=y_{1}=1.066869388$ | $f(t_{1},k_{1})=2.813524695$ | $k_{2}=y_{1}+2/3hf(t_{1},k_{1})=1.113761467$ |
| | $y_{2}=y_{1}+h(1/4*f(t_{1},k_{1})+3/4*f(t_{1}+2/3h,k_{2}))=1.141332181$ | $y_{2}=y_{1}+h(1/4*f(t_{1},k_{1})+3/4*f(t_{1}+2/3h,k_{2}))=1.141332181$ |
| $t_{3}=1.075$ |
| | $k_{1}=y_{2}=1.141332181$ | $f(t_{2},k_{1})=3.183536647$ | $k_{2}=y_{2}+2/3hf(t_{2},k_{1})=1.194391125$ |
| | $y_{3}=y_{2}+h(1/4*f(t_{2},k_{1})+3/4*f(t_{2}+2/3h,k_{2}))=1.227417567$ | $y_{3}=y_{2}+h(1/4*f(t_{2},k_{1})+3/4*f(t_{2}+2/3h,k_{2}))=1.227417567$ |
| $t_{4}=1.1$ |
| | $k_{1}=y_{3}=1.227417567$ | $f(t_{3},k_{1})=3.796866512$ | $k_{2}=y_{3}+2/3hf(t_{3},k_{1})=1.290698676$ |
| | $y_{4}=y_{3}+h(1/4*f(t_{3},k_{1})+3/4*f(t_{3}+2/3h,k_{2}))=1.335079087$ | $y_{4}=y_{3}+h(1/4*f(t_{3},k_{1})+3/4*f(t_{3}+2/3h,k_{2}))=1.335079087$ |
As soluções numéricas correspondem aos valores sublinhados. Note que $f(t_{i},k_{1})$ foi calculado evitando refazer os cálculos em $y_{i}$s.