Anda di halaman 1dari 9

Departamento de Cincia da Computacao IME-USP e

MAC 2166 Introducao a Computacao `


POLI - P RIMEIRO S EMESTRE DE 2007 Material Didtico a
Prof. Ronaldo Fumio Hashimoto

F O RMULA

DE

R ECORR NCIA E I NFINITAS )

S RIES (S OMAS E

Objetivo
O objetivo desta aula introduzir frmulas de recorrncia e o uso das mesmas para o clculo de sries (somas e o e a e innitas).

Introducao
At o momento nos limitamos ao uso do tipo inteiro para variveis e expresses. Mesmo variveis do tipo e a o a caractere guardam n meros inteiros. Vamos introduzir agora o tipo real. u Para entender como so representados variveis do tipo real, vamos falar um pouco da representacao de a a n meros inteiros. u

F rmula de Recorrncia o e
Uma frmula de recorrncia uma relacao entre os termos sucessivos de uma seqncia numrica. Dessa forma, o e e ue e usando uma frmula de recorrncia, poss obter o prximo termo da seq ncia usando o valor de termos o e e vel o ue anteriores. Um exemplo clssico a seqncia de Fibonacci denida pela frmula de recorrncia a e ue o e F1 = 1 F2 = 1 Fi = Fi1 + Fi2

para i 3.

Note que para determinar o termo Fi necessrio ter os dois termos anteriores Fi1 e Fi2 . e a

Exerccio de F rmula de Recorrncia: Raiz Quadrada o e


Dados x 0 e eps, 0 < eps < 1, n meros reais, calcular uma aproximacao para raiz quadrada de x atravs da u e seq ncia de n meros gerada pela seguinte frmula de recorrncia: ue u o e

r0 = x rk+1 = (rk + x/rk )/2

para k > 0.

Gere a seq ncia at um k tal que |rk rk1 | < eps. A raiz quadrada de x o ultimo valor da seqncia, isto , ue e e ue e rk . Note que de uma certa maneira o real eps controla a preciso da raiz quadrada de x. a Solucao: Gerar os n meros da seq ncia r0 , r1 , r2 , . . . , rk usando uma repeticao. u ue
1 2 3 4 5 6 7 8 9 10

f l o a t r , x , erro , eps ; r = x ; erro = eps ; while ( erro >= eps ) { r = ( r + x / r ) / 2; printf ( " r = % f \ n " , r ) ; / a t u a l i z a e r r o / ... }

A repeticao acima de fato imprime cada elemento rk da seq ncia. No entanto, para calcular o erro=|rk rk1 | ue necessrio guardar o termo anterior. Assim, vamos declarar mais uma varivel rant e fazer a geracao da e a a seq ncia da seguinte forma: ue
1 2 3 4 5 6 7 8 9 10 11 12 13

f l o a t r , rant , x , erro , eps ; rant = x ; erro = eps ; while ( erro >= eps ) { r = ( rant + x / rant ) / 2 ; printf ( " r = % f \ n " , r ) ; / a t u a l i z a e r r o / erro = r rant ; / a t u a l i z a r a n t / rant = r ; }

Agora, note que o clculo do erro no trecho de programa acima est errado, uma vez que erro=|rk rk1 | a a (valor absoluto). Para consertar isso, temos que vericar se erro cou negativo. Em caso armativo, devemos trocar o sinal de erro:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

f l o a t r , rant , x , erro , eps ; rant = x ; erro = eps ; while ( erro >= eps ) { r = ( rant + x / rant ) / 2 ; printf ( " r = % f \ n " , r ) ; / a t u a l i z a e r r o / erro = r rant ; i f ( erro < 0) erro = erro ; / a t u a l i z a r a n t / rant = r ; }

Note ainda que devemos garantir que o programa funcione para x=0. Como a raiz quadrada de zero zero, e podemos fazer com que quando x=0, o programa no entre no laco colocando uma condicao (erro>= eps && a x>0). Assim, a solucao nal do exerc : cio e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

# include <stdio . h> i n t main ( ) { f l o a t r , rant , x , erro , eps ; printf ( " Entre com x >= 0: " ) ; scanf ( " % f " , &x ) ; printf ( " Entre com 0 < eps < 1: " ) ; scanf ( " % f " , &eps ) ; rant = x ; erro = eps ; while ( erro >= eps && x>0) { r = ( rant + x / rant ) / 2 ; / a t u a l i z a e r r o / erro = r rant ; i f ( erro < 0) erro = erro ; / a t u a l i z a r a n t / rant = r ; } printf ( " Raiz de % f = % f \ n " , x , r ) ; return 0 ; }

Erro Absoluto e Erro Relativo


Dado um n mero x e uma aproximacao y para x, o erro (tambm chamado de erro absoluto) da aproximacao y u e em relacao x denido como |y x|. Quando a grandeza de x no prxima da de 1, o erro absoluto pode no e a e o a ser a maneira mais adequada de medir a qualidade da aproximacao y. Por exemplo, os erros absolutos de 1.01 em relacao a 1.00 e de 0.02 em relacao a 0.01 so idnticos, mas claro que a primeira aproximacao muito a e e e melhor que a segunda. 3

` Face a limitada avaliacao de uma aproximacao conferida pelo erro absoluto, tenta-se denir o erro relativo a y em relacao a x como sendo |(y x)/x| Assim, nos dois exemplos anteriores, os erros relativos so respectivamente de 0.01 (ou 1%) e 1.00 (ou 100%). a Contudo esta denicao incompleta quando x = 0. Neste caso, a diviso por 0 no pode ser realizada e adotam e a a se valores arbitrrios para o erro relativo. No caso de tambm ocorrer que y = 0, a aproximacao certamente a e perfeita e adota-se que o erro 0. No caso de y = 0, a aproximacao certamente insatisfatria e adota-se o e e e o valor arbitrrio 1 para o erro relativo. Assim, denimos a |(y x)/x| 0 errorel(y, x) = 1 se x = 0 se x = 0 = y se x = 0 = y

