Escolar Documentos
Profissional Documentos
Cultura Documentos
2 Derivação Numérica 27
2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2 Fórmulas clássicas de diferença finita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.1 Fórmula de diferença adiantada (forward difference) . . . . . . . . . . . . . . . . . . . 27
2.2.2 Fórmula de diferença atrasada (backward difference) . . . . . . . . . . . . . . . . . . . 28
2.2.3 Fórmula de diferença centrada (centered difference) . . . . . . . . . . . . . . . . . . . . 28
2.2.4 Fórmula de 5 pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Fórmulas de diferenças finitas para a derivada segunda . . . . . . . . . . . . . . . . . . . . . . 30
2.3.1 Fórmula de três pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.2 Fórmula de cinco pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4 Fórmulas para o cálculo de derivadas em pontos fora da rede . . . . . . . . . . . . . . . . . . 30
2.4.1 Derivada de três pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.2 Derivada de quatro pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.3 Derivada de cinco pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5 Extrapolação de Richardson e estimativa de erro . . . . . . . . . . . . . . . . . . . . . . . . . 31
i
ii SUMÁRIO
3 Integração Numérica 37
3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2 Fórmulas de Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1 Fórmulas fechadas de Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1.1 Regra trapezoidal (N = 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.1.2 Regra de Simpson (N = 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.1.3 Regra de Simpson dos 3/8 (N = 3) . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.1.4 Regra de Bode (N = 4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.1.5 Regras em ordens mais altas (N > 5) . . . . . . . . . . . . . . . . . . . . . 42
3.2.2 Fórmulas abertas de Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.3 Fórmulas fechadas estendidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.3.1 Regra trapezoidal estendida . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.3.2 Regra de Simpson estendida . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.4 Estimativas de erro nas fórmulas de Newton-Cotes . . . . . . . . . . . . . . . . . . . . 45
3.3 Quadratura gaussiana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3.1 Idéia básica na quadratura gaussiana . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.2 Fórmulas gaussianas clássicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.2.1 Fórmula de Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3.2.2 Fórmula da Gauss-Chebyshev . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3.2.3 Fórmula de Gauss-Laguerre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.2.4 Fórmula de Gauss-Hermite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4 Integração automática e adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.4.1 Integração de Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.4.2 Integração automática usando quadraturas gaussianas . . . . . . . . . . . . . . . . . . 60
3.4.3 Integração adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
[3] S. D. Conte and C de Boor, Elementary numerical analysis. an algorithmic approach, third ed., Inter-
national series in pure and applied mathematics, McGraw-Hill, New York, 1980, 432 + xii pp.
[4] M. Cristina C. Cunha, Métodos Numéricos, segunda ed., Unicamp, Campinas, 2000, 216 pp.
[5] Rudi Gaelzer, Introdução ao Fortran 90/95, http://www.ufpel.edu.br/ rudi/grad/ModComp/Aposti-
la/Apostila.html, Pelotas, November 2006, 138 + vi pp.
[6] D. Goldberg, What every computer scientist should know about floating point arithmetic, ACM Com-
puting Surveys 23 (1991), 5–48.
[7] Sebastião Cícero Pinheiro Gomes, Métodos Numéricos: Teoria e Programação, FURG, Rio Grande,
1999, 190 pp.
[8] Joe D. Hoffman, Numerical methods for engineers and scientists, second ed., Marcel Dekker, New York,
2001, 823 + xi pp.
[9] Rubin H. Landau and Manuel José Páez Mejiá, Computational physics. Problem solving with computers,
John Wiley & Sons, New York, 1997, 511 + xviii pp.
[10] D. E. Müller, A method of solving algebraic equations using automatic computer, Mathematical Tables
and Other Aids to Computation 10 (1956), 208–215.
[11] Tao Pang, An introduction to computational physics, second ed., Cambridge University Press, New
York, 2006, 385 + xvi pp.
[12] W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery, Numerical recipes in fortran 90,
Fortran Numerical Recipes, vol. 2, Cambridge, New York, 1997, 552 pp.
[13] John R. Rice, Numerical Methods, Software, and Analysis, McGraw-Hill, New York, 1983, 483 + xii
pp.
[14] Germán Ramón Canahualpa Suazo, Apostila de Cálculo Numérico, DME - IFM - UFPel, Pelotas,
November 2004, 117 + vii pp.
[15] David M. Young and Robert Todd Gregory, A Survey of Numerical Mathematics, vol. I, Dover, New
York, 1988, 548 + x pp.
iii
iv REFERÊNCIAS BIBLIOGRÁFICAS
Neste capítulo serão considerados aspectos básicos a respeito do cálculo numérico: a representação de
números inteiros e de ponto flutuante em código binário e as fontes de erros que invariavelmente ocorrem
quando se faz necessário usar uma representação finita para representar um número ou uma função mate-
mática que, em geral é transcendental e/ou necessita de uma soma ou produto infinito de números para ser
exatamente representado.
Na discussão que será feita a respeito das fontes de erro em cálculo numérico, não serão considerados erros
triviais que podem ser evitados, tais como copiar uma fórmula erroneamente ou realizar um erro de sintaxe
na programação, muito embora tais erros ocorram e perfaçam uma fração considerável do esforço e do tempo
dispendidos ao se trilhar as três fases mencionadas acima.
Neste capítulo estaremos somente interessados nos erros que resultam ser inevitáveis, dada a própria
natureza da representação finita de números em um computador e/ou da implementação numérica de um
determinado cálculo. As incertezas introduzidas contaminam a solução e é importante tentar-se balancear
as incertezas. Se a incerteza no modelo matemático é de 1%, então não faz sentido a implementação de um
modelo numérico e de um método que atinja 6 dígitos de precisão, por exemplo.
O diagrama da figura 1.1 ilustra o processo usualmente percorrido quando se busca uma solução para
um problema físico real a partir de uma modelagem, inicialmente matemática, seguida por uma modelagem
computacional e, finalmente, passando pela implementação do método numérico a partir da modelagem
computacional, seguida pela obtenção dos resultados. As incertezas ocorrem desde a fase de modelagem
matemática até a solução numérica. Neste capítulo, serão abordadas algumas fontes de incertezas na etapas
de modelagem computacional e implementação do método numérico.
Implementação do Método
Solução
-
Figura 1.1: Diagrama que representa o processo de solução numérica de um problema físico real, indicando em que
etapas entram as incertezas.
N = (an an−1 . . . a1 a0 )b .
A contribuição de cada dígito para o valor de N fica explicitada na forma polinomial, onde N é escrito
como:
N = an bn + an−1 bn−1 + · · · + a1 b + a0 . (1.1)
Até este momento, N tem sido tratado de uma forma abstrata. Por uma questão evolutiva, N tende a
ser visto como um número na base 10 (decimal),
Caso se passe a representar N sempre na base decimal, então deve-se abordar as outras representações do
ponto de vista de conversões de ou para a base 10.
N 2
r q
1
0 2
r q
2
1 2
r q
2 3
..
.
qn−1 2
rn−1 q
n
N = (qn rn−1 . . . r2 r1 r0 )2
ou
N = qn 2n + rn−1 2n−1 + · · · + r2 22 + r1 21 + r0 20 .
12 = (1100)2
25 = (11001)2
315 = (100111011)2 .
O mesmo método pode ser utilizado para converter N para qualquer base b; divide-se N e os sucessivos
quocientes qi por b até que o último quociente seja um inteiro 0 6 qn 6 b − 1:
N b
r q
1
0 b
r q
2
1 b
r q
2 3
..
.
qn−1 b
rn−1 q
n
Desta forma,
N = (qn rn−1 . . . r2 r1 r0 )b
= qn bn + rn−1 bn−1 + · · · + r2 b2 + r1 b1 + r0 b0 .
Assim,
12 = (14)8 = (C)16
25 = (31)8 = (19)16
315 = (473)8 = (13B)16 .
O programa 1.1 implementa o método das divisões sucessivas para a conversão de qualquer número
inteiro da base 10 para a base 2.
Programa 1.1: Converte um número da base 10 para a base 2. Caso o número seja negativo, o bit de sinal é utilizado.
program c o n v e r s o r
i m p l i c i t none
integer , parameter : : b a s e= 2
integer : : i , j , qn , rn , num , num_abs
real , parameter : : l o g 2= 0 . 6 9 3 1 4 7 1 8 0 5 5 9 9 4 5 3 0 9 4 2
integer , DIMENSION( : ) , ALLOCATABLE : : b
!
write ( ∗ , fmt= ’ ( a ) ’ , advance= ’ no ’ ) ’ Numero na b a s e 1 0 : ’
read ∗ , num
s e l e c t case (num)
case ( 0 )
allocate (b ( 1 ) )
b= 0
case (: −1)
!
! Nes te caso , o v e t o r i r a a l o c a r um d i g i t o a mais e a t r i b u i r o v a l o r 1
! ao u l t i m o d i g i t o , como convencao para s i n a l n e g a t i v o .
!
num_abs= abs (num)
j= l o g ( r e a l ( num_abs ) ) / l o g 2
allocate (b ( 0 : j + 1))
qn= num_abs
do i= 0 , j
rn= mod( qn , b a s e )
qn= qn/ b a s e
b ( j − i + 1)= rn
end do
b(0)= 1
case ( 1 : )
j= l o g ( r e a l (num) ) / l o g 2
allocate (b ( 0 : j ))
qn= num
do i= 0 , j
rn= mod( qn , b a s e )
qn= qn/ b a s e
b ( j − i )= rn
end do
end s e l e c t
j= s i z e ( b )
write ( ∗ , fmt= ’ ( "A forma b i n a r i a e : " ) ’ , advance= ’ no ’ )
do i= 1 , j − 1
write ( ∗ , fmt= ’ ( i 1 ) ’ , advance= ’ no ’ ) b ( i − 1 )
end do
write ( ∗ , fmt= ’ ( i 1 ) ’ ) b ( j − 1 )
!
end program c o n v e r s o r
Ou seja,
0, 8125 = (0, 1101)2 .
0, 1 0, 2 0, 4 0, 8 0, 6 0, 2
×2 ×2 ×2 ×2 ×2 ×2 ···
0, 2 0, 4 0, 8 1, 6 1, 2 0, 4
0, 1 = (0, 0001100110011 . . . )2 .
0, 5225 0, 0450 0, 0900 0, 1800 0, 3600 0, 7200 0, 4400 0, 8800 0, 7600 0, 5200
×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2
1, 0450 0, 0900 0, 1800 0, 3600 0, 7200 1, 4400 0, 8800 1, 7600 1, 5200 1, 0400
0, 0400 0, 0800 0, 1600 0, 3200 0, 6400 0, 2800 0, 5600 0, 1200 0, 2400 0, 4800
×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 .
0, 0800 0, 1600 0, 3200 0, 6400 1, 2800 0, 5600 1, 1200 0, 2400 0, 4800 0, 9600
Ou seja,
0, 5225 = (0, 10000101110000101000 . . . )2 .
Este exemplo mostra que em um computador, onde o espaço para representação de um número é finito, este
número terá que ser arredondado.
A forma polinomial de um número fracionário é dada por:
Xi = 75 = (1001011)2
e
Xf = 0, 8 = (0, 110011001100 . . . )2 .
Portanto,
75, 8 = (1001011, 110011001100 . . . )2 .
Para converter um número fracionário da base decimal para uma base b, também aplica-se o método das
multiplicações sucessivas, que, neste caso, consiste em multiplicar o número por b e extrair a parte inteira
(podendo ser 0). O resto fracionário é multiplicado novamente por b e a parte inteira é extraída. Este
processo deve ser repetido até sobrar o resto igual a 0 ou até se observar um padrão repetitivo.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
6 1.2. Representação de números em diferentes bases
1.2.3 Conversão de números inteiros da base b para a base decimal
Para introduzir a conversão para a base decimal, será usada novamente a base binária como um primeiro
exemplo. Seja o número N , representado por
N = (am · · · a2 a1 a0 )2 ,
a sua representação na base decimal pode ser obtida simplesmente pela soma do polinômio
N = am 2m + · · · + a2 22 + a1 21 + a0 .
bm = am ,
bm−1 = am−1 + 2bm ,
bm−2 = am−2 + 2bm−1 ,
.. .. ..
. . .
b1 = a1 + 2b2 ,
b0 = a0 + 2b1 .
E então,
N = b0 .
am am−1 ··· a2 a1 a0
2 2bm ··· 2b3 2b2 2b1
bm bm−1 ··· b2 b1 b0
e, novamente,
N = b0 .
b4 = a4 = 1,
b3 = a3 + 2b4 = 1 + 2.1 = 3,
b2 = a2 + 2b3 = 1 + 2.3 = 7,
b1 = a1 + 2b2 = 0 + 2.7 = 14,
b0 = a0 + 2b1 = 1 + 2.14 = 29.
1 1 1 0 1
2 2 6 14 28
1 3 7 14 29
Portanto,
(11101)2 = 29.
Esta metodologia pode ser generalizada para converter qualquer número inteiro na base b para a base
decimal. Considere o número
N = (am . . . a2 a1 a0 )b .
Usando o Algoritmo de Horner, por exemplo, temos a seqüencia
cm = am ,
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 1. Representação de Números e Erros 7
cm−1 = am−1 + bcm ,
cm−2 = am−1 + bcm−1 ,
.. .. ..
. . .
c1 = a1 + bc2 ,
c0 = a0 + bc1
e, novamente,
N = c0 .
Xf = (0, α1 α2 . . . αn )2 .
Esta soma pode ser calculada diretamente ou utilizando qualquer um dos dois métodos enunciados na seção
1.2.3, com algumas modificações.
bn = αn ,
1
bn−1 = αn−1 + bn ,
2
1
bn−2 = αn−2 + bn−1 ,
2
.. .. ..
. . .
1
b2 = α2 + b3 ,
2
1
b1 = α1 + b2 ,
2
1
b0 = b1 .
2
Então,
N = b0 .
am am−1 ··· a2 a1 0
1 1 1 1 1
bm ··· b3 b2 b1
2 2 2 2 2
bm bm−1 ··· b2 b1 b0
b5 = α5 = 1,
1 1 3
b4 = α4 + b5 = 1 + .1 = ,
2 2 2
1 1 3 7
b3 = α3 + b4 = 1 + . = ,
2 2 2 4
1 1 7 7
b2 = α2 + b3 = 0 + . = ,
2 2 4 8
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
8 1.2. Representação de números em diferentes bases
1 1 7 23
b1 = α1 + b2 = 1 + . = ,
2 2 8 16
1 23
b0 = b1 = .
2 32
Portanto,
23
(0, 10111)2 =
= 0, 71875.
32
Uma outra situação que pode ocorrer é quando o número binário for infinito, por exemplo, através de
uma seqüência de dígitos periódicos:
Xf = 0, α1 α2 . . . αn β1 β2 . . . βm 2 ,
onde β1 β2 . . . βm indica que a seqüência de dígitos β1 β2 . . . βm se repete ad infinitum. Na base decimal, tal
número é dado por
Xf = α1 2−1 + α2 2−2 + · · · + αn 2−n + β1 2−n−1 + β2 2−n−2 + · · · + βm 2−n−m
+ β1 2−n−m−1 + β2 2−n−m−2 + · · · + βm 2−n−2m
+ β1 2−n−2m−1 + β2 2−n−2m−2 + · · · + βm 2−n−3m
+··· .
Observa-se que este número pode ser escrito como
Xf = α1 2−1 + α2 2−2 + · · · + αn 2−n + β1 2−1 + β2 2−2 + · · · + βm 2−m 2−n
+··· ,
Xf = α1 2−1 +α2 2−2 +· · ·+αn 2−n + β1 2−1 + β2 2−2 + · · · + βm 2−m 2−n 1 + 2−m + 2−2m + 2−3m + · · · .
Para somar números com mais de 2 algarismos, o mesmo processo de transporte para a coluna posterior,
utilizado na adição decimal, é empregado. Por exemplo, se 1 = (01)2 e 3 = (11)2 , então
Deve-se ressaltar que a operação 0 - 1 resulta em 1, porém com o transporte de 1 para a coluna à esquerda,
que deve ser acumulado ao subtraendo e, por conseqüência, subtraído do minuendo. Por exemplo, se
7 = (111)2 e 4 = (100)2 , então
7 − 4 = (111)2 − (100)2 = (11)2 = 3.
Outro exemplo, se 10 = (1010)2 e 8 = (1000)2 , então
A divisão binária é um procedimento um tanto mais complicado e não será abordado aqui.
sendo {a0 , a1 , . . . , aq−1 } ∈ {0, 1, . . . , b − 1}, com aq−1 representando o sinal do número. Esta seqüência de
dígitos é denominada palavra. Por exemplo, no sistema binário convenciona-se usar aq−1 = 0 para “+” e
aq−1 = 1 para “−”.
A conversão do número internamente representado por (1.2) para o sistema decimal é realizado através
de uma fórmula semelhante à forma polinomial (1.1):
q−2
X
N =s× ak × bk , (1.3)
k=0
sendo
• N o número inteiro na base decimal.
• s o sinal (ou +1 ou −1).
• q − 1 o número de dígitos disponível para representar o valor absoluto de N .
• b a base, às vezes denominada de radix (um inteiro maior que 1).
• ak um dígito válido na representação (0 6 ak < b), k = 0, 1, . . . , q − 1.
Os valores em questão para as quantidades em (1.3) dependem da arquitetura e do compilador em uso.
Exemplo 1.8. O compilador Intel Fortran 95 [1] possui 4 modelos de representação de inteiros com 1, 2,
4 e 8 bytes, também denominados de espécies. Sendo para todos os casos b = 2, o valor absoluto do maior
número inteiro que pode ser representado internamente para cada espécie Nmax p
, (p = 1, 2, 4, 8) é, a partir
de (1.3),
127, para p = 1;
8p−2 32.767, para p = 2;
X
p
Nmax = 2k = 1 + 2 + 22 + · · · + 28p−2 = 28p−1 − 1 =
2.147.483.647, para p = 4;
k=0
9.223.372.036.854.775.807, para p = 8.
Outras representações de números inteiros em computadores existem, como por exemplo as representa-
ções complemento de 1 ou complemento de 2 [15]; porém, estas não serão discutidas aqui.
A representação de um número inteiro em um computador é exata. Operações aritméticas entre números
inteiros também é exata, sob as seguintes condições:
1. o resultado não pode se encontrar fora do intervalo de números inteiros que podem ser representados;
2. a divisão somente pode ser realizada entre números exatamente divisíveis, isto é, a parte fracionária
deve ser nula.
x = s × (0, d1 d2 . . . dn ) × be , (1.4)
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 1. Representação de Números e Erros 11
Figura 1.2: Representações de ponto flutuante para alguns números em uma palavra típica de 32 bits (4 bytes).
Tabela 1.2: Valores de n, emin , emax , xmin , xmax e xeps para o compilador Intel Fortran.
o qual está escrito em uma forma legível para seres humanos. Além das quantidades já definidas, em (1.4)
os dígitos d1 , d2 , . . . , dn são limitados pela base b e o expoente é limitado ao intervalo emin 6 e 6 emax .
Adicionalmente, n > 1 é denominado de número de dígitos do sistema e define o tamanho da mantissa
M = 0, d1 d2 . . . dn .
Contudo, um computador somente pode representar os valores de e e E através de dígitos na base b. Um
computador digital (b = 2), por exemplo, dispõe sempre de um tamanho de palavra finito, isto é, o número
total de bits que podem ser utilizados para representar s (1 bit), a parte exponencial e a mantissa é sempre
fixo, para uma dada espécie de variável real. Um número real de precisão simples, por exemplo, é tipicamente
representado por uma palavra de 4 bytes ou 32 bits, sendo que 1 bit é utilizado para representar o sinal,
enquanto que 8 bits são utilizados para representar a parte exponencial, restando 23 bits para representar
a mantissa. Desta forma, tal número será representado na memória do computador como
onde {s, e0 , . . . , e7 , d1 , . . . , d23 } = {0, 1}. A figura 1.2 ilustra representações em 4 bytes de alguns números.
Uma descrição mais aprofundada acerca da representação binária de números em computadores digitais
pode ser obtida em [15, seção 2.5].
A conversão do número x representado em (1.4) para a base decimal pode ser realizada pela fórmula
polinomial
Xn
x = s × be × dk × b−k .
k=1
Como exemplo, a tabela 1.2 mostra os valores de n, emin e emax para o compilador Intel Fortran.
Para uma base b qualquer, denotando este sistema pelo símbolo
Valores para xmin válidos para o compilador Intel Fortran são apresentados na tabela 1.2. Isto significa
que qualquer número x tal que
−xmin < x < xmin
não poderá ser representado pelo computador. Esta ocorrência é denominada underflow. Os compi-
ladores podem ser instruídos ou a parar o processamento neste ponto, disparando uma mensagem de
erro, ou a seguir o processamento arredondando x = 0.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
12 1.4. Representação de números em computadores digitais
• O maior número positivo que pode ser representado neste sistema é
n
!
X
xmax = 0, (b − 1) (b − 1) . . . (b − 1) ×b emax
= (b − 1) × −k
× bemax = 1 − b−n bemax .
b
| {z }
k=1
n vezes
Valores para xmax válidos para o compilador Intel Fortran são apresentados na tabela 1.2. Isto significa
que qualquer número x tal que
x < −xmax ou x > xmax
não poderá ser representado pelo computador. Esta ocorrência é denominada overflow. Os compi-
ladores usualmente tomam duas possíveis providências quando detectam um overflow; ou páram o
processamento do programa emitindo uma mensagem de erro, ou continuam o processamento atri-
buindo a x o valor simbólico x = −Infinito ou x = Infinito.
• O maior número que pode ser somado ou subtraído a 1,0, com o resultado permanecendo indistingüível
de 1,0 é
xeps = b1−n . (1.5)
Os valores de xeps para o compilador Intel Fortran são também apresentados na tabela 1.2. A quan-
tidade xeps também é denominada de epsilon da máquina (m ) ou de precisão da máquina.
• Somente um conjunto finito F de números racionais podem ser representados na forma (1.4). Os
números neste conjunto são denominados números de ponto flutuante. Para uma representação
normalizada (d1 6= 0), este conjunto contém precisamente
números racionais.
Exemplo 1.9. Considere um modelo simplificado de representação numérica de ponto flutuante dado por
x [2, 4, −5, 6]. Para este sistema:
1
xmin = (0, 1000)2 × 2−5 = 2−5−1 = ;
64
ou seja, a região de underflow consiste no intervalo
1 1
− <x< .
64 64
• O maior número que pode ser somado ou subtraído de 1,0 e que mantém o resultado inalterado é:
1
xeps = 21−4 = .
8
• O número de elementos em F é:
Figura 1.3: Números normalizados positivos representáveis em x [2, 3, −1, 2]. Os riscos verticais posicionam os
números. Para cada número positivo, existe um correspondente número negativo.
Exemplo 1.10. Considere o sistema de números de ponto flutuante x [2, 3, −1, 2]. Para este sistema:
• o menor número positivo possível é:
1
xmin = 2−1−1 = .
4
ou seja, a região de underflow consiste no intervalo
1 1
− <x< .
4 4
• O maior número positivo possível é:
1 7
xmax = 1 − 2 −3
2 =
2
1− 4= ;
8 2
ou seja, as regiões de overflow consistem nos intervalos
7 7
x<− , x> .
2 2
• O maior número que pode ser somado ou subtraído de 1,0 e que mantém o resultado inalterado é:
1
xeps = 21−3 = .
4
• O número de elementos em F é:
2.1. (2 + 1 + 1) 23−1 + 1 = 33.
A fração positiva dos números possíveis em x [2, 3, −1, 2] está indicada na figura 1.3. Cada risco vertical
posiciona um números representável neste sistema.
EAx = |X − f l (X)| .
X = f l (X) ± EAx .
1137 1335
πmin = 3, 1409 · · · = 3 + < π < πmax = 3 + = 3, 1428 . . . .
8069 9347
Desta forma, Arquimedes obteve erros absolutos iguais a EAπ = 6, 830 × 10−4 para πmin , EAπ = 1, 2339 ×
10−4 para πmax e EAπ = 2, 7546 × 10−4 para a média entre πmin e πmax . Portanto, Arquimedes poderia
afirmar que
1 1
π = (πmin + πmax ) ± (πmax − πmin ) = 3, 14187 ± 0, 00096.
2 2
X − f l (X)
EAX
ERX = = .
|f l (X)| f l (X)
Voltando ao exemplo anterior, os erros relativos das estimativas de Arquimedes foram: ERπ = 2, 1741 ×
10−4 para πmin , ERπ = 3, 9262 × 10−4 para πmax e ERπ = 8, 7674 × 10−5 para a média.
Em geral, a melhor medida para se estimar a precisão de uma aproximação é o erro relativo, pois este
indica diretamente o número de dígitos significativos corretos na aproximação.
y = 0, 12345999 . . .
(y)2 = 2−4 + 2−5 + 2−6 + 2−7 + 2−8 + 2−9 + 2−12 + 2−13 + 2−15 + . . .
= 2−3 × 2−1 + 2−2 + 2−3 + 2−4 + 2−5 + 2−6 + 2−9 + 2−10 + 2−12 + . . .
o qual está agora na forma normalizada. De acordo com (1.4), podemos identificar então
M = 0, 111111001101 . . . , e = −3.
Contudo, para o sistema x [2, 4, −5, 6] pode-se usar somente 4 dígitos na mantissa. Desta forma, uma
aproximação possível para (y)2 fica:
o qual corresponde ao seguinte número na base 10: f l (y) = 0, 1171875 . . . , resultando em erros absoluto e
relativo:
EAy = 6, 272 × 10−3 , ERy = 5, 3525 × 10−2 = 5, 35%.
Este procedimento de aproximação é denominado truncamento.3 Uma definição mais rigorosa do método
de truncamento será apresentada a seguir.
Dado um número X já na forma normalizada que não possua representação exata no sistema x [b, n, emin , emax ].
Sejam agora X o maior número representável no sistema e que seja menor que X e X o menor número re-
presentável no sistema e que seja maior que X. Então,
X 6 X 6 X.
f l (X) = (0, d1 d2 . . . dn ) × be ,
pois (0, d1 d2 . . . dn ) > (0, 1)b = b−1 . Desta forma, obtém-se limites superiores para ambos os erros.
No exemplo acima, pode-se escrever:
o qual fornece uma estimativa superior para o erro relativo. No exemplo acima, como gy > 1/2, deve-se
somar 1 ao dígito d4 resultando, com o auxílio da tabela de adição de binários apresentada na seção
1.3.1,
f l ((y)2 ) = (0, 1111) × 2−3 + (0, 0001) × 2−3 = (1, 0000) × 2−3 = (0, 1000) × 2−2 .
Neste caso, obtém-se
f l (y) = 0, 125,
o qual possui um erro relativo de 1,2% de y, bem menor que o erro obtido com o truncamento, que
foi de 5,35%.
Computadores mais recentes modificam ligeiramente o arredondamento em relação à fórmula apresen-
tada em (1.6). Nesta, o último dígito significativo (dn ) não será alterado se |gX | < 1/2 e este será
alterado se |gX | > 1/2. Há, portanto, uma ligeira preferência para a alteração de dn no processo de
arredondamento, o que insere um erro sistemático no processo. Atualmente, se |gX | = 1/2, o valor de
dn será alterado somente em metade das situações, com base em algum critério. Este critério pode
ser a paridade de dn , por exemplo. Assim, para b = 10 o número 12,5 seria arredondado para 12,
enquanto que 13,5 seria arredondado para 14. Este critério é também denominado arredondamento
par [6].
representação de números reais, discutida na seção 1.5.3. O termo, neste contexto, consiste na tradução usualmente empregada
para o termo em inglês round-off errors.
6 Aqui também, o termo “erros de truncamento” não se refere ao processo de truncamento discutido na seção 1.5.3, mas sim
f l (X) = X + δX ,
ou seja, |X | ≈ ERX 6 max , onde max é denominado de unidade na última posição7 , ou uup. Isto é,
com k dígitos na mantissa e com a base b,
uup ' b−k .
7 Do termo em inglês unit in the last place, ou ulp.
Dados agora dois números reais positivos X e Y , deseja-se estimar os erros relativos das operações
algébricas entre ambos:
X op Y,
sendo op um das operações: “+”, “−”, “×” ou “÷”, conhecendo-se os erros relativos X e Y correspondentes:
f l (X) = X (1 + X ) e f l (Y ) = Y (1 + Y ) .
f l (X + Y ) , f l (X − Y ) , f l (X × Y ) , f l (X/Y ) .
Assumindo que não ocorra overflow nem underflow, supõe-se que seja possível escrever
f l (X op Y ) = (X op Y ) (1 + op ) ,
sendo
f l (X op Y ) − (X op Y )
op = ,
(X op Y )
com |op | = ERop , o erro relativo da operação.
Grande parte dos computadores atualmente empregados utilizam o padrão IEEE para operações arit-
méticas de ponto flutuante no sistema binário. Entre outros recursos, este padrão especifica que todas as
operações aritméticas devem ser idealmente realizadas como se o computador dispusesse de precisão infinita
e somente após obtido o resultado este deve ser transformado para o sistema de ponto flutuante em uso
através de um processo de arredondamento [6]. Este procedimento pode ser implementado fazendo-se uso
de dígitos de guarda (guard digits) [6] e ele permite estimar o erro em cada operação de ponto flutuante
como
|op | ' max (|X | , |Y |) .
Desta forma, obtém-se o menor erro relativo possível na operação algébrica e este irá se propagar lentamente
com o aumento do número de operações. Grande parte dos computadores em uso atualmente seguem o
padrão IEEE, o qual exige o emprego dos dígitos de guarda. Caso este padrão não seja empregado, os erros
decorrentes de operações de ponto flutuante aumentam de forma extremamente rápida com o número de
operações. Neste último caso, para cada operação algébrica, obtém-se:
Adição. Resulta:
f l (X + Y ) = f l (X) + f l (Y ) = (X + Y ) + (δX + δY ) ,
a qual pode ser escrita:
δX + δY XX + Y Y
f l (X + Y ) = (X + Y ) 1 + = (X + Y ) 1 + ≈ (X + Y ) (1 + + ) ,
X +Y X +Y
sendo
δX + δY
+ ≡ .
f l (X) + f l (Y )
Ou seja, os erros absoluto e relativo do processo de soma de ponto flutuante são:
ER+ ≈ |X | .
f l (X − Y ) = f l (X) − f l (Y ) = (X − Y ) + (δX − δY ) ,
ER− |X + Y | .
Este resultado mostra claramente como o erro relativo pode se tornar muito grande quando X ≈ Y .
Isto ocorre porque a subtração de dois números muito próximos entre si resulta em um número cuja
representação ocorre nos últimos dígitos da mantissa, resultando em um grande erro de arredonda-
mento.
Multiplicação. Neste caso,
f l (X × Y ) = f l (X) × f l (Y ) = (X + δX ) × (Y + δY ) = X × Y + X × δY + Y × δX + δX × δY .
f l (X × Y ) ≈ (X × Y ) + (f l (X) × δY + f l (Y ) × δX ) .
f l (X) × δY + f l (Y ) × δX
f l (X × Y ) ≈ (X × Y ) 1 +
f l (X) × f l (Y )
δX δY
= (X × Y ) 1 + + ≡ (X × Y ) (1 + × ) .
f l (X) f l (Y )
Assim,
EA× = |f l (X) × δY + f l (Y ) × δX | ,
δX δY
ER× = |× | = + ≈ |X + Y | .
f l (X) f l (Y )
f l (X) X + δX X + δX 1 X + δX
δY
f l (X ÷ Y ) = = = ≈ 1−
f l (Y ) Y + δY Y 1 + δY /Y Y f l (Y )
X + δX XδY + δX δY X δX f l (X)
≈ − ≈ + − δY ,
Y f l (Y )
2 Y f l (Y ) f l (Y )2
!
f l (Y ) δX − f l (X) δY
f l (X ÷ Y ) ≈ (X ÷ Y ) + 2 .
f l (Y )
Ao passo que
!
Y f l (Y ) δX − f l (X) δY
δX δY
f l (X ÷ Y ) = (X ÷ Y ) 1 + ≈ (X ÷ Y ) 1 + −
X f l (Y )
2 f l (X) f l (Y )
≡ (X ÷ Y ) (1 + ÷ ) .
Então,
f l (Y ) δ − f l (X) δ
X Y
EA÷ = ,
2
f l (Y )
δX δY
ER÷ = |÷ | = − ≈ |X − Y | .
f l (X) f l (Y )
Para exemplificar o efeito deletério que os erros de arredondamento podem apresentar em um cálculos,
em princípio, completamente exatos, Rice [13, Capítulo 3] mostra o gráfico do polinômio de sexto grau
P (x) = (x − 1)6 , calculado na sua forma expandida
A figura mostra P (x) traçado em torno de x = 1, em cujo ponto P (1) = 0, teoricamente. Entretanto, o
cálculo realizado sem o emprego de dígitos de guarda (figura 1.4 esquerda) evidencia um efeito muito mais
significativo dos erros de arredondamento nas operações básicas realizadas em números de ponto flutuante
que o efeito observado quando se faz uso de um computador e um compilador [1] que seguem as normas
IEEE 754, as quais prevêem o uso dos dígitos de guarda (figura 1.4 direita). O programa em Fortran 95 que
gerou figura 1.4 direita pode ser visto no programa 1.2.
-13
P(x)*10
1
-1
0,99 1 1,01
x
Figura 1.4: Esquerda: Cálculo do polinômio P (x) sem o uso de dígitos de guarda [13]. Direita: Cálculo de P (x)
usando um compilador que segue as normas IEEE 754.
Como não é possível ao computador a realização da soma infinita, a série deverá ser truncada para algum
n > N . Neste caso, o resultado obtido irá diferir de e = 2, 71828182845904523536028747135 . . . por um certo
valor que dependerá do valor de N , isto é, do número de termos considerados na soma. Este tipo de erro
soma-se ao erro de arredondamento considerado na seção 1.5.5.1. Em muitos casos, o erro de truncamento
é exatamente a diferença entre o modelo matemático e o modelo numérico empregados. Uma das principais
tarefas da análise numérica (e uma das mais difíceis) é a determinação de uma valor máximo para o erro de
truncamento.
Em muitos modelos numéricos existe um parâmetro que governa o erro de truncamento. Por exemplo,
o número N de termos usados vindos de uma série infinita, ou o tamanho ∆x usado numa fórmula de
derivação numérica. Uma maneira comum e prática de estimar o erro de truncamento consiste em variar
este parâmetro (tornando N maior ou ∆x menor) e observar os resultados numéricos. Se os resultados
computados convergirem a um certo número de dígitos significativos, então pode-se decidir que o erro
de truncamento (juntamente com os demais tipos de erros) são pequenos o suficiente para produzir um
resultado aceitável. Assim, muitas rotinas numéricas incluem um teste de convergência para decidir
quando os resultados são aceitáveis. Infelizmente, não existe um teste de convergência padrão para qualquer
problema numérico, uma vez que se trata de um problema matematicamente insolúvel. Em um nível
intuitivo, isto significa que a convergência nunca pode ser testada de forma totalmente confiável; do ponto
de vista matemático, para um dado teste de convergência que funciona em diversas situações, sempre ocorre
um problema para o qual o teste irá falhar.
Ordem de convergência. Trata-se de uma maneira de medir o quanto o erro de truncamento vai a zero à
medida que o parâmetro do método varia. Desta maneira, pode-se comparar a eficácia de distintos métodos.
Em função do cálculo da ordem de convergência para diferentes métodos, pode-se obter diversos resultados,
para distintos parâmetros, tais como:
A ordem de convergência pode ser complicada (por exemplo, h1,5 / log h) mas em alguns casos simples
denominações especiais são empregadas. Se a ordem de convergência é uma potência inteira (por exemplo,
h2 , N −3 , x5 ), então diz-se que a ordem de convergência é esta potência (2, 3 ou 5), ou que a convergência
é de segunda, terceira ou quinta ordens. Por outro lado, diz-se convergência logarítmica ou exponencial se
a ordem envolve uma função exponencial (como e−N ) ou logarítmica (como 1/ log N ).
Exemplo 1.12. As ordens de convergência de dois métodos de derivação numérica por diferença finita
serão calculadas:
1. Diferença “adiantada” (forward difference):
f (x + h) − f (x)
f 0 (x) ≈ .
h
Em ambos os métodos, para um parâmetro h suficientemente pequeno e para um função f (x) bem compor-
tada em torno de x, pode-se desenvolver a mesma em série de McLaurin:
1 1
f (x ± h) = f (x) ± f 0 (x)h + f 00 (x)h2 ± f 000 (x)h3 + · · · .
2 6
Neste caso, para o método 1:
f (x + h) − f (x) 1
= f 0 (x) + f 00 (x)h + · · · .
h 2
Ou seja, como o termo predominante é proporcional a h, a ordem de convergência deste método é O(h).
Para o método 2:
f (x + h) − f (x − h) 1
= f 0 (x) + f 000 (x)h2 + · · · ,
2h 6
ou seja, este método é da ordem O h2 .
Como exemplo prático da aplicação destes métodos, deseja-se comparar os cálculos da derivada da função
f (x) = sen x2 no ponto x = 0, 5 pelos métodos 1. e 2., comparando-os com o valor correto da derivada:
f 0 (x) = 2x cos x2 , para x = 0, 5. O erro absoluto versus o parâmetro h está traçado na figura 1.5, enquanto
que o programa em Fortran 95 que calculou os dados está no programa 1.3.
Os gráficos foram traçados em escala log-log para se verificar diretamente o expoente da taxa de con-
vergência. Isto é, se erro = αk , então a inclinação da reta é k. Pode-se ver claramente que no início do
processo iterativo, as taxas de convergência dos métodos 1. e 2. concordam com o valor previsto (h1 e h2 ,
respectivamente). Contudo, a partir de um determinado ponto os erros de arredondamento começam a se
tornar mais importantes e o erro absoluto passa a variar a uma taxa proporcional a h−1 .
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 1. Representação de Números e Erros 23
0
10
-2
10
-4
10
Erro Absoluto
-6
10
-8 Método 1.
10 Método 2.
+1
~h
-10 +2
10 ~h
-1
~h
-12
10 0 2 4 6 8 10 12 14
10 10 10 10 10 10 10 10
-1
h
Figura 1.5: Gráfico log-log do erro absoluto nos cálculos de derivadas usando métodos de diferenças finitas. As
ordens de convergência são h e h2 para os métodos 1. e 2., respectivamente. Nota-se que erros de arredondamento
acabam por arruinar totalmente a computação antes de a precisão de 15 dígitos ser atingida.
Programa 1.3: Programa em Fortran 95 que calculou as diferenças finitas da figura 1.5.
program d e r i v a d a s
i m p l i c i t none
integer , parameter : : dp= 8
integer : : i
r e a l ( kind= dp ) : : h= 0 . 0 2 _dp ! h i n i c i a l i z a d o a 1/50.
r e a l ( kind= dp ) , parameter : : x= 0 . 5 _dp ! Valor de x f i x o .
r e a l ( kind= dp ) : : df1 , df2 , f l
!
f l = 2 . 0 _dp∗x∗ c o s ( x∗x ) ! Valor c o r r e t o da d e r i v a d a em x .
open ( unit =10 , f i l e =’ d e r i v s . dat ’ )
do i= 1 , 45
d f 1= ( f ( x+h ) − f ( x ) ) / h ! C á l c u l o método 1 .
d f 2= 0 . 5 _dp∗ ( f ( x+h ) − f ( x−h ) ) / h ! C á l c u l o método 2 .
write ( 1 0 , ∗ ) 1 . 0 _dp/h , abs ( df1− f l ) , abs ( df2− f l )
h= 0 . 5 _dp∗h ! h é d i v i d i d o por 2 .
end do
CONTAINS
function f ( x )
r e a l ( kind= dp ) : : f
r e a l ( kind= dp ) , intent ( in ) : : x
f= s i n ( x∗x )
return
end function f
end program d e r i v a d a s
-4
10
-6
10
-8
10
-10 1
10 e
-12
-12 e
10
-14
10
-16
10 0 1 2
10 10 10
N
Figura 1.6: Gráfico log-log do erro absoluto no cálculo da série de McLaurin para ex quando a série é truncada na
potência N . Erros de arredondamento limitam a precisão do resultado para x = 1 antes que para x = −12.
Exemplo 1.13. Deseja-se calcular o erro absoluto decorrente do truncamento no cálculo da série de
McLaurin para a função ex :
∞ N
X xn X xn
ex = ≈ .
n=0
n! n=0
n!
onde xeps é dado por (1.5) e N é um parâmetro que mede o número de termos considerados no método ou
o número de operações de ponto flutuante realizadas.
O erro total será então a soma do erro de arredondamento e do erro de truncamento, decorrente da
aproximação feita no algoritmo. De acordo com os exemplos e argumentos apresentados, um forma comum
de se encontrar os erros de truncamento é:
α
δtrunc ∼ , (β > 0).
Nβ
Ou seja, teoricamente, limN →∞ δtrunc = 0. Então, o erro total será
α √
δtotal ∼ + N xeps .
Nβ
De acordo com este modelo, δtotal deve começar diminuindo para N relativamente pequeno, porém, à medida
que N aumenta, os erros de arredondamento tornam-se mais importantes e δtotal começa a aumentar. O
ponto onde este aumento se inicia pode ser estimado como
1
xeps
ln N ∼ − ln .
β + 1/2 2αβ
Derivação Numérica
2.1 Introdução
Derivação e integração numéricas são alguns dos R métodos que mais se utiliza em física computacional.
Com freqüência é necessário calcular ou f 0 (x) ou f (x)dx para uma determinada função f (x) para a qual
pode existir ou não uma expressão analítica. O objetivo deste capítulo é introduzir alguns dos métodos mais
empregados na derivação numérica, mantendo-se como objetivo a precisão numérica dos métodos.
Ao contrário da integração numérica, que será apresentada no próximo capítulo, a derivação possui alta
suscetibilidade a erros, tanto de truncamento quanto de arredondamento. Isto se deve à própria natureza
da derivação, definida por
df f (x + h) − f (x)
= lim . (2.1)
dx h→0 h
Como sempre há erros associados com o cálculo de f (x), estes serão ampliados à medida que se executa
numericamente o processo de limite h → 0. Como a representação finita de números reais em computadores
impõe um limite inferior no valor de f (x + h) − f (x), erros de arredondamento rapidamente começam a
se acumular durante o processo de limite, levando o cálculo, finalmente, a um processo de cancelamento
catastrófico, como se pode observar no exemplo da figura 1.5. Portanto, derivação numérica somente deve
ser realizada quando não houver outro método para a solução do problema em estudo.
Nas próximas seções, serão apresentados métodos que possibilitarão o cálculo numérico de derivadas
primeiras e segundas de funções que possuem ou não uma expressão analítica conhecida. Alguns destes
métodos serão posteriormente empregados no cálculos de equações diferenciais ordinárias ou parciais.
f (x + h) − f (x)
f 0 (x) ≈ . (2.2)
h
Aplicado desta forma, este procedimento está fadado ao quase certo fracasso, o que não impede de ser
largamente utilizado no cálculo numérico de equações diferenciais parciais. Portanto a fórmula (27) somente
deve ser empregada quando considerações de tempo computacionais forem importantes.
Há duas fontes importantes de erros em (27): erro de truncamento e erro de arredondamento. O erro
de truncamento pode ser estimado a partir do desenvolvimento de f (x + h) em uma série de McLaurin em
torno de x:
1 1 1
f (x ± h) = f (x) ± f 0 (x)h + f 00 (x)h2 ± f 000 (x)h3 + f iv (x)h4 + · · · , (2.3)
2 6 24
resultando
f (x + h) − f (x) 1
= f 0 (x) + f 00 (x)h + O h2 .
h 2
27
28 2.2. Fórmulas clássicas de diferença finita
Ou seja, o erro de truncamento é da ordem
t ∼ |f 00 h| .
Para diminuir este erro (para valores finitos de f 00 ), poderia-se tentar diminuir o valor de h, o que acabaria
levando ao aumento do valor do erro de arredondamento, como se pode observar na figura 1.5.
O erro de arredondamento possui duas origens. A primeira seria o erro no processo de arredondamento
realizado na representação finita dos pontos x e x + h, conforme discutido na seção 14. Estes erros podem
ser substancialmente diminuídos se o computador e o compilador empregarem dígitos de guarda. Assim,
supondo-se as representações de x e x + h “exatas,” ainda resta o erro de arredondamento no processo de
cálculo da derivada [f (x + h) − f (x)] /h. Este erro é da ordem
f (x)
a ∼ f ,
h
onde f é a precisão fracional no cálculo de f (x). Para uma função bem comportada, f ≈ m , sendo m a
precisão da máquina (12). O fato de a ∝ h−1 pode ser inferido a partir da figura 23. Assim, o erro total
no cálculo de (27) pode ser estimado como
f (x)
total = t + a ∼ |f h| + f
00 . (2.4)
h
O valor de h que minimiza este erro pode ser estimado pelo cálculo do mínimo de total , resultando
s
f √
hmin ' f 00 ≡ f xc ,
f
onde xc = f /f 00 é denominado escala de curvatura de f (x) ou de escala característica sobre a qual f (x)
p
onde se supôs que f , f 0 e f 00 sejam todos da mesma ordem de grandeza. Pode-se ver que a fórmula de
diferença adiantada fornece como melhor estimativa somente a raiz quadrada do epsilon de máquina. Para
√
precisão simples, m ∼ 10−7 , portanto, m ∼ 10−4 , ou seja, 4 dígitos de precisão. Já para precisão dupla,
√
m ∼ 10−16 , resultando m ∼ 10−8 , ou 8 dígitos significativos.
f (x + h) − f (x − h)
f 0 (x) ≈ . (2.6)
2h
Utilizando (2.3), observa-se que
f (x + h) − f (x − h) 1
= f 0 (x) + f 000 (x)h2 + O h4 . (2.7)
2h 6
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 2. Derivação Numérica 29
Ou seja, o erro de truncamento deste método é da ordem
t ∼ |f 000 (x)| h2 ,
1 1 1 1 v
f (x ± h) = f (x) ± f 0 (x)h + f 00 (x)h2 ± f 000 (x)h3 + f iv (x)h4 ± f (x)h5 + . . . ,
2 6 24 120
1 1
f (x + h) − f (x − h) = 2f 0 (x)h + f 000 (x)h3 + f v (x)h5 + O h7
3 60
e calculando
8 8
f (x + 2h) − f (x − 2h) = 4f 0 (x)h + f 000 (x)h3 + f v (x)h5 + O h7 .
3 15
Combinando-se adequadamente ambas as fórmulas, obtém-se
2
f (x − 2h) − 8f (x − h) + 8f (x + h) − f (x + 2h) = 12f 0 (x)h − f v (x)h5 + O h7 ,
5
ou seja,
f (x − 2h) − 8f (x − h) + 8f (x + h) − f (x + 2h) 1
= f 0 (x) − f v (x)h4 + O h6 .
12h 30
Portanto,
f (x − 2h) − 8f (x − h) + 8f (x + h) − f (x + 2h) 1
f 0 (x) ≈ + f v (x)h4 , (2.8)
12h 30
a qual é conhecida como derivada de 5 pontos.
O erro de truncamento agora é da ordem
t ∼ |f v | h4 ,
1 1 1
f (xi + ph) ≈
0
p− f−1 − 2pfi + p + f1 + 0, 13f 000 (ξ)h2 , (x1 < ξ < xn )
h 2 2
onde f−1 = f (xi − h) e f1 = f (xi + h). Assim, se p = 0, esta fórmula se reduz à derivada centrada (2.6).
1 3p2 − 6p + 2 3p2 − 1
f (xi + ph) ≈ −
0
f−1 − 3p − 4p − 1 fi + 3p − 2p − 2 f1 −
2 2
f2
2h 3 3
(
0, 096f iv (ξ)h3 , (0 < p < 1)
+
0, 168f iv (ξ)h3 , (−1 < p < 0)
onde f2 = f (xi + 2h).
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 2. Derivação Numérica 31
2.4.3 Derivada de cinco pontos
onde agora f−2 = f (xi − 2h) e, para p = 0, a fórmula acima reduz-se à derivada de cinco pontos (2.8).
onde A e B são funcionais aplicados a f . Sendo o algoritmo de ordem n, o erro predominante é dado
pelo termo A[f ]hn , ao passo que o termo posterior na correção é dado pelo termo B[f ]hn+m , para m > 1.
Aplicando-se então o algoritmo para valores do parâmetro h1 = h e h2 = h/R, sendo R > 1, resulta
Os erros absolutos nas aproximações f l(f, h) e f l(f, h/R) são dados, em mais baixa ordem, respectivamente
por
Resolvendo a equação acima para h1 e h2 , obtém-se então as estimativas de erro, exatas até a ordem n + m:
Rn
h
A[f ]h = EA(h) ' f l f,
n
− f l(f, h) (2.13a)
R Rn − 1
n
1
h h h
A[f ] = EA ' f l f, − f l(f, h) . (2.13b)
R R R Rn − 1
Expressão (2.13a) consiste em uma estimativa do valor do erro do algoritmo empregando o parâmetro h1 ,
ao passo que (2.13b) é a estimativa do erro do mesmo algoritmo usando o parâmetro h2 .
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
32 2.5. Extrapolação de Richardson e estimativa de erro
Uma vez obtida a estimativa de erro para a melhor aproximação (usando h2 ), pode-se adicionar esta
estimativa ao valor aproximado f l (f, h2 ) para se realizar um refinamento no resultado; isto é, uma vez que
n n+m n+m+`
h h h h
fexato = f l f, + A[f ] + B[f ] + C [f ] + ...,
R R R R
sendo que EA1 (h) é a estimativa de erro para f l1 (h), a qual não havia sido obtida na iteração anterior, e
EA1 (h/R) é a estimativa de erro para f l1 (h/R). Agora, o novo valor extrapolado passa a ser f l2 (h), dado
por
1 Rn+m f l1 (h/R) − f l1 (h)
h h
f l2 (h) ≡ f l1 + f l1 − f l1 (h) = , (2.16a)
R R R n+m −1 Rn+m − 1
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 2. Derivação Numérica 33
e
n+m+`
h
fexato = f l2 (h) + C [f ] + ··· . (2.16b)
R2
E assim sucessivamente para ordens mais altas. Deve-se ressaltar por fim que o algoritmo f l (f, h) somente
foi utilizado no cálculo dos termos não extrapolados f l0 (h). Os termos restantes são obtidos apenas com
o uso da regra de extrapolação. Contudo, para obter-se f lk (h) para k > 0, é necessário conhecer-se os
termos extrapolados anteriores, o que implica, ao final das contas, que é necessário aplicar-se o algoritmo
f l0 k vezes, para valores de incrementos consecutivamente menores: f l0 (h), f l0 (h/R), f l0 h/R2 , . . . ,
f l0 h/Rk .
Exemplo 2.1. Como exemplo de uso da extrapolação de Richardson para o cálculo de derivação numérica,
emprega-se a expressão para derivação centrada, juntamente com a sua estimativa de erro (2.7),
f (x + h) − f (x − h) 1 000
f 0 (x) = − f (x)h2 + O h4 ,
2h 6
a qual mostra que o método é de ordem n = 2, enquanto que o próximo termo é de ordem n + m = 4.
Também identifica-se A[f ] = −f 000 (x)/6. Tomando-se o valor R = 2 e empregando-se a fórmula acima para
h1 = h e h2 = h/2, obtém-se as seguintes expressões:
f (x + h) − f (x − h) 1 000
f 0 (x) = − f (x)h2 + O h4 ,
2h 6
f (x + h/2) − f (x − h/2) 1 000 h2
4
h
f 0 (x) = − f (x) + O .
h 6 4 16
Chamando então
f (x + h) − f (x − h) f (x + h/2) − f (x − h/2)
f l (f 0 , h1 ) = e f l (f 0 , h2 ) = ,
2h h
1 1
EA (h2 ) ' [f l (f 0 , h2 ) − f l (f 0 , h1 )] = [f l (f 0 , h2 ) − f l (f 0 , h1 )] , (2.19a)
22 − 1 3
ao passo que o valor extrapolado para o cálculo da derivada é dado por (2.14),
1
f 0 (x) = f l (f 0 , h2 ) + [f l (f 0 , h2 ) − f l (f 0 , h1 )] + O h4 . (2.19b)
3
-4 Erro aproximado
10 Erro exato
Derivada extrapolada
-6
10
Erro Absoluto
-8
10
-10
10
-12
10
-14
10 0 2 4 6 8 10 12
10 10 10 10 10 10 10
-1
h
Figura 2.1: Gráfico log-log da estimativa de erro absoluto no cálculo da derivada centrada da função f (x) = sen x2 ,
em x = 0, 5, juntamente com o valor exato do erro e o valor extrapolado da derivada.
O resultado obtido com o emprego das expressões (2.19a,b) pode ser visto na figura 2.1. Nesta, a exemplo
do que se fez na figura 1.5, calculou-se numericamente a derivada numérica da função f (x) = sen x2 no ponto
x = 0, 5 a partir da fórmula de diferença centrada. Neste caso, porém, pode-se calcular também a estimativa
de erro (2.19a) e o valor extrapolado (2.19b). Observa-se que a estimativa de erro é tão boa que se torna
indistingüível do valor exato do erro durante todo o intervalo de valores de h para os quais o erro de
truncamento é mais importante que o erro de arredondamento. Além disso, observa-se também que o valor
extrapolado refina o resultado em mais de 2 ordens de grandeza. O programa em Fortran 95 que gerou os
dados apresentados na figura 2.1 está no Programa 2.1.
Programa 2.1: Programa em Fortran 95 que calculou o erro e o valor extrapolado apresentados na Figura 2.1.
program d e r i v a d a s _ e x t r a p o l a
i m p l i c i t none
integer , parameter : : dp= 8
integer : : i
r e a l ( kind= dp ) : : h= 0 . 1 _dp ! h i n i c i a l i z a d o a 1/50.
r e a l ( kind= dp ) , parameter : : x= 0 . 5 _dp ! Valor de x f i x o .
r e a l ( kind= dp ) : : df1 , df2 , df , e r r o _ e s t , f l
!
f l = 2 . 0 _dp∗x∗ c o s ( x∗x ) ! Valor c o r r e t o da d e r i v a d a em x .
open ( unit =10 , f i l e =’ d e r i v s _ e x t . dat ’ )
do i= 1 , 45
d f 1= f p 3 ( x , h ) ! Derivada d i f e r e n c a c e n t r a d a
d f 2= f p 3 ( x , 0 . 5 _dp∗h )
e r r o _ e s t= ( d f 2 − d f 1 ) / 3 . 0 _dp
d f= d f 2 + e r r o _ e s t
write ( 1 0 , ’ ( 4 ( e10 . 4 , 1 x ) ) ’ ) 1 . 0 _dp/h , abs ( e r r o _ e s t ) , &
abs ( d f 2 − f l ) , abs ( d f − f l )
h= 0 . 5 _dp∗h ! h e d i v i d i d o por 2 .
end do
CONTAINS
function f ( x )
r e a l ( kind= dp ) : : f
r e a l ( kind= dp ) , intent ( in ) : : x
f= s i n ( x∗x )
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 2. Derivação Numérica 35
return
end function f
!
function f p 3 ( x , h )
r e a l ( kind= dp ) : : f p 3
r e a l ( kind= dp ) , intent ( in ) : : x , h
f p 3= 0 . 5 _dp∗ ( f ( x+h ) − f ( x−h ) ) / h
return
end function f p 3
end program d e r i v a d a s _ e x t r a p o l a
Caso se queira empregar este método para uma função definida somente em pontos de rede, os incre-
mentos h1 e h2 devem necessariamente ser pontos desta rede. Neste caso, colocando h1 = 2h e h2 = h em
(2.1b), resulta
1
f 0 (x) = f l (f 0 , h) + [f l (f 0 , h) − f l (f 0 , 2h)] + O h4
3
f (x − 2h) − 8f (x − h) + 8f (x + h) − f (x + 2h)
= + O h4 ,
12h
a qual é justamente a fórmula de 5 pontos (2.8). Portanto, o uso do valor extrapolado não é útil para pontos
fixos de rede, uma vez que o valor de h não pode ser variado.
A subrotina DFDX_RICH, listada no Programa 2.2 implementa o cálculo da derivada numérica usando o
Método de Richardson. A rotina tem como parâmetros de entrada o nome da função f (x) analítica a ser
derivada, a qual deve ser fornecida por meio de uma função externa, o ponto onde calcular a derivada, o
tamanho inicial do parâmetro h e o limite superior solicitado para o erro relativo do resultado. Como saídas,
a rotina fornece o valor numérico de f 0 (x) e uma estimativa do valor do erro relativo. Como o resultado da
Método de Richardson é equivalente ao resultado do método de 5 pontos (seção 2.2.4), o menor erro relativo
possível é estimado igual ao fornecido pela fórmula (2.9). Portanto, se o valor solicitado para o erro relativo
máximo for menor que este valor, a rotina automaticamente irá interromper o processamento, pois os erros
de arredondamento irão impedir a obtenção de um resultado com a precisão solicitada.
Programa 2.2: Subrotina que calcula numericamente a derivada pelo Método da Extrapolação de Richardson.
! C a l c u l a a d e r i v a d a numerica de uma f u n c a o a n a l i t i c a p e l o
! Metodo da E x t r a p o l a c a o de Richardson .
! Argumentos :
! f : Funcao e x t e r n a a s e r d e r i v a d a ( entrada ) .
! x : Ponto onde c a l c u l a r a d e r i v a d a ( entrada ) .
! h_ini : Valor i n i c i a l para o i n t e r v a l o de d i f e r e n c a f i n i t a ( e n t r a d a ) .
! e r r e s t : Valor maximo s o l i c i t a d o para o e r r o r e l a t i v o ( entrada ) .
! dfdx : Valor da d e r i v a d a numerica ( saida ).
! e r r _ s a i : Valor e s t i m a d o do e r r o r e l a t i v o da d e r i v a d a ( saida ).
!
! Obs . : Caso parametro e r r e s t s e j a menor que a e s t i m a t i v a de
! e r r o r e l a t i v o minimo para o metodo , a r o t i n a i n t e r r o m p e
! automaticamente o p r o c e s s a m e n t o .
subroutine d f d x _ r i c h ( f , x , h_ini , e r r e s t , dfdx , e r r _ s a i )
i m p l i c i t none
integer , parameter : : dp= s e l e c t e d _ r e a l _ k i n d ( 1 0 , 2 0 0 )
r e a l ( kind= dp ) , intent ( in ) : : x , h_ini , e r r e s t
r e a l ( kind= dp ) , intent ( out ) : : dfdx , e r r _ s a i
interface
function f ( x )
integer , parameter : : dp= s e l e c t e d _ r e a l _ k i n d ( 1 0 , 2 0 0 )
r e a l ( kind= dp ) , intent ( in ) : : x
r e a l ( kind= dp ) :: f
end function f
end i n t e r f a c e
! Variaveis locais .
integer :: i
r e a l ( kind= dp ) : : h , df1 , df2 , err_abs
r e a l ( kind= dp ) , parameter : : e r r r e l _ m i n= 3 . 0 e −13_dp
!
i f ( e r r e s t <= e r r r e l _ m i n ) then
print ’ ( "O e r r o r e l a t i v o s o l i c i t a d o e muito pequeno . " ,/ , &
" E r r o s de arredondamento i r a o i m p e d i r que a r o t i n a " , / , &
" atinja a precisao solicitada . " ) ’
STOP
end i f
h= h_ini
d f 1= df_cent ( x , h )
do
d f 2= df_cent ( x , 0 . 5 _dp∗h )
err_abs= ( d f 2 − d f 1 ) / 3 . 0 _dp
dfdx= d f 2 + err_abs
e r r _ s a i= abs ( err_abs / dfdx )
i f ( e r r _ s a i <= e r r e s t ) e x it
d f 1= d f 2
h= 0 . 5 _dp∗h
end do
return
CONTAINS
function df_cent ( x , h )
r e a l ( kind= dp ) : : df_cent
r e a l ( kind= dp ) , intent ( in ) : : x , h
df_cent= 0 . 5 _dp∗ ( f ( x+h ) − f ( x−h ) ) / h
return
end function df_cent
end subroutine d f d x _ r i c h
Integração Numérica
3.1 Introdução
Integração numérica, também denominada quadratura, possui uma história que se estende desde antes
da invenção do cálculo. O fato de integrais de funções elementares não poderem, em geral, ser calculadas
analiticamente, ao passo que suas derivadas são facilmente obtidas, serviu de razão para enfatizar esta área
da análise numérica já nos séculos XVIII e XIX.
Em contraste com a dificuldade de se calcular analiticamente uma integral, o cálculo numérico pode
ser realizado de forma relativamente simples, exatamente ao contrário do que acontece com a derivação. A
definição de uma integral de Riemann consiste no limite da soma da área delimitada por regiões retangulares
à medida que a largura h dos retângulos vai a zero e o seu número total vai a infinito:
Z b (b−a)/h
X
f (x)dx = lim h f (xi ) .
a h→0
i=1
Uma maneira tradicional de medir numericamente a área sob f (x) consiste em traçar o seu gráfico sobre
um papel milimetrado e contar o número de quadrados sob a curva. Por esta razão a integração numérica
também foi denominada inicialmente de quadratura numérica.
A integral da função f (x) é aproximada numericamente de uma forma equivalente à soma dos quadrados
ou retângulos. A maior parte das fórmulas abordadas neste capítulo podem ser colocadas na forma:
Z b N
X
f (x)dx = f (xi )wi + N . (3.1)
a i=1
Aqui, f (x) é calculada em N pontos situados no intervalo [a, b] (para fórmulas fechadas, isto é, que envolvem
os limites) ou no intervalo (a, b) (para fórmulas abertas, que não envolvem os limites). Os valores das funções
calculados em cada ponto do intervalo, fi = f (xi ) são então somados com o intermédio de um peso wi . A
quantidade N consiste na estimativa do erro de truncamento do método empregado. Embora os métodos,
em geral, somente forneçam o resultado exato para N → ∞, alguns deles fornecem o resultado exato para
certas classes especiais de funções (como polinômios, por exemplo) para N finito.
Os diferentes algoritmos de integração utilizam distintos conjuntos de pontos {xi } e de pesos {wi }.
Geralmente, a precisão aumenta com N , mas erros de arredondamento eventualmente acabam por limitar
a precisão final. Uma vez que o “melhor” método depende do comportamento específico de f (x), não existe
um método que possa ser universalmente considerado o melhor. De fato, alguns dos esquemas automáticos
de integração numérica, que podem ser encontrados em bibliotecas tais como a IMSL, irão testar diferentes
métodos até encontrar aquele que forneça o melhor resultado.
Nos esquemas mais simples de integração, o integrando é aproximado por uns poucos termos no de-
senvolvimento em série de McLaurin de f (x), sendo estes os termos a ser integrados. Exceto no caso do
integrando apresentar um comportamento não usual em algum intervalo de valores de x, termos sucessivos,
obtidos com o aumento de N , irão fornecer precisão cada vez maior, até que os erros de arredondamento
se tornem suficientemente importantes. Nestes esquemas, denominados de Newton-Cotes, o intervalo total
é dividido em subintervalos iguais, conforme ilustrado na figura 3.1, com o integrando calculado em pon-
tos igualmente espaçados xi . Estes algoritmos incluem a regra trapezoidal (primeira ordem) e a regra de
Simpson (segunda ordem).
37
38 3.2. Fórmulas de Newton-Cotes
Figura 3.1: Fórmulas de quadratura com abcissas igualmente espaçadas calculam a integral de uma função entre
x0 e xN +1 . Fórmulas fechadas calculam o valor da função nos pontos extremos do intervalo, enquanto que fórmulas
abertas não usam estes pontos.
Esquemas mais acurados de integração são possíveis se os pontos não necessariamente forem regularmente
espaçados. Métodos de quadratura Gaussiana possuem a habilidade de integrar exatamente (exceto pelo
erro de arredondamento) o produto de uma função por um polinômio de grau (2N − 1), utilizando somente
N valores de f (x). Em geral, resultados obtidos pela quadratura Gaussiana são superiores aos obtidos pelos
métodos de Newton-Cotes, desde que não haja singularidades no integrando ou em sua derivada.
Figura 3.2: Nas fórmulas fechadas, são utilizados N + 1 pontos, que variam de x0 = a a xN = b.
xi = a + ih, (i = 0, . . . , N ),
fi ≡ f (xi ).
Polinômio de Lagrange.
A função f (x) será agora aproximada por um polinômio interpolador, isto é, no lugar de f (x) considera-se
um polinômio de grau N , pN (x), o qual possui os mesmos valores da função nos pontos xi , isto é,
pN (xi ) = fi , (i = 0, . . . , N ).
A verificação de que pN (x) é o polinômio interpolador segue diretamente da substituição dos pontos xi :
O erro associado à aproximação fornecida pelos polinômios de Lagrange, N (x) ≡ f (x) − pN (x), é dado
por:
f (N +1) (α)
N (x) = [(x − x0 ) (x − x1 ) . . . (x − xN )] , (3.2c)
(N + 1)!
onde
α ∈ [a, b] .
Desta forma, pode-se escrever,
f (x) = pN (x) + N (x), (3.2d)
para x ∈ [a, b].
Pode-se então escrever a integral na forma (3.1), onde os pesos da fórmula de integração são obtidos por:
(x − x0 ) (x − x1 ) . . . (x − xi−1 ) (x − xi+1 ) . . . (x − xN )
Z b Z b
wi = liN (x)dx = dx, (3.3b)
a a (x i − x0 ) (xi − x1 ) . . . (xi − xi−1 ) (xi − xi+1 ) . . . (xi − xN )
f (N +1) (α) b
Z
N = [(x − x0 ) (x − x1 ) . . . (x − xN )] dx. (3.3c)
(N + 1)! a
1A qual será apresentada em um capítulo posterior desta Apostila.
Figura 3.3: Integração numérica pela regra trapezoidal. A área sob a curva f (x) entre x0 e x1 é aproximada pela
área do trapézio amarelo.
Deve-se enfatizar aqui que a fórmula (3.3a) é exata para um polinômio de grau 6 N .
Desta forma, pode-se obter fórmulas do tipo Newton-Cotes para polinômios de qualquer grau. Historica-
mente, as primeiras fórmulas foram estabelecidas para polinômios de graus baixos. Algumas destas fórmulas
serão apresentadas a seguir.
Fórmulas fechadas são aquelas que utilizam os pontos extremos do intervalo [a, b], isto é,
x0 = a e xN = b.
Estas fórmulas são adequadas quando o integrando for bem comportado nos limites de integração; não
apresentando singularidades, por exemplo.
2 b
x1
(x − x1 ) 1 (x − b) 1
Z
wo = dx = − = h,
x0 (xo − x1 ) 2 (b − a) 2
a
b
2
x1
(x − x0 ) 1 (x − a) 1
Z
w1 = dx = = h
x0 (x1 − x0 ) 2 (b − a) 2
a
e o erro 00
f (α) x1
1 00
Z
1 ≡ T = (x − x0 ) (x − x1 ) dx = − f (α)h3 .
2 x0 12
Portanto, a regra trapezoidal para integração no intervalo (x0 , x1 ) fica
b
1
Z
h
f (x) = (f0 + f1 ) − f 00 (α)h3 . (3.4)
a 2 12
O nome fórmula dos trapézios vem do fato de se aproximar a função f (x) por um trapézio de lados f0 e f1
e de base h = b − a, conforme está representado na figura 3.3. Pode-se observar que este método, bastante
simples, já fornece um erro de ordem T ∼ h3 .
Figura 3.4: Integração numérica pela regra de Simpson. A área sob a curva f (x) entre x0 e x2 é aproximada pela
área sob a parábola P (x).
Contudo, surpreendentemente obtém-se que 2 = 0! Isto pode ser facilmente visto realizando-se a mudança
de variáveis t = x − x1 na integração acima, resultando
Z x2 Z h Z h
(x − x0 ) (x − x1 ) (x − x2 ) dx = (t + h) t (t − h) dt = t2 − h2 tdt = 0.
x0 −h −h
Isto não significa que o erro na regra de Simpson é sempre nulo. Neste caso é necessário tomar o próximo
termo no cálculo do erro N de um polinômio interpolador de grau N , dado inicialmente por (3.2c), porém
agora acrescentando o próximo termo no desenvolvimento em série de McLaurin de f (x) em torno de x = x1 :
f (iv) (α)
(x − x1 ) .
4!
Desta forma, o erro fica:
f (iv) (α) x2 1 1
Z Z h
2
S = (x − x0 ) (x − x1 ) (x − x2 ) dx = f (iv) (α) (t + h) t2 (t − h) dt = − f (iv) (α)h5 .
4! x0 4! −h 90
Portanto, a regra de Simpson para integração no intervalo (x0 , x2 ) fica
b
1
Z
h
f (x) = (f0 + 4f1 + f2 ) − f (iv) (α)h5 . (3.5)
a 3 90
A figura 3.4 ilustra a aplicação da regra de Simpson para o cálculo da quadratura. Das expressões obtidas
para os erros das duas fórmulas polinomiais, (3.4) e (3.5), pode-se observar que a formula dos trapézios é
exata se f (x) for um polinômio de grau 1 (pois f 00 (x) = 0, ∀x), ao passo que a fórmula de Simpson é exata
se f (x) for um polinômio de grau igual ou menor que 3 (pois f (iv) (x) = 0, ∀x).
a tabela 3.1 apresenta os valores dos parâmetros d e h, dos pesos wi e dos erros de truncamento N .
4 2/45 7 32 12 32 7 8
− 945 f (vi) (α)h7
5 5/288 19 75 50 50 75 19 − 12096 f (vi) (α)h7
275
1. Fórmulas abertas não podem ser facilmente compostas juntas para formar uma regra estendida, como
as fórmulas fechadas, que serão discutidas na seção 3.2.3.
3. O polinômio interpolador raramente reproduz fidedignamente a forma de f (x) próxima aos pontos
singulares, o que reduz significativamente a utilidade de uma fórmula aberta.
Devido a estas razões, as fórmulas abertas não serão detalhadamente discutidas aqui. Somente será apre-
sentada a fórmula geral para uma quadratura aberta,
Z b N
X −1
f (x)dx = dh f i w i + N , (3.9)
a i=1
sendo que os parâmetros d e h e os pesos wi podem ser obtidos em [2, seção 25.4] e são dados na tabela 3.2.
Tabela 3.2: Fórmulas abertas de Newton-Cotes, dadas por (3.9). Na tabela, h = (b − a)/N e N = M + 2.
M d w1 w2 w3 w4 w5 w6 w7
1 3/2 1 1
2 4/3 2 -1 2
3 5/24 11 1 1 11
4 6/20 11 -14 26 -14 11
5 7/1440 611 -453 562 562 -453 611
6 8/945 460 -954 2196 -2459 2196 -954 460
3. soma= soma + fi
4. IT E = h
2 [2 soma + f0 + fN ]
b
1 1
Z
f (x)dx = h (f0 + 2f1 + 2f2 + · · · + 2fN −1 + fN ) − (b − a)f 00 (β)h2 . (3.10)
a 2 12
Pode-se notar que agora o erro de truncamento é proporcional a T ∼ h2 ao passo que o erro para a fórmula
(3.4) é proporcional a h3 . Portanto, em princípio o erro aumentou na fórmula estendida. Contudo, deve-se
salientar que os espaçamentos nas fórmulas (3.4) e (3.10) têm valores distintos, o que não possibilita uma
comparação direta entre ambos.
A regra trapezoidal estendida pode ser implementada por um programa de computador com base no
algoritmo 3.1.
b N/2
h5 X (iv)
Z
h
f (x)dx = (f0 + 4f1 + 2f2 + 4f3 + 2f4 + · · · + 2fN −2 + 4fN −1 + fN ) − f (αi ) .
a 3 90 i=1
Assim,
b
b − a (iv)
Z
h
f (x)dx = (f0 + 4f1 + 2f2 + 4f3 + 2f4 + · · · + 2fN −2 + 4fN −1 + fN ) − f (γ)h4 . (3.11)
a 3 180
Aqui também, embora o erro da regra de Simpson estendida seja aparentemente maior que na regra (3.5), os
valores de h em ambos os casos em geral são bastante diferentes. O algoritmo 3.2 mostra a implementação
da regra de Simpson estendida por um programa de computador.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 3. Integração Numérica 45
Algoritmo 3.2 Implementação da regra de Simpson estendida.
Dados: N par, h, fi = f (xi ) para i = 0, 1, . . . , N .
1. soma = 0
2. Para i = 1, 3, 5, . . . , N − 1, faça
Exemplo 3.2. Ainda calculando aproximações para ln 2, pode-se agora aplicar as fórmulas compostas.
Regra trapezoidal estendida. Tomando quatro trapézios no intervalo [1, 2], resulta N = 4, h = 0, 25 e
0, 25 8 4 8 1
Z 2
dx
≈ 1+ + + + = 0, 6970238 . . . ; erro relativo: 0, 56%.
1 x 2 5 3 7 2
Regra de Simpson estendida. Tomando duas parábolas na fórmula estendida de de Simpson, resulta
N = 4, h = 0, 25 e
0, 25 16 4 16 1
Z 2
dx
≈ 1+ + + + = 0, 693253968 . . . ; erro relativo: 0, 015%.
1 x 3 5 3 7 2
Comparando os resultados deste exemplo com o anterior, percebe-se que para cada regra individual, o erro
obtido foi menor, contudo, o erro é maior quando se comparam métodos que utilizam o mesmo número de
pontos. Por exemplo, o método trapezoidal estendido obteve um erro maior que a regra de Simpson dos
3/8, a qual também utiliza 4 pontos para calcular a quadratura.
1 b − a (iv)
T E = − (b − a)f 00 (β)h2 , (a 6 β 6 b) e SE = − f (γ)h4 , (a 6 γ 6 b)
12 180
têm o seu cálculo impedido pelo desconhecimento do valor exato de β e γ.
Entretanto, há maneiras de se realizar estimativas dos valores máximos que estes erros podem assumir e
a partir destas estimativas pode-se calcular o valor ideal para h, o espaçamento entre os pontos, que permite
satisfazer um requisito inicial de valor máximo para os erros.
Ou seja, se o intervalo de integração for fechado e f (x) tiver derivadas contínuas neste intervalo até uma
ordem k > N , onde N é o grau da regra de Newton-Cotes empregada, sempre é possível escrever
1 1
|T E | = (b − a) |f 00 (β)| h2 6 (b − a)h2 max |f 00 (x)| (3.12a)
12 12 a6x6b
b − a (iv) 4
b−a 4
|SE | = f (γ) h 6 h max f (iv) (x) , (3.12b)
180 180 a6x6b
sendo que agora é necessário realizar estimativas para os valores máximos das derivadas de f (x) dentro do
intervalo considerado. Estas estimativas podem ser realizadas de diversas maneiras, tanto numericamente
quanto analiticamente. O exemplo abaixo ilustra a aplicação destas estimativas.
Exemplo 3.3. Quantos subintervalos e qual o espaçamento que devem ser empregados no cálculo de
Z 1
2
e−x dx
0
para que a aproximação tenha erro menor que 10−4 nos casos (a) Regra dos Trapézios Estendida e (b) Regra
de Simpson Estendida?
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
46 3.3. Quadratura gaussiana
Respostas: o integrando não possui primitiva, mas as suas derivadas podem ser calculadas em qualquer
ordem. Assim,
2 2
f 0 (x) = −2xe−x f 00 (x) = 2 2x2 − 1 e−x
2 2
f 000 (x) = 4x 3 − 2x2 e−x f (iv) (x) = 4 3 − 12x2 + 4x4 e−x
2
f (v) (x) = −8x 15 − 20x2 + 4x4 e−x .
(a) Para a fórmula dos trapézios, de acordo com (3.12a) é necessário então encontrar o máximo de f 00 (x)
no intervalo [0, 1]. Isto é possível uma vez que se conhece a única raiz de f 000 (x) neste intervalo, r = 0.
Portanto,
max |f 00 (x)| = |f 00 (r)| = 2
06x61
e assim,
1 2 p
hT E 6 10−4 =⇒ hT E 6 6 × 10−4 ' 0, 0245,
|T E | 6
6
o que corresponde a um número de subintervalos
1
NT E > Int = 41.
hT E
(b) Para a fórmula de Simpson, de acordo com (3.12b) é necessário encontrar o máximo de f (iv) (x) no
intervalo [0, 1]. Isto é possível uma vez que se conhecem as raízes de f (v) (x) neste intervalo:
1 √
r
r1 = 0, r2 = 5 − 10 ' 0, 9586.
2
Como !
√ 5 5
r
(r1 ) = 12 e f (r2 ) = 16 10 − 2 exp − + ' 7, 4195,
(iv) (iv)
2 2
f
obtém-se
max f (iv) (x) = f (iv) (r1 ) = 12
06x61
e, portanto,
h4SE p
6 10−4 =⇒ hSE 6 15 × 10−4 ' 0, 197,
4
|SE | 6
15
o que corresponde a um número de subintervalos
1
NSE > Int = 6.
hSe
Pode-se ver, portanto, que o número de subintervalos necessários para a regra de Simpson atingir um
determinado limiar de erro é substancialmente menor que o número requerido pela regra trapezoidal.
Adicionalmente, se o produto interno hf |f i, definido como a norma de f (x), for unitário, então f (x) é
p
onde o integrando é escrito F (x) ≡ W (x)f (x), sendo que W (x) passa a desempenhar o papel de função-peso
na fórmula gaussiana. A escolha da forma de W (x) pode ser feita de tal modo que o integrando restante,
f (x), resulte ser o mais suave possível, ou de forma a salientar possíveis singularidades em F (x). Isto é
necessário para que f (x) possa ser satisfatoriamente aproximada por um polinômio. Um exemplo seria a
quadratura adequada para aproximar a integral
exp − cos2 x
Z 1
√ dx.
−1 1 − x2
A escolha natural para a função-peso seria
1
W (x) = √ .
1 − x2
Esta escolha em particular define o uso da fórmula de Gauss-Chebyshev, conforme visto na seção 3.3.2.
Há um conjunto particular de formas para W (x) que constitui as fórmulas gaussianas tradicionais e que
possuem valores tabelados para os pesos {wi } e as abcissas {xi }. Algumas destas formas tradicionais serão
estudadas na seção 3.3.2.
Então, se para um polinômio de grau k qualquer, pk (x), vale a igualdade
Z b N
X
pk (x)dx = wi pk (xi ) , (3.13)
a i=1
determina-se o conjunto {xi , wi } de tal forma que a igualdade acima vale para qualquer polinômio de grau
6 k. Em princípio, esta escolha não introduz vantagem nenhuma em relação ao uso dos polinômios de
Legendre, usados nas fórmulas de Newton-Cotes, pois estes também são exatamente representados por esta
fórmula de quadratura, como se pode notar nas equações (3.3a-c). A vantagem consiste na escolha de um
conjunto de polinômios ortogonais e nas suas raízes para as abcissas. Neste caso, conforme se demonstra no
teorema abaixo, a fórmula (3.13) será exata para polinômios de grau 6 2k + 1! Neste sentido que se referiu
às fórmulas gaussianas como superacuradas.
Teorema 3.1
Sejam
1. ψk (x), k = 0, 1, . . . , N , polinômios de grau k, ortogonais relativamente ao produto interno
Z b
hψi |ψj i = ψi (x)ψj (x)dx = 0, para j 6= i.
a
é exata para polinômios de grau 6 N , então ela também será exata para polinômios de grau
6 2N + 1.
Demonstração. Se p2N +1 (x) é um polinômio qualquer de grau 6 2N + 1, então este pode ser escrito
como:
p2N +1 (x) = ψN +1 (x)qN (x) + rN (x),
onde qN (x) e rN (x) são polinômios de grau 6 N e ψN +1 (x) é um polinômio de grau 6 N + 1 da família
ortogonal. Integrando esta expressão no intervalo (a, b):
Z b Z b Z b
p2N +1 (x)dx = ψN +1 (x)qN (x)dx + rN (x)dx,
a a a
observa-se que qN (x) sempre pode ser escrito na forma de uma combinação linear dos polinômios ψ1 (x), . . . , ψN (x),
pois estes são ortogonais. Portanto,
Z b
ψN +1 (x)qN (x)dx = 0.
a
Assim, se for usada a quadratura exata para rN (x), dada por (3.13), resulta
Z b Z b N
X
p2N +1 (x)dx = rN (x)dx = wi rN (xi ) .
a a i=1
Agora, se as abcissas {xi }, i = 0, 1, . . . , N , forem escolhidas como as raízes do polinômio ψN +1 (x), isto é,
ψN +1 (xi ) = 0, ∀i = 0, 1, . . . , N , resulta finalmente
Z b N
X
p2N +1 (x)dx = wi p2N +1 (xi ) .
a i=1
Um procedimento garantido para gerar este conjunto é fornecido pela relação de recorrência
onde
hxpj |pj i
aj = (3.15a)
hpj |pj i
hpj |pj i
bj = . (3.15b)
hpj−1 |pj−1 i
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 3. Integração Numérica 49
x2 b N
x2 − x1 x2 − x1 X
Z Z
W (y)f (y)dy = W (x)f (x)dx = wj f (yj ) + RN , (3.19)
x1 b−a a b − a j=1
onde
x2 − x1 bx1 − ax2
yj = xj + , j = 1, . . . , N,
b−a b−a
sendo {xj } as raízes de pN (x) (3.17).
A seguir, serão vistas algumas das regras de quadratura gaussiana clássicas.
os quais são ortogonais no intervalo (−1, 1). Neste caso, a fórmula de Gauss-Legendre fica, a partir de (3.16),
Z 1 N
X
f (x)dx = wj f (xj ) + RN , (3.20)
−1 j=1
e os pesos são
2
wj = 2, j = 1, . . . , N
1− [PN0 (xj )]
x2j
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
50 3.3. Quadratura gaussiana
Tabela 3.3: Abcissas {xj } (raízes dos polinômios de Legendre) e pesos {wj } para integração de Gauss-Legendre.
±xj wj
√ N =2
1/ 3 1
N =3
p0 8/9
3/5 5/9
N =4
0.3399810435848562648 0.65214515486254614263
0.8611363115940525752 0.34785484513745385737
N =5
0.00000000000000000000 128/225
0.53846931010568309104 0.47862867049936646804
0.90617984593866399280 0.23692688505618908751
N =6
0.23861918608319690863 0.46791393457269104739
0.66120938646626451366 0.36076157304813860757
0.93246951420315202781 0.17132449237917034504
N =7
0.00000000000000000000 512/1225
0.40584515137739716691 0.38183005050511894495
0.74153118559939443986 0.27970539148927666790
0.94910791234275852453 0.129484966168869693271
e o erro de truncamento é
4
22N +1 (N !)
RN = 3f
(2N )
(ξ), (−1 < ξ < 1) .
(2N + 1) [(2N )!]
A tabela 3.3 mostra as abcissas e os pesos para as fórmulas de Gauss-Legendre até N = 7. Valores de
{xj } e {wj } para N > 7 podem ser encontrados em Abramowitz & Stegun [2, capítulo 25]. Valores exatos
para as raízes e os pesos somente podem ser encontrados para um número finito de polinômios. Para os
restantes, é necessário obter-se estas quantidades numericamente.
Caso seja necessário calcular a quadratura no intervalo (x1 , x2 ) qualquer, a fórmula de Gauss-Legendre
fica, a partir de (3.19),
x2 1 N
x2 − x1 x2 − x1 X
Z Z
f (y)dy = f (x)dx = wj f (yj ) + RN , (3.22)
x1 2 −1 2 j=1
sendo
x2 − x1 x1 + x2
yj = xj + , j = 1, . . . , N.
2 2
R2
Exemplo 3.4. Calcula-se novamente a quadratura 1 dx x , porém agora utilizando-se as fórmulas de Gauss-
Legendre para um intervalo geral (3.22), com x1 = 1 e x2 = 2.
1 1 1
Z 2
dy
≈ w1 + w2 ,
1 y 2 y1 y2
onde
1 3 1 3
y1 = x1 + , y2 = x2 + ,
2 2 2 2
x1 e x2 são as raízes de (
1 x1 = − √13
P2 (xj ) = 3x2j − 1 = 0 =⇒
2 x2 = √1
3
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 3. Integração Numérica 51
e
2
wj = 2, j = 1, 2 =⇒ w1 = w2 = 1.
1− [P20 (xj )]
x2j
Portanto,
3 1 3 1
y1 = − √ , y2 = + √
2 2 3 2 2 3
2
1 1 1
Z
dy
≈ + = 0, 692307692,
1 y 2 y1 y2
cujo erro relativo é de apenas 0,12%, o qual é um pouco melhor que o resultado obtido com a regra de
Simpson (seção 3.2.1.2), para a qual foram necessários 3 pontos.
1 1 1 1
Z 2
dy
≈ w1 + w2 + w3 ,
1 y 2 y1 y2 y3
onde
1 3 1 3 1 3
y1 = x1 + , y2 = x2 + , y3 = x3 + ,
2 2 2 2 2 2
sendo x1 , x2 e x3 as raízes de P3 (x):
q
x 1
=− 3
5
1
P3 (xj ) = 5xj − 3xj = 0 =⇒ x2
3
=0
2 q
= 35
x
3
e
2 5 8
wj = 2, j = 1, 2, 3 =⇒ w1 = w3 = , w2 = .
1− [P30 (xj )] 9 9
x2j
Portanto,
3 1 3 3 3 1 3
r r
y1 = − , y2 = , y3 = +
2 2 5 2 2 2 5
e
1 5 1 8 1 5 1
Z 2
dy
≈ + + = 0, 693121693,
1 y 2 9 y1 9 y2 9 y3
o qual tem um erro relativo de 0,0037%, um pouco melhor que o resultado obtido com a regra de Bode
(seção 3.2.1.4), a qual necessitou de 5 pontos.
N
1
f (x)
Z X
√ dx = wj f (xj ) + RN , (3.23)
−1 1 − x2 j=1
sendo
x2 − x1 x1 + x2
yj = xj + , j = 1, . . . , N.
2 2
A regra de Gauss-Chebyshev possui uma implementação numérica bastante simples. A rotina apresen-
tada abaixo, função gauss_chebyshev (programa 3.1), ilustra como esta implementação pode ser realizada
com o Fortran 95.
Programa 3.1: Implementação da fórmula de Gauss-Chebyshev em Fortran 95.
! ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ FUNCAO Gauss_Chebyshev ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
! Implementa a f o r m u l a de Gauss−Chebyshev para uma i n t e g r a l d e f i n i d a de
! limites arbitrarios .
!
! Argumentos :
! f : Funcao a s e r i n t e g r a d a ( i n t e g r a n d o menos f u n c a o p e s o ) .
! x1 : L i m i t e i n f e r i o r de i n t e g r a c a o .
! x2 : L i m i t e s u p e r i o r de i n t e g r a c a o .
! n : Numero de p o n t o s u s a d o s na q u a d r a t u r a g a u s s i a n a ( n > 1 ) .
!
! Autor : Rudi G a e l z e r , IFM − UFPel .
! Data : Maio / 2 0 0 8 .
!
function gauss_chebyshev ( f , x1 , x2 , n )
r e a l ( kind= dp ) : : gauss_chebyshev
r e a l ( kind= dp ) , intent ( in ) : : x1 , x2
integer , intent ( in ) :: n
r e a l ( kind= dp ) : : x_menos , x_mais , y , xj , wj
integer : : j
INTERFACE
function f ( x )
use Modelos_Computacionais_Dados
r e a l ( kind= dp ) :: f
r e a l ( kind= dp ) , intent ( in ) : : x
end function f
END INTERFACE
!
x_menos= 0 . 5 ∗ ( x2 − x1 )
x_mais= 0 . 5 ∗ ( x1 + x2 )
wj= p i / r e a l ( n , dp )
gauss_chebyshev= 0 . 0 _dp
do j= 1 , n
x j= c o s ( ( j −0.5)∗ p i / r e a l ( n , dp ) )
y= x_menos∗ x j + x_mais
gauss_chebyshev= gauss_chebyshev + wj ∗ f ( y )
end do
return
end function gauss_chebyshev
Tabela 3.4: Abcissas {xj } (raízes dos polinômios de Laguerre) e pesos {wj } para integração de Gauss-Laguerre.
xj wj
N =2
√ √
2− 2 2− 2
√ 2
4(−1+ 2)
√ √
2+ 2 2+ 2
√ 2
4(1+ 2)
N =3
0.41577455678347908331 0.71109300992917301545
2.29428036027904171982 0.27851773356924084880
6.28994508293747919866 0.01038925650158613575
N =4
0.32254768961939231180 0.60315410434163360164
1.74576110115834657569 0.35741869243779968664
4.53662029692112798328 0.03888790851500538427
9.39507091230113312923 0.00053929470556132745
N =5
0.26356031971814091020 0.52175561058280865281
1.41340305910651679222 0.39866681108317592745
3.59642577104072208122 0.07594244968170759539
7.08581000585883755692 0.00361175867992204845
12.6408008442757826594 0.00002336997238577623
W (x) = e−x .
Z ∞ N
X
e
−x
f (x)dx = wj f (xj ) + RN , (3.25)
0 j=1
Tabela 3.5: Abcissas {xj } (raízes dos polinômios de Hermite) e pesos {wj } para integração de Gauss-Hermite.
±xj wj
√ N =2
√
1/ 2 π/2
N =3 √
p0.0 2 π/3
√
3/2 π/6
N =4
0.52464762327529031788 0.80491409000551283651
1.65068012388578455588 0.08131283544724517714
N =5 √
0, 00000000000000000000 8 π/15
0.95857246461381850711 0.39361932315224115983
2.02018287045608563293 0.01995324205904591321
N =6
0.43607741192761650868 0.72462959522439252409
1.33584907401369694971 0.15706732032285664392
2.35060497367449222283 0.00453000990550884564
Z ∞ N
2 X
e−x f (x)dx = wj f (xj ) + RN , (3.26)
−∞ j=1
A tabela 3.5 mostra as abcissas e os pesos para as fórmulas de Gauss-Hermite até N = 6. Uma listagem
mais completa pode ser encontrada em [2, capítulo 25].
onde n é a ordem do erro da fórmula de quadratura. A fórmula de extrapolação é então dada por (2.14):
1
h h
Iextrapolado = I + EA = n [Rn I (h/R) − I (h)] . (3.27)
R R R −1
Tomando agora a regra trapezoidal estendida (3.10),
1
Z b
f (x)dx ≈ h (f0 + 2f1 + 2f2 + · · · + 2fN −1 + fN ) ≡ IT E (h) , (3.28)
a 2
pode-se mostrar [12, Eq. 4.2.1] que o erro total é dado por uma série de potências pares de h:
EAT E = C1 h2 + C2 h4 + C3 h6 + · · · .
Portanto, n = m = ` = · · · = 2 nas fórmulas extrapoladas (2.14 – 2.17) e nas estimativas de erros (2.13,
2.15, 2.18). Desta forma, o resultado Iextrapolado possui um erro agora da ordem O h4 .
o qual possui um erro da ordem O h4 . Contudo, não se conhece o valor deste erro; tudo o que se obteve
(0)
até este momento foi o erro EA0 (h/2), correspondente à aproximação IR (h/2).
(1)
Para se calcular o erro de IR (h), é necessário agora aplicar a fórmula (2.15), o que implica na necessidade
(1)
do cálculo de IR (h/2). Desta forma, obtém-se EA1 (h) e EA1 (h/2), dados por:
24 1
(1) h (1) h (1) h (1)
EA1 (h) = 4 I − IR (h) e EA1 = 4 I − IR (h) .
2 −1 R 2 2 2 −1 R 2
(1) (2)
O valor extrapolado agora passa a ser IR (h/2) + EA1 (h/2), o qual é identificado por IR (h):
1
(2) (1) h (1)
IR (h) = 4 24 IR − IR (h) ,
2 −1 2
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
56 3.4. Integração automática e adaptativa
(1)
cujo erro é da ordem O h ; porém, a melhor estimativa de erro é EA1 (h/2), correspondente a IR (h/2).
6
(2) (2)
Para se calcular o erro de IR (h) é necessário calcular IR (h/2), o que reinicia novamente o ciclo.
Para sistematizar, pode-se afirmar que, aplicando-se a regra trapezoidal estendida para uma sucessão
de incrementos h cada vez menores, sendo que cada valor consecutivo de h é a metade do valor anterior
(k)
(R = 2), obtém-se de (3.28) as integrais de Romberg IR (h), k = 0, 1, 2, . . . , e as melhores estimativas de
erro, fornecidas por EAk−1 (h/2), onde
(0)
IR (h) ≡IT E (h)
1 1
(1) 2 (0) h (0) h (0) h (0)
IR (h) = 2 2 IR − IR (h) , EA0 = 2 I − IR (h)
2 −1 2 2 2 −1 R 2
1 1
(2) 4 (1) h (1) h (1) h (1)
IR (h) = 4 2 IR − IR (h) , EA1 = 4 I − IR (h)
2 −1 2 2 2 −1 R 2
1 1
(3) 6 (2) h (2) h (2) h (2)
IR (h) = 6 2 IR − IR (h) , EA2 = 6 I − IR (h)
2 −1 2 2 2 −1 R 2
.. ..
. .
1
(k) (k−1) h (k−1)
IR (h) = k 4k IR − IR (h) ,
4 −1 2
(3.29)
1
h (k−1) h (k−1)
EAk−1 = k IR − IR (h) .
2 4 −1 2
(4)
Supondo então que se queira aplicar a regra de extrapolação (3.29) até k = 4. Para se obter IR (h)
(3) (3) (2) (2) (2)
é necessário calcular IR (h), IR (h/2), o que implica em calcular antes IR (h), IR (h/2) e IR h/22 ,
(1) (1) (1) (1) (0) (0)
para as quais são necessárias IR (h), IR (h/2), IR h/22 e IR h/23 e, finalmente, IR (h), IR (h/2),
(0) (0) (0)
IR h/22 , IR h/23 , IR h/24 . Ou seja, para uma extrapolação até o k-ésimo termo, é necessária a
aplicação da quadratura trapezoidal para os intervalos h, h/2, . . . , h/2k , o que vai implicar em até N = 2k
subintervalos.
(0)
Para o cálculo da estimativa de erro EAk−1 (h/2), é necessário que se conheça também IR (h), . . . ,
(0)
IR h/2k . O diagrama da figura 3.5 ilustra a interdependência entre os consecutivos estágios de extrapo-
(0) h
IR (h) = (f0 + f1 ) .
2
O primeiro estágio de refinamento consiste então em adicionar o valor da função no ponto central através
das transformações
h b−a
N = 2, h→ , x0 = a, x1 = , x2 = b, f1 → f2
2 2
resultando
1 (0)
(0) h h
IR = IR (h) + f1 ;
2 2 2
o segundo estágio consiste na adição dos pontos em 1/4 e 3/4 de h, resultando
1 (0) h
(0) h h
IR = IR + 2 (f1 + f3 )
22 2 2 2
Figura 3.6: Chamadas consecutivas da rotina que calcula a quadratura trapezoidal estendida incorporando a infor-
mação de chamadas anteriores e calculando o integrando somente nos novos pontos necessários para o refinamento
da grade. A linha final mostra o número total de cálculos do integrando após as quarta chamada da rotina.
Algoritmo 3.3 Calcula o n-ésimo refinamento da regra trapezoidal estendida (3.28), sendo dados f (x), os
limites de integração (a, b) e o resultado da quadratura no estágio anterior (IRom ). Os pontos incluídos em
cada estágio são sempre distintos de todos os outros pontos anteriores, conforme ilustrado na figura 3.6.
Quando chamado com n = 1, o algoritmo calcula a quadratura usando h = b − a; quando chamado com
n = 2, 3, . . . , o resultado será refinado pela adição de 2n−2 pontos interiores adicionais.
Dados: f (x), a, b, n e IRom :
Se n = 1 então:
IRom = (1/2) (b − a) [f (a) + f (b)]
senão:
npts = 2n−2
δ = (b − a) /npts
x = a + δ/2
soma = 0
Para j = 1 : npts, faça:
soma = soma + f (x)
x=x+δ
final laço
IRom = (1/2) [IRom + (b − a) soma/npts]
final teste
Cabe aqui mencionar que tanto a função trapez_rom quanto a subrotina quad_rom necessitam de infor-
mações adicionais para que todas as interfaces e espécies de variáveis sejam explicitadas. A melhor estratégia
consiste em inserir estas rotinas em um módulo, o qual pode usar outros módulos que contenham declarações
globais de variáveis ou rotinas auxiliares. Outro ponto que merece destaque é que a subrotina quad_rom
faz uso de vetores alocáveis para acumular os resultados das diagonais da figura 3.5. Embora raramente
possa acontecer, é possível que o tamanho declarado para os vetores seja excedido devido às exigências na
acuracidade do resultado. Para evitar a ocorrência de um erro do tipo out-of-bounds, a subrotina faz uso de
vetores de ponteiros e invoca, sempre que necessário, a função auxiliar realocar, ela própria uma função
de ponteiro, a qual se encarregará de realocar os vetores auxiliáres. A função realocar é baseada na rotina
reallocate_dv apresentada no Numerical Recipes [12].
Todas as rotinas desenvolvidas neste capítulo, em conjunto com os módulos necessários para implementá-
las, podem ser obtidos em http://minerva.ufpel.edu.br/~rudi/grad/ModComp/Progs/.
A implementação de uma integração automática utilizando quadraturas gaussianas não é tão simples
quanto com as regras newtonianas, principalmente porque para as fórmulas da seção 3.3, diferentes valores
de N resultam em distintos valores das abcissas {xi }, o que não permite o uso de cálculos prévios da
quadratura, como acontece com o método de Romberg. Isto implica em um maior tempo de computação
para o cálculo da quadratura.
Para tentar remediar este problema, diferentes técnicas de extensão da quadratura gaussiana foram
elaboradas, baseadas na definição de nodos pré-definidos, ou seja, um conjunto de fixo de valores de abcissas
que são sempre utilizados para distintos valores de N . O problema envolve então a escolha adequada de
pesos e dos pontos {xi } restantes que maximizam a exatidão do resultado no menor tempo de computação
possível.
Um destes métodos denomina-se Quadratura de Gauss-Radau, onde um dos nodos fixos é um dos limites
da integração. Outro método é a Quadratura de Gauss-Lobatto, onde ambos os extremos a e b são nodos
fixos. Uma outra classe de métodos importantes são as fórmulas de Gauss-Kronrod, onde todas as abcissas
utilizadas em um cálculo prévio da quadratura são aproveitadas para valores subseqüentes de N . Se o
cálculo inicial utilizou N = m pontos, então o próximo cálculo utilizará N = 2n + m pontos: os n novos
pesos e abcissas mais os m pesos e abcissas anteriores. Kronrod mostrou que se n e m são escolhidos
tais que n = m + 1, uma fórmula de quadratura automática pode ser estabelecida para a regra de Gauss-
Legendre. Neste caso, a seqüência de pontos novo utilizados é N = 10, 21, 43, 87, . . . . Bibliotecas de
software numérico, tanto comerciais quanto gratuitas, sempre disponibilizam rotinas do tipo Gauss-Kronrod.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 3. Integração Numérica 61
3.4.3 Integração adaptativa
Retornando à fórmula geral para quadratura numérica (3.1),
Z b N
X
f (x) dx = wi f (xi ) ,
a i=0
todos os métodos apresentados neste capítulo restringem-se a uma única regra utilizada para a determinação
das abcissas {xi } e os pesos {wi }. Um algoritmo de quadratura adaptiva, por outro lado, escolhe os valores
de {wi } e {xi } dinamicamente durante a computação, de forma a adaptar-se ao comportamente particular
de f (x).
Quando o integrando apresenta um comportamento que dificulta o cálculo da sua quadratura (f (x)
oscila rapidamente, por exemplo), a regra em uso, aplicada a todo intervalo de integração, pode encontrar
dificuldades para obter um resultado com a precisão solicitada. Nesta situação torna-se necessário o uso
de uma rotina adaptativa. Contudo, bons algoritmos de quadratura adaptiva são bastante complexos do
ponto de vista de cálculo numérico e custosos para ser desenvolvidos. Nesta situação, é recomendável que
o programador busque uma rotina pronta em alguma biblioteca de software numérico, ao invés de tentar
desenvolvê-la por si mesmo.
No método de Romberg, o valor de h é reduzido pela metade a cada iteração consecutiva do método,
até que a precisão solicitada seja alcançada. Por se basear em uma regra Newtoniana, o método exige que
o valor de h seja o mesmo ao longo de todo o intervalo de integração. Contudo, o comportamento de f (x)
pode não requerer que h seja o mesmo ao longo de todo o intervalo para que a precisão solicitada seja
atingida. Em regiões onde o integrando varia lentamente apenas uns poucos pontos podem ser suficientes;
ao passo que nas regiões onde f (x) varia rapidamente, um número maior de pontos é requerido.
Considera-se, por exemplo, o integrando ilus-
trado na figura 3.7. Na região d–e, f (x) é essencial-
mente constante, e o incremento h pode ser grande.
Contudo, na região a–d, f (x) varia rapidamente,
significando que o incremento h deve ser pequeno.
De fato, a região a–d pode ser dividida em três re-
giões distintas, como ilustrado. Inspeção visual do
comportamento de f (x) pode identificar as regiões
onde h deve ser pequeno ou grande. Porém, cons-
truir o gráfico de f (x) é um processo custoso e de-
morado, principalmente quando é necessário o cál-
culo de um número grande de integrais. Uma rotina
adaptativa deve ser capaz de identificar as regiões
onde h necessita ser maior ou menor e automati-
camente dividir o intervalo de integração de acordo
com essa identificação. Boas rotinas automáticas Figura 3.7: Função f (x) que apresenta distintos compor-
variam não somente os valores de h e dos pesos, tamentos ao longo do intervalo de integração.
mas tentam também diferentes regras de quadra-
tura, sempre visando a otimização no cálculo numérico. Em determinados intervalos, uma rotina automá-
tica do tipo Romberg pode atingir a precisão solicitada rapidamente, enquanto que em outro intervalo o
algoritmo pode optar por uma regra de quadratura gaussiana, por exemplo.
4.1 Introdução
Um problema que surge com muita freqüência em computação científica consiste no cálculo das raízes
de uma equação na forma
f (x) = 0. (4.1)
Ou seja, é necessário calcular o conjunto de valores de {x} onde f (x) é nula. Em muitas situações, a função
f (x) pode ser conhecida explicitamente, como é o caso de um polinômio ou de uma função transcendental.
Às vezes, contudo, f (x) pode vir a ser conhecida somente de forma implícita, como ocorre quando f (x) é
solução de uma equação diferencial ou integral.
Em raras circunstâncias é possível calcular-se analiticamente as raízes de f (x). Situações onde isso
ocorre restringem-se, por exemplo, a equações polinomiais do 1º ao 4º grau ou de um polinômio qualquer
fatorável. Porém em geral somente soluções aproximadas para as raízes são possíveis, dependendo-se de
alguma técnica computacional para calcular a aproximação. Dependendo do contexto, solução aproximada
pode significar um ponto x∗ para o qual (4.1) é aproximadamente satisfeita, isto é, para o qual |f (x∗ )| é
pequeno, ou um ponto x∗ que está próximo de uma solução de (4.1). Infelizmente o conceito de solução
aproximada é um tanto vago. Uma solução aproximada obtida por um computador conterá sempre um erro
devido ao arredondamento, ou devido a uma instabilidade numérica ou devido ao truncamento gerado pelo
método empregado. De fato, há sempre infinitas soluções aproximadas, todas igualmente válidas, embora a
solução de (4.1) possa ser única.
Uma situação onde o efeito dos erros de arredondamento produzem falsas raízes pode ser vista na figura
6
1.4 à esquerda. Esta figura mostra o gráfico do polinômio p6 (x) = (x − 1) , escrito na forma expandida,
para valores próximos a x = 1. O gráfico foi gerado a partir de um programa de computador e, embora
as 6 raízes de p6 (x) são únicas e iguais a 1, o gráfico mostra um número grande de pontos onde a curva
cruza o eixo das abcissas. Estas falsas raízes foram produzidas pelos erros de arredondamento resultantes
principalmente do cancelamento de quantidades próximas entre si. Este exemplo isolado já mostra algumas
das dificuldades envolvidas no cálculo de raízes.
p3 (x) = x3 − x − 1 = 0. (4.2)
As raízes de p3 (x) podem ser obtidas analiticamente; elas consistem em uma raiz real e duas complexas
conjugadas:
√ 1/3 √ 1/3
1 27 3 69 1
9 + 69
x1 = − + 2
≈ 1.3247179572447460260
3 2 2 32/3
63
64 4.2. Métodos iterativos para o cálculo de raízes reais
√ √ √ 1/3
1 √ 27 3 69 1/3 1 − i 3 12 9 + 69
x2 = − 1+i 3 − −
6 2 2 232/3
≈ −0.66235897862237301298 + 0.56227951206230124390i
√ √ √ 1/3
1 √ 27 3 69 1/3 1 + i 3 12 9 + 69
x3 = − 1−i 3 − −
6 2 2 232/3
≈ −0.66235897862237301298 − 0.56227951206230124390i.
Os métodos iterativos mais conhecidos serão agora apresentados e estes terão a sua capacidade de calcular
a raiz x1 analisada.
o que irá definir um novo intervalo, [a0 , ξ1 ] ou [ξ1 , b0 ] que contém a raiz de f (x), reiniciando o ciclo.
No exemplo,
p3 (1, 5) p3 (1) = −0, 875 < 0 ao passo que p3 (1, 5)p3 (2) = 4, 375 > 0.
Portanto, a raiz encontra-se no intervalo [1; 1, 5]. Tomando a nova aproximação e o seu erro:
1 + 1, 5
ξ2 = = 1, 25
2
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 65
EA2 = 0, 25.
Verificando ξ2 :
p3 (1, 25) p3 (1) > 0 ao passo que p3 (1, 25)p3 (1, 5) < 0.
Portanto x1 ∈ [1, 25; 1, 5]. A proxima iteração:
1, 25 + 1, 5
ξ3 = = 1, 375
2
EA3 = 0, 125.
Verificando ξ3 :
p3 (1, 25) p3 (1, 375) < 0 ao passo que p3 (1, 375)p3 (1, 5) > 0.
Portanto,
1, 25 + 1, 375
ξ4 = = 1, 3125
2
EA4 = 0, 0625.
Verificando ξ4 :
p3 (1, 25) p3 (1, 3125) > 0 ao passo que p3 (1, 3125)p3 (1, 375) < 0.
Portanto, x1 ∈ [1, 3125; 1, 375]. Iterando novamente,
1, 3125 + 1, 375
ξ5 = = 1, 34375
2
EA5 = 0, 03125.
Verificando ξ5 :
p3 (1, 3125) p3 (1, 34375) < 0 ao passo que p3 (1, 34375)p3 (1, 375) > 0.
Portanto, ξ5 ∈ [1, 3125; 1, 34375].
As próximas 2 iterações produzem
x1 = 1, 328125 ± 0, 015625
x1 = 1, 3203125 ± 0, 0078125.
Portanto, pode-se observar que os resultados das iterações estão monotonicamente convergindo para a raiz
x1 ≈ 1.3247179572447460260, mas após 7 iterações somente 2 casas decimais corretas foram obtidas. Esta
é uma característica do método da bisecção: uma vez que a raiz de uma função contínua foi cercada, ele
certamente retornará o resultado correto, porém sua convergência é extremamente lenta. De uma forma
mais rigorosa, como o comprimento do intervalo que sabidamente contém a raiz é dividido pelo fator 2 a
cada iteração, o método da bisecção produz uma dígito binário correto a cada passo.
Um algoritmo que implementa o método da bisecção deve iniciar com os dois valores a0 e b0 (b0 > a0 )
para x, verificar se a raiz realmente está no intervalo fornecido e retornar os valores da raiz aproximada
a+b
ξ= (sendo a = a0 e b = b0 na primeira iteração)
2
e o erro absoluto da aproximação
|b − a|
EA = .
2
O erro absoluto deve então ser comparado com o valor máximo de erro tolerado, parâmetro que também
deve ser fornecido ao algoritmo. Se EA é maior que a tolerância, o novo intervalo [a, b] que contém a raiz é
determinado e o procedimento é repetido novamente. Se EA é menor ou igual que a tolerância, o algoritmo
retorna a última aproximação para a raiz. O algoritmo 4.1 implementa este processo.
A subrotina 4.1 implementa o algoritmo 4.1 em Fortran 95. Deve-se notar que, além de implementar os
passos contidos no algoritmo, a rotina controla também se realmente há pelo menos uma raiz no intervalo
fornecido e também se a tolerância solicitada for exageradamente pequena, como seria o caso se fosse
fornecido o valor erro= 10−20 ou menor para um resultado em precisão dupla, que contém somente cerca
de 15 casas decimais de precisão. Este controle é realizado pela variável inteira de saída iflag.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
66 4.2. Métodos iterativos para o cálculo de raízes reais
Algoritmo 4.1 Implementação do método da bisecção.
Dados: a0 , b0 (b0 > a0 ), f (x): função contínua em [a0 , b0 ] e tol (tolerância máxima para o erro).
an = a0 ; bn = b0
Para n = 0, 1, 2, . . . , faça:
m = (an + bn ) /2
Se f (an ) f (m) 6 0:
an+1 = an ; bn+1 = m
erro= |m − an | /2
Senão:
an+1 = m; bn+1 = bn
erro= |bn − m| /2
Fim Se
Se erro 6 tol: sai laço
Fim laço.
p3 (2).w1 − p3 (w1 ) .2
w2 = = 1, 253112033 . . . ,
p3 (2) − p3 (w1 )
f (bn ) an − f (an ) bn
wn = . (4.4)
f (bn ) − f (an )
O ponto wn é a raiz da reta secante que passa pelos pontos (an , f (an )) e (bn , f (bn )). Se f (x) for côncava
na raiz, ou seja, se f 0 (x) > 0 na raiz, os pontos wn estarão sempre à esquerda da raiz. Se f (x) for convexa
(f 0 (x) < 0 na raiz), os pontos wn estarão sempre à direita da raiz. No caso de p3 (x), este é côncavo em
x = x1 e por conseqüência os valores de wn irão se aproximar de x1 sempre pela esquerda, como se pode
ver na figura 4.1.
Um aperfeiçoamento do método da falsa posição que permite acelerar a taxa de convergência à raiz é o
chamado Método da falsa posição modificado. Neste método, as secantes são substituídas por retas
de inclinações cada vez menores até que a raiz para uma determinada reta se encontre do lado oposto à
aproximação wn anteriormente obtida. Desta forma, as aproximações convergem à raiz pelo dois lados, ao
invés de um lado somente, como no método da falsa posição. Este método é ilustrado na figura 4.2, o valor
da ordenada em b0 é reduzido pela metade até que a raiz da reta se encontra do lado direito da raiz de f (x).
O algoritmo 4.2 mostra como o método da falsa posição modificado pode ser implementado. Ao contrário
da bisecção, o presente método não pode determinar inequivocamente um valor mínimo para o intervalo
onde a raiz se encontra. Na falta de uma melhor estimativa, o algoritmo toma como primeiro critério de
parada um valor mínimo admissível para o intervalo que contém a raiz (xtol). Como o valor de f (x) é
continuamente reduzido à metade em um dos extremos do intervalo, um valor absurdamente pequeno para
xtol pode inadvertidamente resultar em um valor numérico nulo para F ou G, devido à representação de
ponto flutuante. Para evitar esta ocorrência, o algoritmo utiliza um segundo critério de parada (ftol) que
estabelece o menor valor admissível para |f (x)| em qualquer um dos pontos extremos do intervalo.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
68 4.2. Métodos iterativos para o cálculo de raízes reais
Figura 4.1: Método da falsa posição. Figura 4.2: Método da falsa posição modificado.
A subrotina 4.2 implementa o algoritmo 4.2. Além dos parâmetros de controle xtol e ftol já discuti-
dos, introduz-se um parâmetro opcional ntol que controla o número total de iterações admitidas, quando
presente. Este parâmetro pode ser importante quando o cálculo de f (x) é muito custoso do ponto de vista
computacional. Ele pode servir também para indicar se o cálculo de f (x) está sendo feito corretamente ou
se a obtenção da raiz é particularmente difícil.
Programa 4.2: Subrotina em Fortran 95 que implementa o método da falsa posição modificado.
! ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ SUBROTINA FAL_POS_MOD ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
! Busca uma r a i z da f u n c a o F(X) p e l o Metodo da F a l s a P o s i c a o M o d i f i c a d o .
! ∗∗∗∗∗∗ Argumentos de e n t r a d a ∗∗∗∗∗∗
! F : Nome da f u n c a o c u j a r a i z e ’ d e s e j a d a
! A,B: Pontos e x t r e m o s do i n t e r v a l o onde a r a i z e ’ p r o c u r a d a .
! XTOL: T o l e r a n c i a maxima para o i n t e r v a l o que contem a r a i z .
! FTOL: T o l e r a n c i a maxima para o v a l o r a b s o l u t o de F(W) .
! NTOL: Numero maximo de i t e r a c o e s a d m i t i d a s ( o p c i o n a l ) .
! Se NTOL e s t a a u s e n t e , p e r m i t e i n f i n i t a s i t e r a c o e s .
! ∗∗∗∗∗∗ Argumentos de s a i d a ∗∗∗∗∗∗
! A,B: Pontos e x t r e m o s do i n t e r v a l o que contem a m a t r i z .
! W: Melhor e s t i m a t i v a para a r a i z .
! IFLAG : Um i n t e i r o ,
! =−1, Metodo f a l h o u , uma v e z que F( x ) tem o mesmo s i n a l em A e B.
! = 0 , Encerrou , p o r qu e ABS(A−B) <= XTOL.
! = 1 , Encerrou , p o r qu e ABS(F(W) ) <= FTOL.
! = 2 , Encerrou , p o r qu e NTOL i t e r a c o e s foram r e a l i z a d a s .
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 69
! ∗∗∗∗∗∗ Metodo ∗∗∗∗∗∗
! O metodo da f a l s a p o s i c a o m o d i f i c a d o e ’ empregado . I s t o s i g n i f i c a que
! a cada passo , i n t e r p o l a c a o l i n e a r e n t r e os p o n t o s (A,FA) e
! (B ,FB) e ’ empregada , com FA∗FB < 0 , para um novo ponto (W, F(W) )
! que s u b s t i t u i um dos p o n t o s A ou B de t a l forma que novamente FA∗FB < 0 .
! A d i c i o n a l m e n t e , a ordenada de um ponto que e ’ r e p e t i d o em mais de uma
! i t e r a c a o e ’ d i v i d i d o por 2 a cada p a s s o s u b s e q u e n t e .
!
! Autor : Rudi G a e l z e r , IFM − UFPel .
! Data : Junho / 2 0 0 8 .
!
subroutine fal_pos_mod ( f , a , b , x t o l , f t o l , w, i f l a g , n t o l )
r e a l ( kind= dp ) , intent ( in out ) : : a , b
r e a l ( kind= dp ) , intent ( in ) : : xtol , f t o l
integer , intent ( in ) , optional : : n t o l
r e a l ( kind= dp ) , intent ( out ) :: w
integer , intent ( out ) :: iflag
INTERFACE
function f ( x )
use Modelos_Computacionais_Dados
r e a l ( kind= dp ) : : f
r e a l ( kind= dp ) , intent ( in ) : : x
end function f
END INTERFACE
integer : : n
r e a l ( kind= dp ) : : fa , fb , fw , s i g n f a , p r v s f w
!
f a= f ( a )
s i g n f a= s i g n ( 1 . 0 _dp , f a )
f b= f ( b )
i f ( s i g n f a ∗ f b > 0 . 0 _dp) then
print ’ ( " f ( x ) tem o mesmo s i n a l nos d o i s p o n t o s extremos : " , 2 e15 . 7 ) ’ , a , b
i f l a g = −1
return
end i f
w= a
fw= f a
n= 1
do
i f ( abs ( a−b ) <= x t o l ) then ! V e r i f i c a s e i n t e r v a l o e ’ menor que x t o l .
i f l a g= 0
return
end i f
i f ( abs ( fw ) <= f t o l ) then ! V e r i f i c a s e ABS( f (w) ) e ’ menor que f t o l .
i f l a g= 1
return
end i f
w= ( f a ∗b − f b ∗ a ) / ( f a − f b ) ! C a l c u l a novo w por i n t e r p o l a c a o .
p r v s f w= s i g n ( 1 . 0 _dp , fw )
fw= f (w)
i f ( s i g n f a ∗ fw > 0 . 0 _dp) then ! A l t e r a o i n t e r v a l o .
a= w
f a= fw
i f ( fw ∗ p r v s f w > 0 . 0 _dp) f b = 0 . 5 ∗ f b
else
b= w
f b= fw
i f ( fw ∗ p r v s f w > 0 . 0 _dp) f a = 0 . 5 ∗ f a
end i f
Utilizando a rotina fal_pos_mod para o cálculo da raiz de p3 (x), obteve-se os seguintes resultados:
w0 = 1.00000000000000
w1 = 1.16666666666667
w2 = 1.32330827067669
w3 = 1.32654296624656
w4 = 1.32471556046769
w5 = 1.32471795317359.
Ou seja, em 5 iterações, o resultado já concorda com x1 em 5 casas decimais, enquanto que com o método
da bisecção o resultado somente possuía 2 casas decimais corretas após o mesmo número de iterações.
É fácil ver que (4.5) e (4.6) são idênticas. O comportamento das aproximações à raiz de f (x) no método da
secante é ilustrado pela figura 4.3.
Como a raiz não mais permanece necessariamente cercada por dois valores extremos, não é possível
garantir que o método da secante venha a convergir sempre. Caso o método convirja, os critérios usuais
de parada são os seguintes. Para uma determinada iteração, identificada pelo índice n, o método será
considerado bem sucedido se
|f (xn )| 6 ftol ou |xn − xn−1 | 6 xtol. (4.7a)
Ou seja, o valor absoluto da função ou a diferença absoluta entre duas aproximações consecutivas são
considerados menores que um valor de tolerância. Quando não se conhece a ordem de grandeza do valor de
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 71
f (x) em uma vizinhança em torno da raiz ou a ordem de grandeza da própria raiz, pode-se usar os seguintes
valores relativos como critérios de parada:
|f (xn )|
xn − xn−1
6 ftol ou 6 xtol. (4.7b)
fmax xn
A subrotina 4.3 implementa o método da secante. Como critérios de parada foram escolhidos o erro
absoluto no valor da função e o erro relativo entre dois resultados consecutivos. Para evitar um número
excessivo de cálculos de f (x), o parâmetro ntol é obrigatório para a rotina secante.
Programa 4.3: Subrotina em Fortran 95 que implementa o método da secante.
! ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ SUBROTINA SECANTE ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
! Busca uma r a i z da f u n c a o F(X) p e l o Metodo da S e c a n t e .
! ∗∗∗∗∗∗ Argumentos de e n t r a d a ∗∗∗∗∗∗
! FUNC: Nome da f u n c a o c u j a r a i z e ’ d e s e j a d a
! x1 , x2 : Dois v a l o r e s i n i c i a i s para o i n i c i o da i t e r a c a o .
! ERRABS: Primeiro c r i t e r i o de parada . Se ABS(F(Xn) ) <= FTOL,
! e n t a o Xn e ’ a c e i t o como r a i z
! ERRREL: Segundo c r i t e r i o de parada : e r r o r e l a t i v o .
! Se ABS(Xn − Xn−1) <= XTOL∗ABS(Xn) , e n t a o Xn e ’ a c e i t o como r a i z .
! NTOL: Numero maximo de i t e r a c o e s a d m i t i d a s .
! ∗∗∗∗∗∗ Argumentos de s a i d a ∗∗∗∗∗∗
! X: Melhor e s t i m a t i v a para a r a i z .
! IFLAG : Um i n t e i r o ,
! = −1, Metodo f a l h o u . Nenhuma r a i z f o i e n c o n t r a d a em NTOL
! i t e r a c o e s . O u l t i m o v a l o r e n c o n t r a d o para X e ’ r e t o r n a d o .
! = 0 , Encerrou d e v i d o ao p r i m e i r o c r i t e r i o de parada .
! = 1 , Encerrou d e v i d o ao segundo c r i t e r i o de parada .
!
! Autor : Rudi G a e l z e r , IFM − UFPel .
! Data : Junho / 2 0 0 8 .
!
subroutine s e c a n t e ( func , x1 , x2 , e r r a b s , e r r r e l , n t o l , x , i f l a g )
use Modelos_Computacionais_Extras , only : t r o c a
integer , intent ( in ) : : ntol
r e a l ( kind=dp ) , intent ( in ) : : x1 , x2 , e r r a b s , e r r r e l
integer , intent ( out ) :: iflag
r e a l ( kind=dp ) , intent ( out ) : : x
INTERFACE
function f u n c ( x )
use Modelos_Computacionais_Dados
r e a l ( kind=dp ) , intent ( in ) : : x
r e a l ( kind=dp ) : : f u n c
end function f u n c
END INTERFACE
integer : : j
r e a l ( kind=dp ) : : dx , f , f l , x l
f l = f u n c ( x1 )
f= f u n c ( x2 )
i f ( abs ( f l ) < abs ( f ) ) then ! Tome o v a l o r i n i c i a l com o menor v a l o r de
x= x1 ! f u n c ( x ) como aproximacao i n i c i a l .
x l= x2
call troca ( fl , f )
else
x l= x1
x= x2
end i f
do j= 1 , n t o l
dx= ( xl −x ) ∗ f / ( f − f l )
x l= x
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
72 4.2. Métodos iterativos para o cálculo de raízes reais
f l= f
x= x + dx
f= f u n c ( x )
i f ( abs ( f ) <= e r r a b s ) then
i f l a g= 0
return
end i f
i f ( abs ( dx ) <= e r r r e l ∗ abs ( x ) ) then
i f l a g= 1
return
end i f
end do
i f l a g = −1
return
end subroutine s e c a n t e
Ao contrário dos métodos anteriores, o método da secante não exige que os dois pontos iniciais cerquem
a raiz. na tabela abaixo, mostra-se um estudo das aproximações realizadas para a obtenção da raiz x1 de
p3 (x). Em todos os casos, foram tomados os seguintes valores: errabs = 0, errrel = 10−7 e ntol = 50.
Cada coluna corresponde a pares distintos de valores para x1 e x2. Com exceção da primeira coluna, as
demais partiram de valores que não cercam a raiz. Observa-se que o método da secante convergiu em todos
os casos, embora no último a convergência tenha sido bastante lenta.
se aproxima de 1/f 0 (xn ) quando a diferença entre xn e xn−1 tende a zero. Portanto, é razoável que se realize
esta substituição em (4.6), resultando a fórmula do Método de Newton-Raphson,
f (xn )
xn+1 = xn − . (4.8)
f 0 (xn )
Este resultado pode ser determinado de uma maneira um pouco mais rigorosa realizando o desenvolvimento
da função f (x) em série de Taylor em torno do ponto a, supondo que |x − a| 1:
Teorema 4.2.
Seja f (x) diferenciável duas vezes no intervalo fechado [a, b]. Sendo as seguintes condições
satisfeitas:
1. f (a)f (b) < 0;
2. f 0 (x) 6= 0, para x ∈ [a, b];
3. f 00 (x) 6 0 ou f 00 (x) > 0, ∀x ∈ [a, b];
4. nos pontos extremos a e b:
f (a) f (b)
0> > − (b − a) e 0 < 0 < b − a.
f 0 (a) f (b)
Então o método de Newton-Raphson converge para uma solução única ξ de f (x) = 0 em [a, b]
para qualquer escolha de x0 ∈ [a, b].
Alguns comentários a respeito destas condições
são apropriados. Condições (1) e (2) garantem que
há somente uma única solução em [a, b]. Condição
(3) garante que o gráfico de f (x) possui somente
uma única concavidade em [a, b] (côncava ou con-
vexa) e que f 0 (x) é monótono neste intervalo. Final-
mente, a condição (4) garante que a reta tangente a
f (x) em cada ponto extremo do intervalo intercepta
o eixo x dentro de [a, b]. Sucintamente, a condição
(4) exige que f (x) seja suficientemente inclinada em
[a, b] para que a raiz da reta tangente no ponto xn
esteja sempre dentro do intervalo considerado. A rá-
pida convergência do método de Newton-Raphson,
uma vez que as condições acima são satisfeitas, é
ilustrada na figura 4.4.
As condições deste teorema são também sufici-
entes para garantir a convergência do método da
secante, desde que os dois valores iniciais x0 e x1 Figura 4.4: Convergência do método de Newton-Raphson.
estejam ambos dentro de [a, b]. Neste caso, contudo Dado x0 ∈ [a, b], o método rapidamente converge para
a convergência à raiz pode se processar de duas for- limn→∞ xn = ξ.
mas distintas, dependendo da escolha feita para a
ordem dos valores de x0 e x1 .
Um algoritmo que implemente o método de Newton-Raphson deve ter como parâmetros de entrada o(s)
nome(s) da(s) rotina(s) que calcula(m) f (x) e f 0 (x), o valor de x0 que garantidamente satisfaça as condições
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
74 4.2. Métodos iterativos para o cálculo de raízes reais
acima e o(s) parâmetro(s) de tolerância do erro de truncamento do método. Como critério de convergência,
pode-se adotar novamente um ou mais dos critérios (4.7a) ou (4.7b).
Para que se possa escrever uma rotina robusta, portanto, seria necessário garantir as condições (1) –
(4). Contudo, não há como verificar numericamente que as condições (2) e (3) estão sendo cumpridas para
qualquer função f (x) apresentada à rotina. Para compensar esta deficiência, uma estratégia consiste em
utilizar um algoritmo que mistura os métodos de Newton-Raphson e da bisecção. Sempre que a n + 1-ésima
iteração esteja dentro do intervalo [a, b], realiza-se nova iteração usando o método de Newton. Porém, se
xn+1 estiver fora de [a, b] ou se |f (xn+1 )| não estiver diminuindo rápido o suficiente, calcula-se a próxima
iteração usando o método da bisecção. O programa 4.5 implementa justamente este tipo de algoritmo em
Fortran 95.
Programa 4.4: Utiliza uma combinação dos métodos de Newton-Raphson e da bisecção para encontrar uma raiz
dentro do intervalo fornecido.
! ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ SUBROTINA NEWTON_BISEC ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
! Busca uma r a i z da f u n c a o F(X) a t r a v e s de uma combinacao dos metodos de
! Newton−Raphson e da b i s e c c a o .
! ∗∗∗∗∗∗ Argumentos de e n t r a d a ∗∗∗∗∗∗
! F_DFDX: Nome da s u b r o t i n a que r e t o r n a os v a l o r e s de F(X) e F ’ (X) .
! x1 , x2 : Dois v a l o r e s i n i c i a i s para o i n i c i o da i t e r a c a o .
! ERRABS: Primeiro c r i t e r i o de parada . Se ABS(F(Xn) ) <= FTOL,
! e n t a o Xn e ’ a c e i t o como r a i z
! ERRREL: Segundo c r i t e r i o de parada : e r r o r e l a t i v o .
! Se ABS(Xn − Xn−1) <= XTOL∗ABS(Xn) , e n t a o Xn e ’ a c e i t o como r a i z .
! NTOL: Numero maximo de i t e r a c o e s a d m i t i d a s .
! ∗∗∗∗∗∗ Argumentos de s a i d a ∗∗∗∗∗∗
! RAIZ : Melhor e s t i m a t i v a para a r a i z .
! IFLAG : Um i n t e i r o ,
! = −2, Metodo f a l h o u . Nao e x i s t e r a i z em [ x1 , x2 ] .
! = −1, Metodo f a l h o u . Nenhuma r a i z f o i e n c o n t r a d a em NTOL
! i t e r a c o e s . O u l t i m o v a l o r e n c o n t r a d o para X e ’ r e t o r n a d o .
! = 0 , Encerrou d e v i d o ao p r i m e i r o c r i t e r i o de parada ou por novas
! i t e r a c o e s nao a l t e r a r e m o r e s u l t a d o .
! = 1 , Encerrou d e v i d o ao segundo c r i t e r i o de parada .
!
! Autor : Rudi G a e l z e r , IFM − UFPel .
! Data : Junho / 2 0 0 8 .
! ( Baseado na f u n c a o r t s a f e do Numerical R e c i p e s ) .
!
subroutine newton_bisec ( f_dfdx , x1 , x2 , e r r a b s , e r r r e l , n t o l , r a i z , i f l a g )
integer , intent ( in ) : : ntol
r e a l ( kind=dp ) , intent ( in ) : : x1 , x2 , e r r a b s , e r r r e l
integer , intent ( out ) :: iflag
r e a l ( kind=dp ) , intent ( out ) : : r a i z
INTERFACE
subroutine f_dfdx ( x , fx , dfdx )
use Modelos_Computacionais_Dados
r e a l ( kind=dp ) , intent ( in ) :: x
r e a l ( kind=dp ) , intent ( out ) : : fx , dfdx
end subroutine f_dfdx
END INTERFACE
integer :: j
r e a l ( kind=dp ) : : df , dx , dxold , f , fh , f l , temp , xh , x l
c a l l f_dfdx ( x1 , f l , d f )
c a l l f_dfdx ( x2 , fh , d f )
i f ( f l ∗ f h > 0 . 0 _dp) then
i f l a g = −2
return
end i f
i f ( f l == 0 . 0 _dp) then
r a i z= x1
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 75
i f l a g= 0
return
e l s e i f ( f h == 0 . 0 _dp) then
r a i z= x2
i f l a g= 0
return
e l s e i f ( f l < 0 . 0 _dp) then ! O r i e n t e o i n t e r v a l o t a l que f ( x1 ) < 0 .
x l= x1
xh= x2
else
xh= x1
x l= x2
end i f
r a i z= 0 . 5 ∗ ( x1 + x2 )
dxold= abs ( x2 − x1 )
dx= dxold
c a l l f_dfdx ( r a i z , f , d f )
do j= 1 , n t o l ! Laco s o b r e o numero p e r m i t i d o de i t e r a c o e s .
i f ( ( ( r a i z −xh ) ∗ df−f ) ∗ ( ( r a i z −x l ) ∗ df−f ) >= 0 . 0 _dp & ! Se a i t e r a c a o e s t i v e r
. o r . abs ( 2 . 0 ∗ f ) > abs ( dxold ∗ d f ) ) then ! f o r a de [ x1 , x2 ] ,
dxold= dx ! ou s e nao e s t i v e r
dx= 0 . 5 ∗ ( xh − x l ) ! c o n v e r g i n d o rapidamente ,
r a i z= x l + dx ! use b i s e c c a o .
i f ( x l == r a i z ) then
i f l a g= 0
return
end i f
e l s e ! I t e r a c a o e s t a d e n t r o de [ x1 , x2 ] .
dxold= dx
dx= f / d f
temp= r a i z
r a i z= r a i z − dx
i f ( temp == r a i z ) then
i f l a g= 0
return
end i f
end i f
i f ( abs ( f ) <= e r r a b s ) then ! Primeiro c r i t e r i o de parada .
i f l a g= 0
return
end i f
i f ( abs ( dx ) <= e r r r e l ∗ abs ( r a i z ) ) then ! Segundo c r i t e r i o de parada .
i f l a g= 1
return
end i f
c a l l f_dfdx ( r a i z , f , d f )
i f ( f < 0 . 0 _dp) then
x l=r a i z
else
xh=r a i z
end i f
end do
i f l a g = −1
return
end subroutine newton_bisec
Utilizando a rotina newton_bisec para encontrar a raiz x1 de p3 (x) dentro do intervalo [1, 2], com
errabs= 0, errrel= 10−10 e ntol= 50, obteve-se as seguintes iterações:
w0 = 1.50000000000000
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
76 4.3. Raízes complexas de funções analíticas
w1 = 1.34782608695652
w2 = 1.32520039895091
w3 = 1.32471817399905
w4 = 1.32471795724479
w5 = 1.32471795724475.
Pode-se notar que com somente 5 iterações, todas as casas decimais disponíveis para uma variável de dupla
precisão foram obtidas.
sendo
f (x1 ) − f (x0 )
f [x0 , x1 ] =
x1 − x0
f [x1 , x2 ] − f [x0 , x1 ]
f [x0 , x1 , x2 ] = ,
x2 − x0
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 77
expressões particulares de
f [x0 ] = f (x0 )
f [x1 , . . . , xk ] − f [x0 , . . . , xk−1 ]
f [x0 , . . . , xk ] = ,
xk − x0
onde f [x0 , . . . , xk ] é a k-ésima diferença dividida de f (x) nos pontos x0 , . . . , xk . Pode-se verificar
facilmente que (4.10a) realmente interpola f (x) nos três pontos escolhidos. Uma vez que
2
(x − xi ) (x − xi−1 ) = (x − xi ) + (xi − xi−1 ) (x − xi ) ,
onde
ci = f [xi , xi−1 ] + f [xi , xi−1 , xi−2 ] (xi − xi−1 ) .
Se o sinal de (4.11) for escolhido de tal forma que o denominador seja o maior possível1 e o valor de ξ
resultante for tomado como a aproximação xi+1 da raiz de f (x), então a fórmula do método de Müller fica:
2f (xi )
xi+1 = xi − , (4.12)
c2i − 4f (xi ) f [xi , xi−1 , xi−2 ]
p
ci ±
1 Isto é, de tal forma que não possa ocorrer cancelamento, o que facilmente poderia gerar erros de arredondamento.
3. Calcule
4. Calcule q
hi+1 = −2f (xi ) / ci ± c2i − 4f (xi ) f [xi , xi−1 , xi−2 ] ,
6. Calcule
f (xi+1 ) .
8. Se o teste for verdadeiro, retorna a última aproximação obtida (xi+1 ). Se o teste for falso, calcule
onde, conforme mencionado, o sinal do denominador de (4.12) deve ser escolhido de forma adequada.
Uma vez obtido xi+1 , o processo é então repetido utilizando-se xi−1 , xi e xi+1 em (4.12) para se obter
xi+2 e assim consecutivamente. Se os zeros obtidos a partir de (4.12) forem reais, então a situação é ilustrada
graficamente pela figura 4.5. Contudo, as raízes podem ser complexas mesmo que as aproximações iniciais
sejam reais, bastando para isso que c2i − 4f (xi ) f [xi , xi−1 , xi−2 ] < 0. Isto significa que mesmo que a raiz
procurada seja real, aproximações intermediárias podem ser complexas. Porém, à medida que as iterações
se aproximam da raiz real, a parte imaginária de xi+1 tende a zero. O algoritmo 4.3 apresenta a seqüência
de passos necessária para implementar o método de Müller.
O programa 4.5 implementa o método de Müller, conforme delineado no algoritmo 4.3, em uma subrotina
em Fortran 95. O método de Müller encontra uma raiz de cada vez. Para encontrar mais de uma raiz e
evitar que as iterações venham a convergir para valores previamente encontrados, o programa 4.5 possui
uma subrotina interna que implementa a técnica conhecida como deflação. Se, por exemplo, uma raiz ξ1
foi previamente obtida, a rotina calcula o próximo zero não a partir da função f (x) original, mas a partir
da função deflacionada ou reduzida
f (x)
f1 (x) = .
x − ξ1
Desta forma, se a raiz ξ1 for única, limx→ξ1 f1 (x) = 1 e o método deverá convergir para uma raiz ξ2 distinta.
Pode acontecer de ξ2 = ξ1 se esta raiz for dupla. contudo, a função será novamente reduzida para cada nova
raiz encontrada. Assim, se os zeros ξ1 , ξ2 , . . . , ξr foram previamente obtidos, o próximo zero será obtido a
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 4. Soluções de Equações Não Lineares 79
partir da função reduzida
f (x)
fr (x) = .
(x − ξ1 ) (x − ξ2 ) · · · (x − ξr )
Usando a rotina muller para encontrar as três raízes de p3 (x) obteve-se os seguintes resultados.
x1 = (−0.665243809187657, −0.556608124056967)
x2 = (−0.662340508718597, 0.562310707038522)
x3 = (1.32447378321995, 1.727695801886954E − 004)
respectivamente.
• Com errabs= 0 e errrel= 1.0d-5, os resultados são:
x1 = (−0.662358978622373, −0.562279512062300)
x2 = (−0.662358978622373, 0.562279512062301)
x3 = (1.32471795724475, 2.958228394578794E − 031)
respectivamente.
x1 = (−0.662358978622373, −0.562279512062301)
x2 = (−0.662358978622373, 0.562279512062301)
x3 = (1.32471795724475, 0.000000000000000E + 000)
respectivamente.
Ou seja, observa-se que o método rapidamente converge para os valores exatos das raízes.
5.1 Introdução
Neste capítulo serão discutidos alguns métodos de solução numérica de Equações Diferenciais Ordinárias
(ODE) que fazem parte de Problemas de Valor Inicial (PVI).
Em ciências exatas ou naturais, grande parte dos problemas existentes são descritos por equações dife-
renciais, cujas soluções gerais devem ser particularizadas por condições iniciais e/ou condições de contorno.
Quando ocorrem somente as primeiras, diz-se que o problema é de valor inicial.
Um problema de valor inicial pode ser definido da seguinte forma. Sendo x > x0 um parâmetro que
varia de forma independente no problema e y(x) uma função da variável x, a função y(x) será determinada,
em um problema de valor inicial, a partir da solução da equação diferencial ordinária de ordem n
F y (n) (x), y (n−1) (x), . . . , y 0 (x), y(x), x = f (x), (5.1a)
sendo F (· · · ) um funcional qualquer de y(x) e suas derivadas até a ordem n, f (x) uma função de x,
g0 (· · · ) , . . . , gn (· · · ) funcionais das condições iniciais y (x0 ) , . . . , y (n−1) (x0 ) e a0 ,. . . , an constantes. Em
problemas realísticos na física, geralmente os funcionais g0 , . . . , gn são lineares em y (x0 ) , . . . , y (n−1) (x0 )
y 0 = y, (5.2a)
y (x0 ) = a0 , (5.2b)
cuja solução é y(x) = a0 ex−x0 . Para discretizar este PVI de uma forma trivial, considera-se a definição de
uma derivada e omite-se o símbolo de limite:
y (x + h) − y(x)
y 0 (x) −→ ,
h
83
84 5.2. Equações de diferenças finitas lineares
sendo h um pequeno incremento em x. Desta forma, é possível afirmar que a solução no ponto x + h é
obtida a partir do conhecimento da solução em x através de
y (x + h) = (1 + h) y(x).
yn+1 − yn = 1 =⇒ yn = n + c
n (n − 1)
yn+1 − yn = n =⇒ yn = +c
2
yn+1 − (n + 1) yn = 0 =⇒ yn = cn!
Vamos considerar com algum detalhe uma equação de diferenças finitas linear de ordem N com coefici-
entes constantes
yn+N + aN −1 yn+N −1 + · · · + a1 yn+1 + a0 yn = 0. (5.3)
Esta equação deve possuir N soluções linearmente independentes, as quais são da forma yn = β n , ∀n, sendo
β uma constante. Substituindo esta solução em (5.3) resulta
β N + aN −1 β N −1 + · · · + a1 β + a0 = 0, (5.4)
a qual fornece as raízes de um polinômio de grau N . Assumindo que todas as raízes β1 , β2 , . . . , βN são
distintas, a solução geral de (5.3) pode ser finalmente escrita como
yn = c1 β1n + c2 β22 + · · · + cN βN
n
, n = 0, 1, 2, . . . .
y0 = c1 + c2 + c3 = 0
y1 = c1 − c2 + 2c3 = 1
y2 = c1 + c2 + 4c3 = 1
O erro local cometido ao se tormar o passo de xn para xn+1 utilizando o método de Taylor na ordem k, é
fornecido pelo próximo termo da série de Taylor truncada:
hk+1 (k+1) hk
E= (ξ) = f (k) ξ, y (ξ) , xn < ξ < xn + h. (5.8b)
y
(k + 1)! (k + 1)!
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
86 5.4. O Método de Runge-Kutta
Algoritmo 5.1 Algoritmo de Taylor de ordem k.
Para encontrar uma solução aproximada do PVI
y 0 = f (x, y)
y(a) = y0
xn = a + nh, n = 0, 1, . . . , N.
Neste caso, diz-se que o algoritmo de Taylor é de ordem k. O algoritmo 5.1 implementa o método de
Taylor.
Para este método, existe uma outra estimativa de erro que pode ser denominada de erro global ou erro
de convergência. Trata-se de um limite superior no erro cometido ao se utilizar repetidas vezes este método
com um passo fixo h, variando x entre x0 e algum limite superior x = b. Sendo xn = x0 + nh, este erro é
mensurado como
en = y (xn ) − yn ,
isto é, o erro realizado no processo de discretização empregado pelo método de Euler. Nesta definição, yn é
o valor aproximado dado pelo método de Euler (Eq. 5.9a), enquanto que y (xn ) é a solução exata do PVI
no ponto xn . Uma estimativa máxima para en é dada pelo Teorema (5.3.1) abaixo.
Teorema 5.1
Seja yn a solução aproximada de (5.5) obtida pelo Método de Euler (5.9). Se a solução exata de (5.5),
y = y(x), possui sua derivada segunda contínua no intervalo [x0 , b] e se neste intervalo as inegualdades
são satisfeitas para certas constantes positivas L e Y , o erro de convergência en = y (xn ) − yn do Método
de Euler no ponto xn = x0 + nh tem seu valor máximo dado por
hY h (xn −x0 )L i
|en | 6 e −1 .
2L
O teorema (5.3.1) mostra que o erro é O(h), isto é, en → 0 proporcionalmente a h se x = xn é mantido
fixo. Por outro lado, para um h fixo, o erro aumenta na ordem exL quando x = xn se afasta de x0 .
tendência da solução de (5.5). Por outro lado, o algoritmo de Taylor (5.1) para uma ordem k alta é também
impraticável, pois necessita do conhecimento das derivadas de ordem k − 1 de f (x, y).
O Método de Runge-Kutta foi desenvolvido com o intuito de obter maior acurácia que o Método de Euler
e, ao mesmo tempo, evitar a necessidade de se conhecer derivadas de ordens altas. Para tanto, o método faz
uso da estratégia de calcular os valores de f (x, y) em pontos intermediários para cada passo da integração
de (5.5).
A deficiência no Método de Euler se deve ao fato de que a fórmula (5.9a) avança a solução por um
intervalo h usando somente informações somente no início do intervalo, isto é, no ponto x = xn . O método
não utiliza nenhuma outra informação sobre a variação de f (x, y) no intervalo [xn , xn+1 ]. O mesmo pode
ser dito do algoritmo de Taylor em qualquer ordem.
k1 = hf (xn , yn )
k2 = hf (xn + h/2, yn + k1/2)
yn+1 = yn + k2 + O h3 .
Como indicado no termo de erro, o uso do ponto médio torna o método acurado em segunda ordem. A figura
5.1 ilustra a aplicação deste método. Já o algoritmo 5.2 mostra como este método pode ser implementado
em um programa de computador.
1 1
k2 = hf xn + h, yn + k1 .
2 2
yn+1 = yn + k2 .
O erro local do Método de Runge-Kutta de ordem 2 é O h3 , ao passo que o erro local do Método
de Euler é O h2 . Isto significa que é possível usar um passo h com o primeiro método para se obter a
mesma acurácia do segundo. O preço que se paga é que para cada passo h o funcional f (x, y) é calculado
2 vezes, no início e no ponto médio do intervalo. Expressões com erros ainda menores podem ser obtidos
utilizando-se informações de derivadas de ordens mais altas no ponto médio. Contudo, em vez de se utilizar
esta complicação adicional, o uso prático recomenda o emprego do Método de Runge-Kutta de ordem 4
(seção 5.4.2).
k1 = hf (xn , yn ) (5.10a)
k2 = hf (xn + h/2, yn + k1/2) (5.10b)
k3 = hf (xn + h/2, yn + k2/2) (5.10c)
k4 = hf (xn + h, yn + k3 ) (5.10d)
1
yn+1 = yn + (k1 + 2k2 + 2k3 + k4 ) + O h5 . (5.10e)
6
O método de ordem 4 requer 4 cálculos de f (x, y) por passo h. Isto significa que este método deve ser
superior que o método de ordem 2 se o valor de h neste caso puder ser, pelo menos, 2 vezes maior que o
valor para o método de ordem 2, para se obter a mesma acurácia. Caso contrário, é melhor usar o algoritmo
5.2 ou algum outro método de solução de um PVI. A figura 5.2 ilustra a aplicação do método e o algoritmo
5.3 mostra a sua implementação.
1 1
k2 = hf xn + h, yn + k1 .
2 2
1 1
k3 = hf xn + h, yn + k2 .
2 2
k4 = hf (xn + h, yn + k3 ) .
g1 y (x0 ) , y 0 (x0 ) , . . . , y (N −1) (x0 ) = a1 (5.11c)
.. ..
. . (5.11d)
gN y (x0 ) , y 0 (x0 ) , . . . , y (N −1) (x0 ) = aN . (5.11e)
0
yN (x) = f (x, y1 (x), y2 (x), · · · , yN (x)) , (5.12e)
Ou seja, ao invés procurarmos uma forma do método de Runge-Kutta para resolver 1 ODE de ordem N , o
que iremos fazer é resolver N equações de ordem 1.
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
90 5.5. Sistemas de equações diferenciais
Exemplo 5.1. Movimento harmônico amortecido. Suponhamos um corpo de massa m pendurado
do teto por uma mola que exerce uma força restauradora fR = −ky, oscilando sob a ação da gravidade,
mas imerso em um fluido viscoso tal que a força de resistência à passagem do corpo seja proporcional ao
quadrado da velocidade do mesmo, fv = Cv 2 . Este problema pode ser escrito na forma de um PVI como:
k C
ÿ = −g − y − ẏ 2
m m
y(0) = y0
ẏ(0) = v0 .
Definindo y1 (t) = y(t) e ẏ1 (t) = y2 (t), o PVI pode ser escrito a partir de (5.12) como:
ẏ1 = y2
k C
ẏ2 = −g − y1 − y22
m m
y1 (0) = y0
y2 (0) = v0 ,
onde neste sistema já estão incluídas as equações auxiliares (5.12a–d). É muitas vezes conveniente pensar
este sistema na forma vetorial,
y 0 = f (x, y) , (5.13d)
onde y e f são vetores com N componentes cada.
A subrotina 5.1 implementa o Método de Runge-Kutta de quarta ordem dado pelo algoritmo 5.3 em
Fortran 95. Nota-se que a subrotina resolve um sistema de EDO’s de primeira ordem do tipo (5.13a–c) ou
(5.13d).
Programa 5.1: Resolve um Problema de Valor Inicial usando o Método de Runge-Kutta de quarta ordem.
! ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ SUBROTINA RK4 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
! R e s o l v e um Problema de Valor I n i c i a l p e l o Metodo de Runge−Kutta
! de q u a r t a ordem com p a s s o f i x o .
! Dados o v e t o r y ( : ) que contem as v a r i a v e i s e o v e t o r das d e r i v a d a s
! dydx ( : ) no ponto x , a r o t i n a i n v o c a a s u b r o t i n a d e r i v s ( y , x , dydx )
! que s e r a usada para avancar o v e t o r das s o l u c o e s y s a i ( : ) a t e o
! ponto x + h .
!
! Argumentos de e n t r a d a :
! y: Vetor de forma assumida contendo as s o l u c o e s do PVI no ponto x .
! dydx : Vetor de forma assumida contendo as d e r i v a d a s de y no ponto x .
! x: Ponto i n i c i a l do i n t e r v a l o .
! h: Tamanho do p a s s o .
! d e r i v s : S u b r o t i n a que c a l c u l a as d e r i v a d a s dydx no ponto x .
! Argumento de s a i d a :
! y s a i : Vetor de forma assumida contendo as s o l u c o e s do PVI no ponto x + h .
!
! Autor : Rudi G a e l z e r , IFM − UFPel .
! Data : J u l h o / 2 0 0 9 .
! Obs : Baseada na s u b r o t i n a RK4 do Numerical R e c i p e s .
!
Autor: Rudi Gaelzer – IFM/UFPel Versão: 22 de julho de 2009
Capítulo 5. Problemas de Valor Inicial [Em Construção] 91
subroutine rk4 ( y , dydx , x , h , y s a i , d e r i v s )
r e a l ( kind= dp ) , dimension ( : ) , intent ( in ) : : y , dydx
r e a l ( kind= dp ) , intent ( in ) : : x , h
r e a l ( kind= dp ) , dimension ( : ) , intent ( out ) : : y s a i
INTERFACE
subroutine d e r i v s ( x , y , dydx )
use Modelos_Computacionais_Dados
r e a l ( kind= dp ) , intent ( in ) : : x
r e a l ( kind= dp ) , dimension ( : ) , intent ( in ) : : y
r e a l ( kind= dp ) , dimension ( : ) , intent ( out ) : : dydx
end subroutine d e r i v s
END INTERFACE
r e a l ( kind= dp ) : : h6 , hh , xh
r e a l ( kind= dp ) , dimension ( s i z e ( y ) ) : : dym , dyt , yt
!
c a l l v e r i f i c a _ t a m a n h o ( s i z e ( y ) , s i z e ( dydx ) , s i z e ( y s a i ) , ’ rk4 ’ )
hh= h ∗ 0 . 5 _dp
h6= h / 6 . 0 _dp
xh= x + hh
yt= y + hh∗dydx
c a l l d e r i v s ( xh , yt , dyt )
yt= y + hh∗ dyt
c a l l d e r i v s ( xh , yt , dym)
yt= y + h∗dym
dym= dyt + dym
c a l l d e r i v s ( x+h , yt , dyt )
y s a i= y + h6 ∗ ( dydx + dyt + 2 . 0 _dp∗dym)
return
end subroutine rk4
Erros
Fontes, 1
Números, 1
Representação inteiros, 2
Representação reais, 3
92