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.

import cTurtle

def grafico(funcao,inicio,num,cor):
"""
Faz o gráfico da função a partir do ponto inic.
"""
x=inicio
cTurtle.pencolor(cor)
cTurtle.up()
cTurtle.goto(0,x)
cTurtle.down()
cTurtle.dot(3)

for i in range(1,num):
x = funcao(x)
cTurtle.goto(i,x)
cTurtle.dot(3)

# Funções de teste
def f(x):
return 3.9*x*(1 - x)

def g(x):
return 3.9 * (x - x**2)

def h(x):
return 3.9*x - 3.9*x*x

def main(n):
cTurtle.setWorldCoordinates(-1.0,-0.1,n+1,1.1)
grafico(f,0.35,n,'red')
grafico(g,0.35,n,'green')
grafico(h,0.35,n,'blue')
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