Exerccio da Raiz Quadrada com Erro Relativo


Resolver o exerc da raiz quadrada usando erro relativo em vez de erro absoluto, ou seja, gerar a seq ncia cio ue at um k tal que errorel(rk , rk1 ) < eps. e Solucao: A unica diferenca deste exerc cio com relacao ao anterior o clculo do erro. Esse clculo pode ser feito da e a a seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13

f l o a t r , rant , x , erro ; i f ( rant != 0) { erro = ( r rant ) / rant ; i f ( erro < 0) erro = erro ; } e l s e { / r a n t == 0 / i f ( r == 0) erro = 0 ; else erro = 1 ; }

Assim, a solucao nal do exerc : cio e

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

# include <stdio . h> i n t main ( ) { f l o a t r , rant , x , erro ; printf ( " Entre com x >= 0: " ) ; scanf ( " % f " , &x ) ; printf ( " Entre com 0 < eps < 1: " ) ; scanf ( " % f " , &eps ) ; erro = r = x ; while ( erro >= eps ) { r = ( rant + x / rant ) / 2 ; / a t u a l i z a e r r o / i f ( rant != 0) { erro = ( r rant ) / rant ; i f ( erro < 0) erro = erro ; } e l s e { / r a n t == 0 / i f ( r == 0) erro = 0 ; else erro = 1 ; } / a t u a l i z a r a n t / rant = r ; } printf ( " Raiz de % f = % f \ n " , x , r ) ; return 0 ; }

Exerccio de Clculo de Sries a e


Dados x e eps, 0 < eps < 1, reais, obter uma aproximacao da srie e ex = 1 + x + x2 x3 xk + + + + 2! 3! k!

com preciso eps, isto , somar os termos da srie at aparecer um termo cujo valor absoluto seja menor que a e e e eps. Primeiramente, vamos mostrar uma forma que voc no deve usar para resolver este exerc e a cio. xk tende a zero quando k tende a +. k!

Usando um comando de repeticao, gerar uma seq ncia de n meros k = 1, 2, 3, 4, . . . , ue u Calcular p = xk . Calcular f at = k!. Calcular t = p/f at. 5

Acumular t em uma varivel soma. a Repetir estes clculos at um k tal que a e xk < eps. k!

Esta solucao poderia ser escrita como:


1 2 3 4 5 6 7 8 9 10 11

f l o a t soma , t , eps , x , pot , fat ; int k ; soma = 1 ; t = 1 ; k = 1 ; while ( | t | >= eps ) { / c a l c u l e p o t = x k ; / / c a l c u l e f a t = k ! ; / t = pot / fat ; soma = soma + t ; k++; }

Para o clculo de pot e f at, poss aproveitar os valores de pot e f at anteriores da seguinte forma: a e vel
1 2 3 4 5 6 7 8 9 10 11 12 13 14

f l o a t soma , t , eps , x , pot , fat ; int k ; soma = t = k = 1 ; pot = fat = 1 ; while ( | t | >= eps ) { / c a l c u l e p o t = x k ; / pot = pot x ; / c a l c u l e f a t = k ! ; / fat = fat k ; t = pot / fat ; soma = soma + t ; k++; }

