5.2 Integração Numérica — Regras de Simpson
1. Introdução
A regra do trapézio, conforme apresentada no post anterior, possui três características que a tornam inapropriada em alguns casos. A primeira propriedade que devemos salientar se dá na sua utilização em relação ao tamanho da aplicação. Isto é, para aplicações individuais em funções bem comportadas, a utilização da regra do trapézio é computacionalmente boa com acurácia suficiente. Contudo, se for necessário uma acurácia muito alta, a regra do trapézio exige um grande esforço computacional, havendo o risco dos cálculos envolvidos estourar a precisão do processador. Ainda que o esforço computacional possa ser desprezível nos computadores atuais, ele pode impactar no desempenho da aplicação quando há um intenso cálculo de integrais ou a própria função a ser integrada é muito complexa.
Os erros de arrendondamento podem limitar nossa habilidade de determinar integrais. Isso decorre tanto da palavra do computador quanto da grande quantidade de cálculos em ponto flutuante, que podem ir acumulando resíduos ao longo da computação. Assim, além de aplicarmos a regra do trapézio com segmentos menores, outra forma de obter uma estimativa mais acurada de uma integral é utilizar polinômios de grau mais alto para ligar os pontos. As fórmulas polinomiais para aproximação dessas integrais são chamadas de regras de Simpson.
2. Regra 1/3 de Simpson
A regra 1/3 de Simpson é obtida quando um polinômio interpolador de segundo grau é utilizado. Isto é, :
Se e forem designados por e e se for representado por um polinômio de Lagrange, temos que a integral acima é
Essa integral simplificada resulta em
onde . Essa equação é conhecida como a regra 1/3 de Simpson, sendo a segunda fórmula de Newton-Cotes.
2.1. Regra 1/3 em múltiplos intervalos
Assim como fizemos com a regra do trapézio, dividindo o intervalo de integração em diversos subintervalos, fazemos com a regra de Simpson para melhorarmos a estimativa da integral. Assim, ao dividirmos o intervalo em segmentos, temos
Tomando e , a integral é representada como
onde é substituído em cada parte dessa integral por
Assim, ao substituirmos a equação acima em cada integral individual, temos que
que pode ser expressa de uma forma mais simplificada:
3. Regra 3/8 de Simpson
De forma análoga à regra 1/3 e à regra do trapézio, a regra 3/8 consiste em tomar um polinômio aproximador. Nesse caso, tomamos a terceira fórmula de Newton-Cotes, :
que fornece a seguinte fórmula da regra 3/8 de Simpson
A figura abaixo demonstra a diferença da utilização dos métodos do trapézio (esquerda), regra de Simpson 1/3 (meio) e Simpson 3/8 (direita) para a função utilizando 2 partições. Como podemos ver, a escolha do método de interpolação tem grande implicação na acurácia da aproximação.
4. Implementação
Regra de Simpson 1/3:
def simpson13(f, xi, xe, n=10000):
"""
Numerical integration using the Simpson 1/3 Rule.
integral = simpson13(f, xi, xe, n=10000)
INPUT:
* f: function to be integrated
* xi: beginning of integration interval
* xe: end of integration interval
* n: number of interval divisions
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/
Jul 2012
"""
h = float(xe - xi) / n
s = lambda i: i % 2 == 0
fxi = lambda i: f(xi + i * h)
g = lambda i: s(i) * (2.0 * fxi(i)) + (not s(i)) * (4.0 * fxi(i))
sumatory = sum(map(g, xrange(1, n)))
integral = (fxi(0) + sumatory + fxi(n)) * (h / 3.0)
return integral
</p>
Regra de Simpson 3/8:
def simpson38(f, xi, xe, n=10001):
"""
Numerical integration using the Simpson 3/8 Rule.
integral = simpson38(f, xi, xe, n=10000)
INPUT:
* f: function to be integrated
* xi: beginning of integration interval
* xe: end of integration interval
* n: number of interval divisions
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/
Jul 2012
"""
h = float(xe - xi) / n
s = lambda i: i % 3 == 0
fxi = lambda i: f(xi + i * h)
g = lambda i: s(i) * (2.0 * fxi(i)) + (not s(i)) * (3.0 * fxi(i))
sumatory = sum(map(g, xrange(1, n)))
integral = (fxi(0) + sumatory + fxi(n)) * (3.0 * h / 8.0)
return integral
Um exemplo de utilização dessas funções pode ser obtido em http://www.sawp.com.br/code/integral/integrals_simpson.py.
5. 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/.