|
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
- Construir uma fun��o que determina
para um dado , de acordo com o lema anterior
(ou seja, dado encontrar um natural tal que ).
- 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).
- 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)
- O seu programa deve fazer duas coisas:
- 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;
}
- 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.
|