MAC110 - TURMA 42 - www.ime.usp.br/~leo/mac110 cab-mac110-2004.gif
MAC 110 - 2004 Prof. Le�nidas


Construir a fun��o a partir de opera��es b�sicas (soma)

Problema

O computador s� "sabe" fazer opera��es baseadas em somas, deste para computar a fun��o (ou outras como , ,...) � necess�rio aplicar alguma t�cnica matem�tica que permita reescrever a fun��o na forma de um "polin�mio equivalente".

Solu��o matem�tica

Uma solu��o seria aproximar a fun��o por uma "parte" de uma s�rie de Taylor. Entretanto isso gera um novo problema matem�tica:

as s�ries de Taylor funcionam bem, para vizinhan�as de um ponto onde a fun��o � conhecida, ou algo como:

Deste modo, fica claro a necessidade de algum "truque" matem�tica para conseguirmos calcular diferentes "log's". Uma vez que, a menos de uma divis�o por constante, as fun��es logar�tmicas s�o equivalentes, vamos escolher a segunda forma para trabalhar. A raz�o da equival�ncia � a conhecida identidade

.

Note que � uma constante, qualquer que seja o par�metro .

Como computar , para ?


Lema. Qualquer que seja ,

,

sendo e . Al�m disso, .

Deste modo podemos computar utilizando a identidade .

Teorema. Qualquer que seja ,

,

sendo .

Portanto , e deste modo podemos utilizar a aproxima��o 2 para logaritmo neperiano. Ou seja, com este �ltimo teorema � poss�vel obter uma boa aproxima��o para , qualquer que seja .

Implementa��o

  1. Construir uma fun��o que determina para um dado , de acordo com o lema anterior (ou seja, dado encontrar um natural tal que ).
  2. Construir uma fun��o que computa , para qualquer natural .
    A utilidade desta fun��o � testar a fun��o anterior (ela n�o necessariamente precisa ser usada no c�lculo final).
  3. Construir uma fun��o que computa uma aproxima��o de Taylor, com N termos, para , .
    (esta fun��o dever� ter 2 par�metros, o N e o x)
  4. O seu programa deve fazer duas coisas:
    1. Listar uma tabela na forma abaixo para verificar se sua fun��o "log" coincide com a fun��o "log" da biblioteca C.
                  +--------+--------+---------+
                  |    x   |log_2(x)| log(x)  |
                  +--------+--------+---------+
                  |      2 |  1.000 |   1.000 |
                  |     15 |  3.841 |   3.907 |
                  |     43 |  5.420 |   5.426 |
                  |     99 |  6.608 |   6.629 |
                  |    211 |  7.688 |   7.721 |
                  |    857 |  9.707 |   9.743 |
                  |   3441 | 11.712 |  11.749 |
                  |  13777 | 13.713 |  13.750 |
                  | 110229 | 16.713 |  16.750 |
                  | 881845 | 19.713 |  19.750 |
                  +--------+--------+---------+
                 

      Para gerar esta tabela use o seguinte la�o:
      	    #include <math.h>      // esta linha vai no topo
             	                           // do arquivo
                  // para compilar este arq., com a biblioteca matem�tica
      	    // "math.h", no Linux, digite: gcc -lm -o nome.o nome.c
      	    
      	    #define LN2 log(2) // � interessante p/ s� calcular uma vez
      	    ...
                  int i;                 // estas duas linhas v�o
                  float x = 2, pot = 1;  // no in�cio da fun��o "main"
      	    ...
                  printf("+--------+--------+---------+\n");
                  printf("|    x   |log_2(x)| log(x)  |\n");
                  printf("+--------+--------+---------+\n");
                  for (i=0; i<10; i++) {
                      printf("| %6.0f | %6.3f |  %6.3f |\n", x, f_logBase2(x,N), log(x)/LN2);
                      x   = pot * x + 13;
                      if (i%3==0) pot = pot*2;
                      }
                 
    2. Fazer um programa utilizando as fun��es acima para computar o logaritmo na base 2 para v�rios valores digitados pelo usu�rio ().
      O programa p�ra quando o usu�rio digitar algum valor menor que 1.


MAC 110 Prof. Le�nidas

Compilado em: 27 de Outubro de 2004