Escolar Documentos
Profissional Documentos
Cultura Documentos
Paulo J. S. Silva
12 de setembro de 2017
1 Integração Numérica
Imagine que estamos interessado em calcular a integral de uma função f em um intervalo [ a, b].
∫ b
I≡ f ( x )dx.
a
Em cálculo vimos que isso pode ser feito usando o teorema fundametal do cálculo sempre que conhecemos
uma primitiva de f . Infelizmente em alguns casos não conhecemos uma primitiva. Um exemplo interes-
sante é a integral ∫ x
2
e−t dt
2
erf( x ) = √
π 0
para qual não se conhece primitiva usando função usuais.
Há ainda outras situações em que o processo de calcular a intergral a partir de uma primitiva pode
ser indesejável ou impossível. Por exemplo, a expressão da primitiva pode ser muito complexa ou não
conhecemos a expressão explícita de f mas apenas temos f tabelada em alguns pontos.
Nesses casos uma possibilidade interessante é tentar realizar uma integração numérica de f , ou seja,
tentar encontrar aproximações da integral desejada usando fórmulas que envolvam apenas o cômputo da
função que se deseja integrar em alguns pontos pré-escolhidos ou mesmo nos pontos que temos à disposi-
ção. Vamos ver algumas alternativas para isso.
# Desenha f
plot(x, f(x))
1
plot([a, a], [0.0, f(a)], color="g")
plot([b, b], [0.0, f(b)], color="g");
Como podemos ver a fórmula simples de aproximação acima já acerta a primeira casa do resultado e
erro por pouco a segunda.
Agora como podemos melhorar isso? Basta seguir a ideia da definição de integral e subdividir o inter-
valo [ a, b] em n intervalos menores, isto é definir pontos a = x0 < x1 < x2 < . . . < xn = b. Para simplificar
vamos sempre considerar que os intervalos tem todos os mesmos tamanhos que chamaremos mais uma
2
vez de h. Podemos então usar a fórmula do trapézio em cada subintervalo e por fim somar todas as áreas
obtidas para a aproximar a área total. Ou seja fazemos
∫ b ( )
f ( x0 ) + f ( x1 ) f ( x1 ) + f ( x2 ) f ( x n −1 ) + f ( x n )
f ( x )dx ≈ h + +···+
a 2 2 2
( )
f ( x0 ) f ( xn )
=h + f ( x 1 ) + f ( x 2 ) + . . . + f ( x n −1 ) + ≡ Q TC [ f ].
2 2
Essa fórmula é conhecida com regra do trapézio composta. Vamos vê-la em ação.
In [3]: # Integracao numérica usando a regra dos trapezios composta com n + 1 pontos.
function TC(f, a, b, n=10)
h = (b - a) / n
integral = 0.5*(f(a) + f(b))
x = a + h
for i = 1:n-1
integral += f(x)
x += h
end
return h*integral
end
n = 10
I= F(b) - F(a)
println("Intergral exata: ", I)
aprox = TC(f, a, b, n)
println("Integral aproximada: ", aprox)
@printf "Erro relativo: %e\n" abs(I - aprox)/abs(I);
Também devemos destacar que a hipótese de que todos os subintervalos são do mesmo comprimento
apenas ajuda a simplificar a expressão, já que podemos usar a notação unificadora h para esse comprimento.
Caso os subintervalos tenham tamanhos distintos podemos ainda escrever
∫ b
( x1 − x0 )( f ( x0 ) + f ( x1 )) ( x2 − x1 )( f ( x1 ) + f ( x2 )) ( xn − xn−1 )( f ( xn−1 ) + f ( xn ))
f ( x )dx ≈ + +···+ ,
a 2 2 2
em que cada comprimento de subintervalo é aparece explicitamente.
Outra observação interessante é que a regra do trapézio composta é equivalente a primeiro aproximar-
mos a função f por uma spline linear para em seguida usarmos a integral da spline, que é exatamente
Q TC [ f ], como aproximação da integral de f . Nesse contexto é interessante vermos se somos capazes de
estimar o erro ao aproximar a integral, assim como conseguimos aproximar o erro em uma interpolação
polinomial ou por splines.
Para isso, vamos iniciar pensando na regra do trapézio simples. Nesse caso a fórmula do erro de inter-
polação por um polinômio de grau 1 garante que
f ′′ (ξ x )
∀ x ∈ [ a, b], ∃ξ x ∈ ( a, b), f ( x ) − p1 ( x ) = ( x − a)( x − b).
2!
Segue imediatamente que
3
∫ b ∫ b ∫ b ′′
f (ξ x )
I − QT [ f ] = f ( x )dx − p1 ( x )dx = ( x − a)( x − b)dx (1)
a a a 2
∫
f ′′ (η ) b
= ( x − a)( x − b)dx (2)
2 a
(b − a)3 ′′
=− f (η ) (3)
12
para algum η ∈ ( a, b). A segunda igualdade é consequência do teorema do valor médio para integrais
que pode ser usado porque ( x − a)( x − b) não troca de sinal no intervalo [ a, b].
Note que em particular se a segunda derivada de f em ( a, b) for identicamente nula, ou seja se f for
afim em [ a, b] então a integral aproximada é exatamente igual a integral de f como podíamos esperar.
O que essa fórmula nos ensina é que ela somente é interessante quando o tamanho do intervalo é pe-
queno. Se o intervalo de integração for grande teremos que subdividí-lo, usando a regra composta. No caso
podemos aplicar a fórmula de erro da integração em cada subintervalo o obteremos algo como:
Exemplo Quantos pontos no intervalo [0, 1] são necessários para estimar a integral
∫ 1
e− x dx
2
I=
0
4
In [4]: # Dados da funcao, primitiva e extremos de integracao.
f(x) = exp(-x.^2)
F(x) = sqrt(pi)/2.0*erf(x)
a = 0.0
b = 1.0
Vemos que com 26 pontos já conseguimos o erro menor que 10−4 , bem menos que os 41 estimados.
Em resumo temos uma regra bastante simples, que pode ser usada inclusive com intervalos irregulares
se as alterações óbvias forem feitas. O erro de integração com múltiplos intervalos cai com h2 .
Mas será que podemos fazer melhor do que isso?
em que h = (b − a)/2, ou seja a distância entre dois pontos de interpolação. Para ver que o polinômio acima
interpola f em a, m e b basta calcular o seu valor nesses pontos e ver que ele recupera os valores originais
f a = f ( a ), f m = f ( m ) e f b = f ( b ).
# Desenha f
plot(x, f(x), label=L"$f$")
5
legend()
In [6]: # Primitiva
F(x) = -cos(x) + sin(2*x)/2 + 0.1/3*x.^3
Agora como estender essa fórmula subdividindo o intervalo? Nesse caso precisamos de um número par
de pontos para poder separar os grupos em 3 em 3 com extremos comuns em um esquema semelhante ao
sugerido abaixo.
6
In [7]: axis([0.5, 2.5, 0.0, 1.5])
# Desenha f
a, b = 1.0, 2.0
z = linspace(a - 0.2, b + 0.2, 100)
plot(z, f(z))
7
construir n/2 intervalos e obtemos a fórmula
∫ b n/2 ∫ x2k n/2
h
I=
a
f ( x )dx = ∑ f ( x )dx ≈ ∑ 3
[ f ( x2k−2 ) + 4 f ( x2k−1 ) + f ( x2k )] ≡ QSC [ f ].
k =1 x2k−2 k =1
In [8]: # Dados
f(x) = sin(x) + 0.1*x.^2
F(x) = -cos(x) + 0.1/3.0*x.^3
# Integracao numérica usando a regra de Simpson composta com n + 1 pontos.
# n deve ser par
function SC(f, a, b, n=10)
h = (b - a) / n
integral = f(a) + f(b)
x = a + h
for i = 1:n-1
if i % 2 == 0
integral += 2*f(x)
else
integral += 4*f(x)
end
x += h
end
return (h/3)*integral
end
n = 10
I = F(b) - F(a)
aproxTC = TC(f, a, b, n)
aproxSC = SC(f, a, b, n)
println("Integral exata: ", I)
println("Aproximaçãopor trapézios compostos: ", aproxTC)
println("Aproximaçãopor Simposon composta: ", aproxSC)
@printf "Erro relativo ao usar trapézios compostos: %e\n" abs(I - aproxTC)/abs(I)
@printf "Erro relativo ao usar Simpson composta: %e\n" abs(I - aproxSC)/abs(I)
Veja que o resultado obtido pelo emprego da regra de Simpson composta é bem melhor do que o re-
sultado obtido pela regra dos trapézios composta. Uma limitação da regra Simpson é que ela assume que
os intervalos entre os pontos são sempre de mesmo comprimento, isso foi usando quando apresentamos a
fórmula do polinômio interpolador de segundo grau.
No caso da regra de Simpson é também possível estimar o erro esperado e observar que, qualitativa-
mente, ele deve ser menor do que o erro da regra dos trapézios. De fato, usando uma análise semelhante
a feita no caso dos trapézios podemos obter a seguinte expressão para o erro na regra de Simpson em um
intervalo.
8
∫ b ∫ b ∫ b ′′′
f (ξ x )
| I − QS [ f ]| = f ( x )dx − p2 ( x )dx = ( x − a)( x − m)( x − b)dx (7)
a a a 3!
∫ b ′′′
| f (ξ x )|
≤ |( x − a)( x − m)( x − b)dx | (8)
a 3!
∫
| f ′′′ (η )| b
= |( x − a)( x − m)( x − b)|dx, η ∈ ( a, b) (9)
6 a
( )
| f ′′′ (η )| 1 b − a 4
= , η ∈ ( a, b) (10)
6 2 2
| f ′′′ (η )|h4
= , η ∈ ( a, b). (11)
12
De novo usamos o teorema do valor intermediário para integrais na passagem mais complicada e o fato
que h = (b − a)/2. Compare com o resultado obtido para o caso do método dos trapézios em particular
observe que há uma tendência do erro ser menor já que a potência do h é maior.
Agora, uma análise um pouco mais sofisticada da expressão original permite provar que:
f (4) ( η ) h 5
I − QS [ f ] = − , η ∈ ( a, b).
90
Note que, como o erro depende da derivada quarta de f , se a função original for um polinômio de grau até
3 o erro será zero. Isso é mais do que era esperado pela estratégia de construção da regra já que polinômio
interpolador usado foi de grau 2. A potência real de h também é maior, aumentando para 5. Esse fenômeno
poderá ser melhor entendio abaixo quando falarmos de quadratura gaussiana. Mas de qualquer forma
podemos verificar isso empirifamente com o programa:
Como você pode ver os dois valores diferem apenas dentro do epsilon da máquina, como a fórmula
acima previa!
Agora que sabemos o que ocorre com a regra simples, podemos estimar o que ocorre na regra de Simp-
son composta. Mais uma vez fazendo uma somatória obtemos.
n h 5 (4) ( b − a ) h 4 (4)
I − QSC [ f ] = − f (η ) = − f ( η ), η ∈ ( a, b).
2 90 180
Veja que o erro cai com h4 que é potencialmente bem menor do que h2 para h pequeno. Isso confirma o
resultado numérico obtido quando comparamos as duas regras.
Podemos usar esses limitantes para obter estimativas do número necessários de pontos para conseguir
uma precisão desejada, ou qual a precisão mínima esperada se usarmos uma quantidade de pontos dada.
9
Exemplo Em quantos pontos são necessários para particionar o intervalo [0, 1] para estimar a integral
∫ 1
e− x dx
2
3)e− x . Obtemos então 12 como limitante de M4 , já que o polinômio e a exponencial atingem máximo em
2
x = 0. Teremos
( b − a ) h4 h4
| I − QSC | ≤ M4 ≤ 12 ≤ 10−4 =⇒ (12)
180 180
h4 ≤ 15 · 10−4 . (13)
Como h = (b − a)/n, obtemos n ≥ 5, 09, basta tomar n ≥ 6 (lembre que temos que tomar n par também,
nesse caso isso veio naturalmente). Vamos verificar com o programa.
1.3 Newton-Cotes
Como já vimos, uma forma simples de gerar novas regras de aproximação de integrais é escolher pontos
dentro do intervalo integração na forma a = x0 < x1 < . . . < xn = b e passar por esses pontos um
polinômio interpolador. Tipicamente esses pontos intermediários são igualmente espaçados. Essa foi a
forma que usamos para obter as regras do trapézio e de Simpson.
Por outro lado, lembrando da expressão geral do polinômio interpolador, dada por Legendre, temos
para um polinômio de grau arbitrário:
∫ b ∫ b
I= f ( x )dx ≈ pn ( x )dx (14)
a a
∫ b n
=
a k =0
∑ f ( xk )lkn ( x )dx (15)
n ∫ b
= ∑ f ( xk )
a
lkn ( x )dx. (16)
k =0
∫b n
Se chamarmos de Ak os valores a lk ( x ) dx, k = 0, . . . , n, temos a fórmula
∫ b n
I=
a
f ( x )dx ≈ ∑ A k f ( x k ) ≡ Q n [ f ].
k =0
Ou seja, as integrais são aproximadas por somatórias de pesos Ak vezes os valores de f nos pontos xk .
Além disso essa fórmula nos mostra que para definir uma dessas regras basta encontrar os pesos Ak . Esses
podem ser obtidos integrando os polinômios de Legendre o que precisa ser feito uma única vez.
10
Outra possibilidade é lembrar que os pesos Ak devem ser escolhidos para garantir que a integral de
polinômios de ordem até n sejam exatas. Como a integral da soma é a soma das integrais isso pode ser
garantido simplesmente pedindo que as equações
∫ b
Qn [ x k ] = x k dx, k = 0, . . . , n
a
∫ b
1dx = (b − a) = A0 + A1 + A2 [Aqui f ( x ) = x0 = 1] (17)
a
∫ b
b2 − a2 a+b
xdx = = A0 a + A1 + A2 b [Aqui f ( x ) = x ] (18)
a 2 2
∫ b
b3 − a3 ( a + b )2
x2 dx = = A0 a2 + A1 + A2 b2 [Aqui f ( x ) = x2 ]. (19)
a 3 4
O que fornece um sistema de três equações com três icógnitas. Esse sistema pode fer facilmente resol-
vido no computador para um caso específico em que a e b são conhecidos, obtendo assim os respectivos
A0 , A1 , A3 . De fato, esse sistema pode ser resolvido de forma genérica dando
b−a 4( b − a )
A0 = A2 = , A1 = .
6 6
Substituindo na fórmula geral da integral obtemos exatamente a fórmula de Simpson
∫ b [ ( ) ]
n
b−a a+b
I=
a
f ( x )dx ≈ ∑ Ak f ( xk ) =
6
f ( a) + 4 f
2
+ f (b) ,
k =0
lembre que o h que aparece na fórmula original é metade do comprimento do intervalo e assim as duas
fórmulas são iguais.
Essa mesma estratégia pode ser usada para obter fórmulas para polinômios de qualquer grau, seguindo
o seguinte roteiro, conhecido como abordagem de Newton-Cotes.
Em geral não é bom usar polinômios de grau muito alto, pelos menos problemas já citados quando
vimos interpolação polinomial. Nesse caso a solução natural para usar mais pontos é fazer uma variante
de fórmula compondo intervalos consecutivos.
11
1.4 Quadratura Gaussiana
Vimos nas fórmulas de Newton-Cottes que podemos aproximar
∫ b n
I=
a
f ( x )dx ≈ ∑ A k f ( x k ),
k =0
∫ 1
Q [1] = 1dx = 2 = A0 + A1
−1
∫ 1
Q[ x ] = xdx = 0 = A0 x0 + A1 x1
−1
∫ 1
2
Q[ x2 ] = x2 dx = = A0 x02 + A1 x12
−1 3
∫ 1
Q[ x3 ] = x3 dx = 0 = A0 x03 + A1 x13
−1
Note que o sistema obtido é não linear, sendo então muito mais complexo para resolver que o sistema
linear de uma fórmula de Newton-Cottes. Com algum esforço podemos resolver o sistema acima obtendo
√
3
A0 = A1 = 1, x0 = − = − x1 .
3
O que nos dá a fórmula de Gauss-Legendre de integração:
∫ 1
( √ ) ( √ )
3 3
I= f ( x )dx ≈ f − +f − .
−1 3 3
Que usando apenas dois pontos consegue ser exata para polinômios de grau até 3.
Observe que o o fato do intervalo de integração ser fixo [−1, 1] não é de grande importância. A integral
de uma função em um intervalo qualquer [ a, b] pode ser transformada na integral de uma outra semelhante
em [−1, 1] que é obtida da função original através de translação e mudança de escala dos argumentos.
Pense em como fazer isso.
Vamos implementar a regra de Gauss-Legendre e comparar com o método do Trapézio.
In [34]: # Dados
f(x) = exp(-x.^2)
F(x) = sqrt(pi)/2.0*erf(x)
a = -1.0
b = 1.0
12
# Integracao numérica usando a regra de Gauss Legenre para [-1, 1].
function GL(f)
arg = sqrt(3)/3
return f(-arg) + f(arg)
end
I = F(1) - F(-1)
aproxT = TC(f, -1, 1, 1)
aproxGL = GL(f)
@printf "Erro relativo com a regra do trapézio: %e\n" abs(I - aproxT)/abs(I)
@printf "Erro relativo com a regra de Gauss-Legendre: %e\n" abs(I - aproxGL)/abs(I)
É claro que também é possível fazer uma versão composta da regra de Gauss-Legendre, que resulta em
bons resultados com poucas avaliações das funções.
Isso pode ser generalizado para polinômios de grau mais alto usando-se a ideia de polinômios ortogo-
nais. Porém isso foge ao escopo do curso.
In [ ]:
13