Anda di halaman 1dari 10

Departamento de Cincia da Computao IME-USP e ca

MAC115 Introduo ` Computao para Cincias Exatas e Tecnologia ca a ca e Instituto de F sica Outubro de 2012 Terceiro Exerc cio-Programa (EP3) Data de entrega: 31/10/2012

Clculo do valor de a
f (x) = 1 x2 , x [1, 1] (1)

Considere a funo ca que a semi-circunferncia positiva de raio 1. e e Sabemos que a rea de uma circunferncia de raio 1 . Logo, a rea A de f (x) no intervalo [0, 1] (veja a e e a a rea hachurada no primeiro quadrante do grco na Figura 1(a)) /4. Se soubermos calcular A, ento a a e a podemos obter o valor de .
y y y=M y = f (x)

y= A 1

1 x2 x a A b

(a) f (x) =

1 x2

(b) Uma funao qualquer c

Figura 1: Area sob o grco de uma funo. a ca

Area sob o grco de uma funo a ca

Seja f uma funo positiva no intervalo [a, b] tal que f (x) M para todo x [a, b]. A regio hachurada ca a na Figura 1(b) corresponde ` rea A de f (x), no intervalo [a, b]. A seguir apresentamos trs mtodos que aa e e podem ser utilizados para calcular A.

2.1

Mtodo dos retngulos e a

O clculo da rea A pelo mtodo dos retngulos denido da seguinte forma a a e a e A f (a + x ) x + f (a + 2 x ) x + + f (a + k x ) x = x [f (a + x ) + f (a + 2 x ) + + f (a + k x )] na qual k o nmero de retngulos e x = (b a)/k a largura dos retngulos. e u a e a 1 (2)

A Figura 2(a) mostra um exemplo com k = 5. Observe que a preciso do resultado depende de k, ou seja, a quanto maior k, mais prximo o valor calculado ser do valor da rea. o a a
y y

y = f (x)

y = f (x)

a x

(a) Mtodo dos retngulos e a

(b) Mtodo dos trapezides e o

Figura 2: Dois mtodos para clculo de rea. e a a

2.2

Mtodo dos trapezides e o

O clculo da rea A pelo mtodo dos trapezides denido da seguinte forma a a e o e

A ((f (a) + f (a + x )) x )/2 + ((f (a + x ) + f (a + 2 x )) x )/2 + + ((f (a + (k 1) x ) + f (a + k x )) x )/2 (3)

na qual k o nmero de trapzios e x = (b a)/k a largura dos trapzios. A Figura 2(b) mostra um e u e e e exemplo com k = 5.

2.3

Mtodo Monte Carlo e

O clculo de A pelo mtodo Monte Carlo pode ser realizado da seguinte forma. Gera-se aleatoriamente a e uma sequncia de pontos (x1 , y1 ), (x2 , y2 ), , (xn , yn ) onde a xi b e 0 yi M (lembre-se que e f (x) M para todo x [a, b]). Em seguida, calcula-se a proporo P de pontos que esto entre a curva e ca a o eixo das abscissas, i.e., a proporo de pontos tais que 0 yi f (xi ). Pelo mtodo Monte Carlo temos ca e ento que: a A P rea do retngulo [a, b] [0, M ] = P (b a) M a a (4)

E intuitivo que, quanto maior o nmero de pontos gerados, mais o valor obtido pelo mtodo se aproxima u e do valor da rea A. a

Gerao de n meros aleatrios ca u o

Como visto na Seo 2.3, o mtodo Monte de Carlo requer a gerao de nmeros aleatrios (no caso, uma ca e ca u o sequncia de pontos aleatrios). e o H um certo nmero de mtodos para gerarmos nmeros aleatrios, dentre os quais se destaca o mtodo a u e u o e da congruncia multiplicativo. O mtodo da congruncia multiplicativo, proposto por D. W. Lehmer e e e

