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.


def grafico(tartaruga,funcao, valores):
""" Desenha o gráfico da função f."""
tartaruga.up()
tartaruga.goto(valores[0], funcao(valores[0]))
tartaruga.down()

for indice in range(1,len(valores)):
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):

def main3():

xx = float_range.float_range_lista(-4,4,0.1)
tartaruga = cTurtle.Turtle()
tartaruga.pensize(3)
tartaruga.setWorldCoordinates(-4,-2,4,2)
linha(tartaruga,-4,0,4,0)
tartaruga.write('X', move=False, align='left', font=('Arial', 14, 'normal'))
linha(tartaruga,0,-2,0,2)

tartaruga.pencolor('red')
tartaruga.up()
tartaruga.goto(0.5,1)
tartaruga.write('SIN(X)', move=False, align='left', font=('Arial', 14, 'normal'))
grafico(tartaruga,math.sin,xx)

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:

def derivada(f):
"""Derivada de uma função."""
dx= 1.e-6
def d(x):
return (f(x + dx) - f(x))/dx
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:

def main1():

xx = float_range.float_range_lista(-4,4,0.1)
tartaruga = cTurtle.Turtle()
tartaruga.pensize(3)
tartaruga.setWorldCoordinates(-4,-2,4,2)
linha(tartaruga,-4,0,4,0)
linha(tartaruga,0,-2,0,2)

tartaruga.pencolor('red')
grafico(tartaruga,math.cos,xx)
tartaruga.up()
tartaruga.goto(0.5,1)
tartaruga.write('COS', move=False, align='left', font=('Arial', 14, 'normal'))
tartaruga.down()

tartaruga.pencolor('blue')
tartaruga.up()
tartaruga.goto(-2,1.2)
tartaruga.write('DERIVADA COS', move=False, align='left', font=('Arial', 14, 'normal'))
tartaruga.down()
grafico(tartaruga,derivada(math.cos),xx)
tartaruga.exitOnClick()

Executando o programa obtém-se:



Fantástico, não é???

Sem comentários:

Enviar um comentário