domingo, 15 de novembro de 2009

As funções são objectos (II)

Avancemos um pouco mais. Então se as funções são objectos como vimos e se , por isso, podem ser passadas como parâmetros numa definição, será que podem ser devolvidas como resultado? E a resposta é ... sim!

Consideremos o problema de, dada uma função e o seu domínio, traçar o respectivo gráfico. Vejamos uma solução possível que se socorre do módulo cTurtle.

1.def grafico(tartaruga,funcao, valores):
2.    """ Desenha o gráfico da função f."""
3.    tartaruga.up()
4.    tartaruga.goto(valores[0], funcao(valores[0]))
5.    tartaruga.down()
6.     
7.    for indice in range(1,len(valores)):
8.        tartaruga.goto(valores[indice], funcao(valores[indice]))

Como se pode ver, dada a lista dos valores de x, mandamos fazer o plot dos correspondentes f(x):
01.def main3():
02. 
03.    xx = float_range.float_range_lista(-4,4,0.1)
04.    tartaruga = cTurtle.Turtle()
05.    tartaruga.pensize(3)  
06.    tartaruga.setWorldCoordinates(-4,-2,4,2)
07.    linha(tartaruga,-4,0,4,0)
08.    tartaruga.write('X', move=False, align='left', font=('Arial', 14, 'normal'))
09.    linha(tartaruga,0,-2,0,2)
10.     
11.    tartaruga.pencolor('red')
12.    tartaruga.up()
13.    tartaruga.goto(0.5,1)
14.    tartaruga.write('SIN(X)', move=False, align='left', font=('Arial', 14, 'normal'))
15.    grafico(tartaruga,math.sin,xx)
16. 
17.    tartaruga. exitOnClick()

E o resultado está à vista:




Admitamos agora que queremos desenhar o gráfico de uma função que depende desta função. Por exemplo a derivada. Todos conhecemos a definição de derivada de uma função contínua:




Esta definição é válida para toda a função. Assim não nos pode espantar que se possa fazer:
1.def derivada(f):
2.    """Derivada de uma função."""
3.    dx= 1.e-6
4.    def d(x):
5.        return (f(x + dx) - f(x))/dx
6.    return d

Olhemos para o código. Temos uma nova definição derivada cujo argumento é uma função. Desta parte já falámos anteriormente. O seu corpo é feito apenas da construção de uma nova função que materializa a definição dada. Com esta definição, no interior de outra definição, estamos a criar um objecto do tipo função! É esse objecto que é devolvido. Repare-se que usamos uma constante muito pequena para dx. Juntando tudo e aplicando:
01.def main1():
02. 
03.    xx = float_range.float_range_lista(-4,4,0.1)
04.    tartaruga = cTurtle.Turtle()
05.    tartaruga.pensize(3)  
06.    tartaruga.setWorldCoordinates(-4,-2,4,2)
07.    linha(tartaruga,-4,0,4,0)
08.    linha(tartaruga,0,-2,0,2)
09.     
10.    tartaruga.pencolor('red')
11.    grafico(tartaruga,math.cos,xx)
12.    tartaruga.up()
13.    tartaruga.goto(0.5,1)
14.    tartaruga.write('COS', move=False, align='left', font=('Arial', 14, 'normal'))
15.    tartaruga.down()
16.     
17.    tartaruga.pencolor('blue')
18.    tartaruga.up()
19.    tartaruga.goto(-2,1.2)
20.    tartaruga.write('DERIVADA COS', move=False, align='left', font=('Arial', 14, 'normal'))
21.    tartaruga.down()
22.    grafico(tartaruga,derivada(math.cos),xx)
23.    tartaruga.exitOnClick() 

Executando o programa obtém-se:



Fantástico, não é???

Sem comentários:

Enviar um comentário