6.1.4 Equações Diferenciais Ordinárias — Métodos de Runge-Kuta — Métodos de Runge-Kuta de Segunda Ordem
1. Introdução
Os métodos de Runge-Kuta possuem a seguinte fórmula geral
onde é a função incremento, que assim como no método de Euler, representa a inclinação no i-ésimo intervalo. O objetivo da utilização dessa função é aproximar numericamente uma série de Taylor sem calcular as derivadas de ordem superior. Essa função incremento possui forma geral
onde os são constantes a serem determinadas e os termos são combinações lineares da função diferencial a ser resolvida
Assim, os ‘s são
$$k_1 = f(x_1, y_i) $$
$$k_2 = f(x_i + p_1 h, q_{11} k_1 h) $$
$$k_3 = f(x_i + p_2 h, y_i + q_{21} k_1 h + q_{22} k_2 h) $$
$$\vdots $$
$$k_n = f(x_i + p_{n-1} h, y_i + q_{n-1,1} k_1 h + q_{n-1,2} k_2 h + \cdots + q_{n-1,n-1} k_{n-1} h )$$
onde e são constantes a serem determinadas de forma que obedeçam as relações de recorrência dos .
Podemos utilizar vários níveis de aproximações. Isto é, utilizar os ’s de à . Além disso, existem infinitos valores para os ’s e ’s que podem ser utilizados nessas relações de recorrência. Sendo assim, vários métodos de Runge-Kuta podem ser deduzidos usando-se um número diferente de termos na função incremento.
Cada novo escolhido corresponde à ordem do método de Runge-Kuta. Ou seja, para temos o método de Runge-Kuta de segunda ordem, para temos o de terceira ordem e assim por diante. Das relações de recorrência, podemos observar que se utilizarmos apenas , temos o método de Euler, que equivale ao método de Runge-Kuta de primeira ordem.
Uma vez que a ordem do método é escolhida, devemos nos preocupar em encontrar os vetores , e . Cada elemento desses vetores pode ser obtido ao igualarmos termo a termo a equação
com a expansão em série de Taylor.
2. Métodos de Runge-Kuta de Segunda Ordem
Tomando , temos o método de RK de segunda ordem. Assim, com apenas elementos de escolhidos, temos que
onde
e
O próximo passo é determinarmos os valores de , , e . Para isso, decompomos em uma série de Taylor de segundo grau em termos de e :
em que deve ser determinado pela regra da cadeia
Utilizando as duas últimas equações acima, temos que
A série de Taylor para uma função de duas variáveis é definida por
Aplicando esse método para expandir , isto é,
Substituindo agora e na equação de segunda ordem, temos que
onde os termos abaixo devem valer o seguinte
$$a_1 + a_2 = 1 $$, $$a_2 p_1 = \dfrac{1}{2} $$, e $$a_2 q_{11} = \dfrac{1}{2} $$
Como temos três equações com quatro incógnitas, devemos escolher um valor para uma das incógnitas para determinar as outras três. Suponha que especifiquemos um valor para , com isso podemos determinar , e . Isto é,
$$a_1 = 1 – a_2 $$, $$p_1 = q_{11} = \dfrac{1}{2 a_2}$$
Note que é possível escolher infinitos valores para , o que determina infinitas fórmulas para resolver o Runge-Kuta de segunda ordem. Segue abaixo as escolhas mais frequentemente usadas.
2.1. Método de Heun
Escolhendo-se , temos que e . Esses parâmetros, quando substituídos na equação do método, nos fornece
onde
e
Observe que é a inclinação no início do intervalo e é a inclinação no final do intervalo. Assim, o Runge-Kuta de segunda ordem com o parâmetro escolhido como equivale ao método de Heun sem iteração.
2.2. Método do Ponto Médio
Quando escolhemos , temos que , o que nos dá
onde
e
que equivale ao método do ponto médio.
2.3. Método de Ralston
Ralston e Rabinowitz[1] demonstram que a escolha de fornece um limitante inferior para o erro de truncamento para o método de segunda ordem. Com esse valor, temos que , e temos
onde
e
3. Implementação
def integral_runge_kuta_order_2(f, xi, xe, y0, n=1e6, method=ralston):
"""
Numerical integration for solve ODE's using Second Order Runge-Kuta
integral = integral_runge_kuta_order_2(f, xi, xe, n=1e6)
INPUT:
* f: derivative function f(x, y) = dy/dx
* xi: beginning of integration interval
* xe: end of integration interval
* y0: initial estimative for y
* n: number of points used
* method: method used to solve a unique step (ralston, heun or midpoint)
return: \int_{xi}^{xe} f(x)
Author: Pedro Garcia [sawp@sawp.com.br]
see: http://www.sawp.com.br
License: Creative Commons
http://creativecommons.org/licenses/by-nc-nd/2.5/br/
Sep 2012
"""
def integrator(x, y, h, n):
for i in xrange(n):
(x, y) = method(f, x, y, h)
return y
(y, x) = (y0, xi)
h = abs(xe - xi) / n
return integrator(x, y, h, int(n))
Onde temos as variantes locais ralston, heun e midpoint, conforme demonstrado na seção anterior. Essas funções são passadas no parâmetro method da função acima implementada. Essas funções são implementadas abaixo.
def ralston(f, x, y, h):
k1 = f(x, y)
k2 = f(x + 0.75 * h, y + 0.75 * h * k1)
y1 = y + (0.333 * k1 + 0.6667 * k2) * h
x1 = x + h
return (x1, y1)
def midpoint(f, x, y, h):
k1 = f(x, y)
k2 = f(x + 0.5 * h, y + 0.5 * k1 * h)
y1 = y + k2 * h
x1 = x + h
return (x1, y1)
def heun(f, x, y, h):
k1 = f(x, y)
k2 = f(x + h, y + k1 * h)
y1 = y + (0.5 * k1 + 0.5 * k2) * h
x1 = x + h
return (x1, y1)
Observe que outras variantes podem ser passadas como parâmetro na função integral_runge_kuta_order_2. Assim, se desejarmos utilizar outras fórmulas decorrentes de outras escolhas de , podemos implementá-las de forma que sempre tenham a assinatura de entrada (f, x, y, h) e retorno (x1, y1).
Um exemplo de utilização dessas funções pode ser obtido em http://www.sawp.com.br/code/ode/runge_kuta_order_2.py.
4. Copyright
Este documento é 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/.