6.1.3 Equações Diferenciais Ordinárias — Métodos de Runge-Kuta — Método do Ponto Médio

O método do ponto médio é uma abordagem do tipo preditor-corretor, que utiliza o método de Euler para prever um valor \(y \) no ponto médio do intervalo. Isto é,

\( y_{i+1/2} = y_i + f(x_i, y_i) \frac{h}{2} \)

é usado como predito para calcular a inclinação do ponto médio:
\( y_{i+1/2}’ = f(x_{i+1/2}, y_{i+1/2}) \)

que é a aproximação da inclinação média para todo intervalo. Essa inclinação é então usada para extrapolar o novo valor de \(y\),
\( y_{i+1} = y_i + f(x_{i+1/2}, y_{i+1/2}) h \)

que é a fórmula do método do ponto médio.

 

1. Implementação

def integral_midpoint(f, xi, xe, y0, n=1e6):
    """
    Numerical integration for solve ODE's using Midpoint Method
 
    integral = integral_midpoint(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
 
    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 midpoint(x, y, h):
        pred = y + f(x, y) * h / 2.0
        corr = y + f(x + h / 2.0, pred) * h
        return (x + h, corr)
 
    def integrator(x, y, h, n):
        for i in xrange(n):
            (x, y) = midpoint(x, y, h)
        return y
 
    (y, x) = (y0, xi)
    h = abs(xe - xi) / n
    return integrator(x, y, h, int(n))

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

 

2. 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/.

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).