Assim como nas ordens menores, o método de Butcher consiste em utilizar ordens superiores para resolver a EDO numericamente. Uma fórmula a ser utilizada é:

$$ y_{i+1} = y_i + \frac{1}{90} (7 k_1 + 32 k_3 + 12 k_4 + 32 k_5 + 7 k_6) h $$

onde


$$k_1 = f(x_i, y_i) $$

$$k_2 = f(x_i + \frac{1}{4} h, y_i + \frac{1}{4} k_1 h) $$

$$k_3 = f(x_i + \frac{1}{4} h, y_i + \frac{1}{8} k_1 h + \frac{1}{8} k_2 h) $$

$$k_4 = f(x_i + \frac{1}{2} h, y_i – \frac{1}{2} k_2 h + k_3 h) $$

$$k_5 = f(x_i + \frac{3}{4} h, y_i + \frac{3}{16} k_1 h + \frac{9}{16} k_4 h) $$

e


$$k_6 = f(x_i + h, y_i – \frac{3}{7} k_1 h + \frac{2}{7} k_2 h + \frac{12}{7} k_3 h – \frac{12}{7} k_4 h + \frac{8}{7} k_5 h)$$

Se voltarmos ao post onde discutimos sobre a Regra de Boole, notaremos a similaridade daquela fórmula com o método de Butcher. Fórmulas como essa, que utilizam são menos comuns porque o ganho de acurácia começa a ser mínimo, enquanto o custo computacional tende a aumentar.

 

1. Implementação

 

def butcher(f, x, y, h):
    k1 = f(x, y)
    k2 = f(x + 0.25 * h, y + 0.25 * k1 * h)
    k3 = f(x + 0.25 * h, y + 0.125 * k1 * h + 0.125 * k2 * h)
    k4 = f(x + 0.5 * h, y - 0.5 * k2 * h + k3 * h)
    k5 = f(x + 0.75 * h, y + 0.1875 * k1 * h + 0.5625 * k4 * h)
    (a1, a2, a3, a4) = (-3.0 / 7.0, 2.0 / 7.0, 12.0 / 7.0, 8.0 / 7.0)
    delta = a1 * k1 * h + a2 * k2 * h + a3 * k3 * h - a3 * k4 * h + a4 * k5 * h
    k6 = f(x + h, y + delta)
    y1 = y + (1.0 / 90) * (7 * k1 + 32 * k3 + 12 * k4 + 32 * k5 + 7 * k6) * h
    x1 = x + h
    return (x1, y1)

Um exemplo de utilização dessa função pode ser obtido em http://www.sawp.com.br/code/ode/runge_kuta_order_5.py.

 

Este documento está disponível sob a licença Creative Commons. As regras dos direitos de cópia deste conteúdo estão acessíveis em http://creativecommons.org/licenses/by-nc-nd/2.5/br/.

References


[1] Anthony Ralston and Philip Rabinowitz, A First Course in Numerical Analysis (2nd ed.), McGraw-Hill and Dover, (2001).
[2] N.B Franco, Cálculo Numérico, Pearson Prentice Hall (2006).