Esta solucao ruim, pois como no sabemos at que valor k vai assumir, a varivel f at que recebe o fatorial de e a e a k, pode estourar facilmente, mesmo f at sendo uma varivel do tipo float. a Assim a solucao acima no considerada uma boa solucao. Uma boa solucao no deve envolver o clculo do a e a a fatorial. A idia calcular um termo da srie usando o termo anterior. Observe que e e e xk1 (k 1)!

tk1 = O prximo termo tk o e

tk =

xk1 x xk1 x x xk = = = tk1 k! (k 1)! k (k 1)! k k x . k

Assim, para calcular o prximo termo da srie, basta multiplicar o termo anterio pelo fator o e Assim, uma melhor solucao seria: 6

1 2 3 4 5 6 7 8 9

f l o a t soma , t , eps , x ; int k ; soma = t = k = 1 ; while ( | t | >= eps ) { t = t x / k; soma = soma + t ; k++; }

Note que esta solucao no envolve diretamente o clculo de fatorial. A solucao completa seria: a a Solucao:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

# include <stdio . h> i n t main ( ) { f l o a t soma , t , eps , x , abs_t ; int k ; printf ( " Entre com x : " ) ; scanf ( " % f " , &x ) ; printf ( " Entre com 0 < eps < 1: " ) ; scanf ( " % f " , &eps ) ; soma = abs_t = t = k = 1 ; while ( abs_t >= eps ) { t = t x / k; soma = soma + t ; k++; abs_t = t ; i f ( abs_t < 0) abs_t = abs_t ; } printf ( " exp (% f ) = % f \ n " , x , soma ) ; return 0 ; }

Note o if no nal da repeticao para calcular o mdulo do termo t. o

Outro Exerccio de Clculo de Sries a e


Dados x e reais, > 0, calcular uma aproximacao para sen x atravs da seguinte srie innita e e sen x = incluindo todos os termos at que e Solucao: Neste exerc cio, temos que calcular o termo seguinte em funcao do termo anterior. Assim, o termo anterior e 7 x x3 x5 x2k+1 + . . . + (1)k + ... 1! 3! 5! (2k + 1)! < .

|x2k+1 | (2k+1)!

tk1 = (1)k1

x2(k1)+1 x2k1 = (1)k1 (2(k 1) + 1)! (2k 1)!

tk = (1)k

x2k+1 x(2k1)+2 = (1)k1 (1) = (2k + 1)! (2k 1)! (2k) (2(k + 1)) 2k1 2 x x = (1)k1 = (2k 1)! (2k) (2(k + 1)) 2 x = tk1 (2k) (2(k + 1))

Assim, neste exerc cio, podemos calcular o termo seguinte em funcao do termo anterior apenas multiplicando-o x2 pelo fator . Um esboco de uma solucao seria: (2k) (2(k + 1)) Usando um comando de repeticao, gerar uma seq ncia de n meros k = 1, 2, 3, 4, . . . , ue u Calcular tk = tk1 (x2 )/ ((2k) (2(k + 1))). Acumular t em uma varivel soma. a Repetir estes clculos at um k tal que |tk | < . a e Note um par de parnteses a mais no divisor do fator multiplicativo. Este par de parnteses necessrio para e e e a fazer a diviso corretamente. Uma solucao completa seria: a Solucao:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

# include <stdio . h> i n t main ( ) { f l o a t soma , t , eps , x , abs_t ; int k ; printf ( " Entre com x : " ) ; scanf ( " % f " , &x ) ; printf ( " Entre com 0 < eps < 1: " ) ; scanf ( " % f " , &eps ) ; soma = abs_t = t = x ; i f ( abs_t < 0) abs_t = abs_t ; k = 1; while ( abs_t >= eps ) { t = t x x / ((2 k )(2 k +1)); soma = soma + t ; k++; abs_t = t ; i f ( abs_t < 0) abs_t = abs_t ; } printf ( " sen (% f ) = % f \ n " , x , soma ) ; return 0 ; }

Exerccio
Dados x real e N natural, calcular uma aproximacao para cos x atravs dos N primeiros termos da seguinte e srie: e cos x = 1 x2 x4 x6 x2k + + . . . + (1)k + ... 2! 4! 6! (2k)!

D vidas u
D vidas deste material pode ser enviadas para o Frum para assuntos espec u o cos da turma WEB.

Anda mungkin juga menyukai