em 1951, obtm o nmero inteiro aleatrio xi a partir do nmero inteiro xi1 , mediante uma relao de e u o u ca recorrncia do tipo e xi = (k xi1 ) % m onde k e m (k m) so inteiros convenientemente escolhidos. a O primeiro nmero da sequncia, x1 , ser obtido a partir de um inteiro positivo qualquer, menor que m, u e a escolhido como x0 (tambm chamado de semente), e usando a frmula de recorrncia acima. e o e Extensos testes estat sticos mostraram que a sequncia gerada s ser satisfatria se forem escolhidos e o a o valores convenientes para k, m e x0 , e que apenas umas poucas combinaes de k, m e x0 geram sequncias co e satisfatrias. Uma dessas combinaes obtida tomando-se k = 75, m = 65537 e com x0 podendo ser o co e qualquer inteiro entre 0 e 65536. A sequncia dos nmeros assim gerados se repete em ciclos de comprimento e u 65537, o que no apresenta inconveniente para este exerc programa, pois usaremos uma quantidade de a cio nmeros aleatrios que ser menor do que essa. Cada inteiro gerado entre 0 e 65536 aparece exatamente u o a uma vez em cada ciclo. Se desejamos nmeros aleatrios entre zero e um, podemos dividir cada nmero obtido por m 1, assim u o u gerando nmeros reais xi /(m 1). Tambm podemos obter nmeros entre zero e uma constante T > 0 u e u (real) simplesmente fazendo a operao (xi /(m 1)) T . ca Tais nmeros gerados em computador, sendo prediz u veis e reprodut veis, no so exatamente aleatrios, a a o sendo por isso denominados frequentemente de pseudo-aleatrios. o

Erro relativo

