segunda-feira, 16 de novembro de 2009

A informática e a matemática

A informática pretende ter o rigor da matemática. Só que nem sempre é possível. Analisemos um caso particular da função logística e três modos de a definir, todos matematicamente equivalentes:

f(x) = 3.9*x*(1- x)
g(x) = 3.9*(x - x**2)
h(x) = 3.9*x - 3.9 * x * x

Vamos supor que queremos computar a órbita para o valor inicial de x= 0.35. Esse cálculo é feito iterando as funções definidoras, isto é produzindo a sequência:


x, f(x), f(f(x)), f(f(f(x))), ...
.

Vejamos o programa que faz os cálculos e que usa o módulo cTurtle para desenhar o gráfico.
01.import cTurtle
02. 
03.def grafico(funcao,inicio,num,cor):
04.    """
05.    Faz o gráfico da função a partir do ponto inic.
06.    """
07.    x=inicio
08.    cTurtle.pencolor(cor)
09.    cTurtle.up()
10.    cTurtle.goto(0,x)
11.    cTurtle.down()
12.    cTurtle.dot(3)
13.     
14.    for i in range(1,num):
15.        x = funcao(x)
16.        cTurtle.goto(i,x)
17.        cTurtle.dot(3)
18. 
19.# Funções de teste       
20.def f(x):
21.    return 3.9*x*(1 - x)
22. 
23.def g(x):
24.    return 3.9 * (x - x**2)
25. 
26.def h(x):
27.    return 3.9*x - 3.9*x*x
28. 
29.def main(n):
30.    cTurtle.setWorldCoordinates(-1.0,-0.1,n+1,1.1)
31.    grafico(f,0.35,n,'red')
32.    grafico(g,0.35,n,'green')
33.    grafico(h,0.35,n,'blue')
34.    cTurtle.mainloop()

O leitor mais atento notará que esta solução retoma o tema das funções como parâmetros das definições. Ao executar o programa, chamando main() veja o que acontece. O vídeo abaixo reproduz a parte final da execução. Se reparar, embora matematicamente equivalentes, na parte final os gráficos divergem de modo significativo. Porque será???

4 comentários:

  1. ninguem sabe responder lol

    ResponderEliminar
  2. não sei se estarei a divagar mas penso o seguinte:
    eu primeiro simulei para valores de n pequenos e ate ai tudo bem batia tudo igual , mas depois aumetei o valor e foi possivel notar o efeito da propagação do erro resultante na limitação das representações feitas pelo computador (a diferença entre os graficos ). por exemplo se a função operava so com inteiros isto provavelmente não aconteceria .

    ResponderEliminar
  3. Não está a divagar. O problema tem que ver com a imprecisão da máquina, que origina erros que se vão amplificando com os sucessivos cálculos.

    ResponderEliminar
  4. é óbvio que o que mudou foi a ordem de precedência no calculo, onde o parâmetro cercado por parênteses tem tratamento diferenciado.

    ResponderEliminar