Dado um nmero x e uma aproximao y para x, o erro (tambm chamado de erro absoluto) da aproximao u ca e ca y em relao a x denido como sendo |y x|. Quando a grandeza de x no prxima da de 1, o erro ca e a e o absoluto pode no ser a maneira mais adequada de medir a qualidade da aproximao y. Por exemplo, os a ca erros absolutos de 1.01 em relao a 1 e de 0.02 em relao a 0.01 so idnticos, mas claro que a primeira ca ca a e e aproximao muito melhor que a segunda. ca e Face ` limitada avaliao de uma aproximao conferida pelo erro absoluto, tenta-se denir o erro relativo a ca ca de y em relao a x como sendo ca yx | | x Assim, nos dois exemplos anteriores, os erros relativos so respectivamente de 0.01 (ou 1%) e 1 (ou 100%). a Contudo, esta denio ainda incompleta quando x = 0. Nestes casos, a diviso por 0 no pode ser ca e a a realizada e adotam-se valores arbitrrios para o erro relativo. No caso de tambm ocorrer que y = 0, a a e aproximao certamente perfeita e adota-se que o erro 0. No caso de y = 0, a aproximao certamente ca e e ca e insatisfatria e adota-se o valor arbitrrio 1 para o erro relativo. (Na prtica, os erros relativos procurados o a a so sempre menores que 1.) a Assim, denimos errorel(y, x) =
| yx |, se x = 0 x

0,

1,

se x = 0 = y se x = 0 = y.

O exerc cio programa

Voc dever escrever um programa em C que e a realiza vrios experimentos para calcular um valor aproximado a 2 no intervalo [0, 1] conforme descrito na Seo 1. Em de em termos da rea da funo f (x) = 1 x a ca ca

cada um dos experimentos, a rea em questo ser calculada utilizando-se um dos trs mtodos de clculo a a a e e a aproximado descritos na Seo 2. A sa do seu programa dever ser conforme especicada mais adiante. ca da a Os experimentos a serem realizados sero descritos em um arquivo denominado entrada.txt, ou seja, em a vez de ler os dados de entrada do teclado, desta vez o seu EP ler os dados de entrada de um arquivo. a

5.1

Formato do arquivo de entrada

No arquivo de entrada, os experimentos sero identicados por um caractere de acordo com o mtodo que a e dever ser utilizado: a Se o identicador for m, um experimento consiste em repetir, pelo nmero especicado de vezes, o u clculo da rea pelo mtodo Monte Carlo, obtendo-se assim vrias aproximaes de , das quais a a e a co interessa-nos a mdia. So fornecidos os seguintes dados. e a semente (como nos EPs anteriores) para a gerao dos nmeros pseudo-aleatrios que sero ca u o a utilizados no sorteio dos pontos no mtodo Monte Carlo. Esta semente dever ser utilizada e a apenas uma unica vez no experimento. nmero de repeties do processo de clculo da rea. u co a a nmero de pontos a serem sorteados (deve-se usar o mesmo nmero de pontos em cada uma das u u repeties). co Se o identicador for r, um experimento consiste em calcular a rea usando o mtodo dos retngulos. a e a A largura dos retngulos deve ser calculada em funo do nmero de retngulos especicado. O a ca u a seguinte dado fornecido: e nmero de retngulos a serem utilizados no mtodo dos retngulos. u a e a Se o identicador for t, um experimento consiste em calcular a rea usando o mtodo dos trapezides. a e o A largura dos trapezides deve ser calculada em funo do nmero de trapzios especicado. O o ca u e seguinte dado fornecido: e nmero de trapzios a serem utilizados no mtodo dos trapezides. u e e o

Exemplo de um arquivo de entrada m m r t 1984 10 1000 2003 2 10000 100 10

5.2

Sa do programa da

Para cada experimento especicado no arquivo de entrada, o seu programa dever imprimir pelo menos os a seguintes dados. Se o mtodo for Monte Carlo, dever imprimir e a a semente utilizada para o sorteio dos pontos o nmero de pontos sorteados u o nmero de repeties u co 4

Cada um dos valores aproximados de e os respectivos erros relativos em relao a = 3.14159 ca Uma linha com a sequncia de caracteres <resposta> e a sequncia de caracteres <mtc> e a mdia dos valores aproximados e o erro relativo da mdia em relao a = 3.14159 e e ca Se o mtodo for o dos retngulos ou o dos trapezides, dever imprimir e a o a nmero de retngulos/trapzios considerado u a e valor de x uma linha com a sequncia de caracteres <resposta> e a sequncia de caracteres <ret> para o caso de retngulos ou <tpz> para o caso dos trapezides e a o o valor aproximado obtido para e o respectivo erro relativo em relao a = 3.14159 ca

5.3

Funes a serem implementadas co

O seu EP dever implementar e utilizar, obrigatoriamente, todas as seguintes funes. a co Uma funo com o prottipo ca o float errorel(float y, float x); que recebe dois reais y e x em y e x, respectivamente, e devolve o erro relativo de y em relao a x, ca conforme descrito na Seo 4. ca Uma funo com prottipo ca o float raiz(float x) ; que recebe um real x 0 em x e devolve uma aproximao da raiz quadrada de x. ca Para calcular x quando x > 0, voc deve utilizar a seguinte recorrncia: e e
b0 = x bi =

1 x bi1 + 2 bi1

i = 1, 2,

Por exemplo, os termos b1 e b2 so calculados da seguinte forma: a b1 = 1 x b0 + 2 b0 1 x b1 + 2 b1 = 1 x x+ 2 x 1 2 = x+1 2

b2 =

x+1 2x + . 2 x+1

A partir de b2 , obtemos b3 e assim por diante. Este processo deve ser repetido at o primeiro n tal que errorel(bn , bn+1 ) < EPS, onde EPS um e e nmero positivo dado que representa a preciso do clculo da raiz. A aproximao obtida para x u a a ca ser bn+1 . Use como EPS o valor 1E-6 (106 ). a Cuidado!!! No aplique a recorrncia para x = 0, ou ocorrer uma diviso por zero!!! a e a a 5

Uma funo com o prottipo ca o float retangulo(float a, float b, int k); que recebe dois reais em a e b (os extremos de um intervalo) e um inteiro em k (o nmero de retngulos u a a serem utilizados no mtodo dos retngulos). A funo deve devolver a rea aproximada da funo e a ca a ca 2 no intervalo com extremos a e b, calculada de acordo com o mtodo dos retngulos. f (x) = 1 x e a Uma funo com o prottipo ca o float trapezoide(float a, float b, int k); que recebe dois reais em a e b (os extremos de um intervalo) e um inteiro em k (o nmero de u trapezides a serem utilizados no mtodo dos trapezides). A funo deve devolver a rea aproximada o e o ca a da funo f (x) = 1 x2 no intervalo com extremos a e b, calculada de acordo com o mtodo dos ca e trapezides. o Uma funo com o prottipo ca o void sorteia(float a, float b, float maxf, long *xi, float *x, float *y) ; que recebe dois reais em a e b (os extremos de um intervalo), um real em maxf (uma constante M como a denida na Seo 2.3) e um inteiro longo *xi (uma semente ou um nmero da sequncia ca u e pseudo-aleatria gerada a partir de uma semente). A partir deste ultimo, sorteia as coordenadas x e o y de um ponto no retngulo [a, b] [0, M ], que sero devolvidas em *x e *y, respectivamente. Alm a a e disso, devolve em *xi o valor do ultimo inteiro longo da sequncia aleatria usado no sorteio. Veja e o detalhes sobre o sorteio de pontos na Seo 5.4. ca Uma funo com prottipo ca o float monte_carlo(float a, float b, long *xi, int n) que recebe dois reais em a e b (os extremos de um intervalo), um inteiro longo *xi (para ser usado no sorteio dos pontos), um inteiro em n (o n umero de pontos a serem sorteados). A funo deve ca devolver a rea aproximada da funo f (x) = 1 x2 no intervalo com extremos a e b, calculada a ca de acordo com o mtodo Monte Carlo. Deve devolver em *xi o valor do ultimo inteiro longo da e sequncia pseudo-aleatria usado nos sorteios que, se necessrio, ser utilizado no prximo clculo e o a a o a de rea pelo mtodo Monte Carlo. a e

5.4

Observaoes importantes c

Sobre comparaoes de n meros reais c u


Os nmeros reais representados em computador podem ser imprecisos uma vez que eles so representados u a em uma quantidade nita de bits. Portanto, clculos envolvendo nmeros reais esto sujeitos aos erros de a u a preciso. O valor de uma expresso aritmtica que envolve vrias operaes com nmeros reais pode variar a a e a co u ligeiramente, dependendo da ordem em que as operaes so realizadas no computador. Por exemplo, co a sabemos que a ay y = b b a No entanto, no computador, o valor de b y pode diferir do valor de ay . b Por causa da impreciso, nem sempre dois nmeros que so esperados serem iguais so iguais. No seu a u a a programa, para vericar se dois nmeros reais so iguais, dena e utilize a funo u a ca 6

int sao_iguais(float x, float y) { if(x-y < EPS && y-x < EPS) return 1; else return 0; } que devolve 1 se |x y| < EPS e 0 se |x y| EPS. Use EPS = 106 .

Sobre o sorteio de pontos


Neste EP, voc utilizar o mtodo da congruncia multiplicativo para gerar uma sequncia de nmeros e a e e e u pseudo-aleatrios, necessrios para a implementao do mtodo Monte Carlo. A Seo 3 explica como o a ca e ca podemos obter o prximo nmero aleatrio xi usando xi1 (o ultimo nmero aleatrio gerado no programa o u o u o ou uma semente, caso nenhum nmero aleatrio tenha sido gerado ainda). u o As coordenadas x e y dos pontos sorteados no mtodo Monte Carlo devem ser obtidas a partir dessa e sequncia. Note que, desta vez, os nmeros a serem sorteados so nmeros reais num intervalo [0, 1]. e u a u A seguir, mostramos como pode ser gerado um ponto (x,y) no retngulo [a, b] [0, M ] a partir de um a inteiro longo xi ant. Uma vez que os nmeros da sequncia pseudo-aleatria so nmeros entre 0 e 65536, u e o a u podemos fazer xi = (75 * xi_ant) % 65537; /* sorteia novo valor de xi */ x = a + ((float)xi / 65536) * (b-a); xi_ant = xi; xi = (75 * xi_ant) % 65537; /* sorteia novo valor de xi */ y = ((float)xi / 65536) * M;

Exemplo de entrada e sa da
RESPECTIVA SADA I Metodo Monte Carlo, semente=1984 repeticoes=5 Estimativa 1: pi=3.16000 erro=0.00586 Estimativa 2: pi=3.15600 erro=0.00459 Estimativa 3: pi=3.08000 erro=0.01960 Estimativa 4: pi=3.21600 erro=0.02369 Estimativa 5: pi=3.11600 erro=0.00815 <resposta> <mtc> 3.14560 0.00128 Metodo Monte Carlo, semente=2003 repeticoes=3 Estimativa 1: pi=3.12520 erro=0.00522 Estimativa 2: pi=3.13880 erro=0.00089 Estimativa 3: pi=3.15240 erro=0.00344 <resposta> <mtc> 3.13880 0.00089 Metodo Monte Carlo, semente=2003 repeticoes=3 Estimativa 1: pi=3.13888 erro=0.00086 Estimativa 2: pi=3.13912 erro=0.00079 Estimativa 3: pi=3.14068 erro=0.00029 <resposta> <mtc> 3.13956 0.00065 Metodo dos retangulos, retangulos=10 <resposta> <ret> 2.90452 0.07546 Metodo dos retangulos, retangulos=100 <resposta> <ret> 3.12042 0.00674 Metodo dos retangulos, retangulos=1000 <resposta> <ret> 3.13956 0.00065 pontos=1000

ENTRADA m m m r r r t t t 1984 5 1000 2003 3 10000 2003 3 100000 10 100 1000 10 100 1000

pontos=10000

pontos=100000

deltax=0.10000

deltax=0.01000

deltax=0.00100

Metodo dos trapezios, trapezios=10 deltax=0.10000 <resposta> <tpz> 3.10452 0.01180 Metodo dos trapezios, trapezios=100 deltax=0.01000 <resposta> <tpz> 3.14042 0.00037 Metodo dos trapezios, trapezios=1000 <resposta> <tpz> 3.14155 0.00001 deltax=0.00100

Leitura de arquivos

A seguir apresentamos uma receita que voc pode usar no seu programa para leitura de arquivos em disco. e O nome do arquivo de entrada deve ser, obrigatoriamente, entrada.txt. Voc dever criar, no mesmo diretrio onde se encontra o seu programa, um arquivo chamado entrada.txt, e a o com o formato de contedo como especicado na Seo 5.1. Um arquivo com a entrada de exemplo u ca mostrada na Seo 6 est dispon ca a vel para download na pgina da disciplina no sistema Paca (http: a //paca.ime.usp.br/course/view.php?id=631), junto com o enunciado do EP. O programa a seguir l os experimentos a serem realizados de entrada.txt e simplesmente imprime os e dados lidos na tela do monitor.

#include <stdio.h> #include <stdlib.h> #define ENTRADA "entrada.txt" int main() { FILE *entrada; int nrepet, npontos, k; /* numero de repeticoes em um experimento Monte Carlo */ /* numero de pontos a serem sorteados em cada repeticao de um experimento Monte Carlo */ /* numero de retangulos/trapezios nos metodos dos retangulos/trapezios */

long semente; /* semente a ser utilizada em um experimento Monte Carlo */ char codigo; /* tipo do experimento */

entrada = fopen(ENTRADA,"r"); /* Abre entrada.txt para leitura ("r" de read) */ if (entrada == NULL) { /* O arquivo existe? */ printf("ERRO: arquivo de entrada nao encontrado\n"); return -1; /* Indica que houve erro. */ } while (!feof(entrada)) { /* Enquanto o fim de arquivo (end of file) n~o a foi encontrado... */ fscanf(entrada,"%c", &codigo); /* L^ um caracter do arquivo e armazena em codigo */ e switch (codigo) { case m: fscanf(entrada, "%ld %d %d", &semente, &nrepet, &npontos); printf("semente = %ld repeticoes = %d pontos = %d\n", semente, nrepet, npontos); break; case r: fscanf(entrada, "%d", &k); printf("k = %d\n", k); break; case t: fscanf(entrada, "%d", &k); printf("k = %d\n", k); break; } } fclose(entrada); /* Libera os recursos do sistema que estavam sendo usados para controlar acesso ao arquivo. */ return 0; } O comando switch uma forma alternativa de escrever um certo tipo de encadeamento do comando if-else. A e forma equivalente usando if-else o seguinte: e if(codigo==m) { fscanf(entrada, "%ld %d %d", &semente, &nrepet, &npontos); printf("semente = %ld repeticoes = %d pontos = %d\n", semente, nrepet, npontos); /* Termina~o normal. */ ca

} else if(codigo==r) { fscanf(entrada, "%d", &k); printf("k = %d\n", k); } else if(codigo==t) { fscanf(entrada, "%d", &k); printf("k = %d\n", k); }

Observaes nais co
No altere o prottipo das funes obrigatrias listadas acima. a o co o Se achar conveniente, voc pode denir e usar outras funes alm das obrigatrias listadas acima. e co e o O uso das funes da biblioteca <math.h> no permitido neste exerc co a e cio programa. Mas voc e pode utiliz-las (em uma fase de testes) para comparar os resultados das suas funes matemticas. a co a A verso nal do seu programa (que voc entregar no Paca) NAO dever conter funes dessa a e a a co biblioteca. O seu programa no precisa fazer consistncia dos dados de entrada. a e Faa seu programa com extenso .c. No sero aceitos programas com outros tipos de extenso c a a a a tais como .cpp, .exe. Uma novidade na correo deste exerc ca cio programa o desconto de pontos para programas que e emitem warnings na compilao. Um warning uma aviso do compilador de que alguma coisa ca e pode no estar correta no seu programa. Esses avisos podem ser uma boa indicao de erros de a ca lgica. Por exemplo, o if (a=b) { [. . .] }

resulta em um warning, e provavelmente um erro (atribuio ao invs de comparao). Dessa e ca e ca forma, procure eliminar todas as fontes de warnings de seu programa. Veja como ativar a deteco de warnings no compilador CodeBlocks nas seguintes pginas: ca a Codeblocks no Windows: http://www.ime.usp.br/~jose/codeblocks-10.05/ Codeblocks no Ubuntu: http://www.ime.usp.br/~mac2166/ubuntu/code.html Como j avisado anteriormente, neste exerc a cio programa a indentao do cdigo contar pontos. ca o a Uma tima referncia sobre como indentar seu cdigo a pgina do prof. Paulo Feolo: http: o e o e a //www.ime.usp.br/~pf/algoritmos/aulas/layout.html. Executveis deste exerc a cio programa podem ser encontrados na pgina da disciplina no sistema a Paca (http://paca.ime.usp.br/course/view.php?id=631), junto com o enunciado do EP. Caso voc tenha dvidas sobre qual deve ser o comportamento do seu programa em alguma situao, veja e u ca como se comporta os executveis. a

10