Algumas Questões Frequentes sobre Funções

Alguns aspectos sobre definição de funções (por exemplo, para diferenciação, ou para criar gráficos) podem se tornar confusos. Nesta seção, procuramos tratar algumas questões relevantes.

Aqui estão várias formas de definir objetos que merecem ser chamamos de “funções”:

1. Defina uma função em Python, como descrito em Funções, Tabulação, e Contagem. Essas funções podem ser usadas para criar gráficos, mas não podem ser diferenciadas ou integradas.

sage: def f(z): return z^2
sage: type(f)
<... 'function'>
sage: f(3)
9
sage: plot(f, 0, 2)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> def f(z): return z**Integer(2)
>>> type(f)
<... 'function'>
>>> f(Integer(3))
9
>>> plot(f, Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
def f(z): return z^2
type(f)
f(3)
plot(f, 0, 2)

Na última linha, observe a sintaxe. Se fosse usado plot(f(z), 0, 2) ocorreria um erro, porque z é uma variável muda na definição de f e não está definida fora do contexto da função. De fato, somente f(z) já provoca um erro. Os seguintes comandos vão funcionar neste caso, embora em geral eles devam ser evitados pois podem ocasionar erros (veja o item 4 abaixo).

sage: var('z')   # define z to be a variable
z
sage: f(z)
z^2
sage: plot(f(z), 0, 2)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> var('z')   # define z to be a variable
z
>>> f(z)
z^2
>>> plot(f(z), Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
var('z')   # define z to be a variable
f(z)
plot(f(z), 0, 2)

Acima, f(z) é uma expressão simbólica, o próximo item na nossa lista.

2. Defina um “expressão simbólica que pode ser evocada”. Essas podem ser usadas para criar gráficos, e podem ser diferenciadas ou integradas.

sage: g(x) = x^2
sage: g        # g sends x to x^2
x |--> x^2
sage: g(3)
9
sage: Dg = g.derivative(); Dg
x |--> 2*x
sage: Dg(3)
6
sage: type(g)
<class 'sage.symbolic.expression.Expression'>
sage: plot(g, 0, 2)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> __tmp__=var("x"); g = symbolic_expression(x**Integer(2)).function(x)
>>> g        # g sends x to x^2
x |--> x^2
>>> g(Integer(3))
9
>>> Dg = g.derivative(); Dg
x |--> 2*x
>>> Dg(Integer(3))
6
>>> type(g)
<class 'sage.symbolic.expression.Expression'>
>>> plot(g, Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
g(x) = x^2
g        # g sends x to x^2
g(3)
Dg = g.derivative(); Dg
Dg(3)
type(g)
plot(g, 0, 2)

Note que enquanto g é uma expressão simbólica que pode ser evocada, g(x) é um objeto diferente, embora relacionado, que pode ser usado para criar gráficos, ou ser diferenciado, integrado, etc., embora com algumas ressalvas: veja o item 5 abaixo.

sage: g(x)
x^2
sage: type(g(x))
<class 'sage.symbolic.expression.Expression'>
sage: g(x).derivative()
2*x
sage: plot(g(x), 0, 2)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> g(x)
x^2
>>> type(g(x))
<class 'sage.symbolic.expression.Expression'>
>>> g(x).derivative()
2*x
>>> plot(g(x), Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
g(x)
type(g(x))
g(x).derivative()
plot(g(x), 0, 2)

3. Use uma função pré-definida. Essas podem ser representadas em gráfico, e com uma pequena ajuda, diferenciadas e integradas.

sage: type(sin)
<class 'sage.functions.trig.Function_sin'>
sage: plot(sin, 0, 2)
Graphics object consisting of 1 graphics primitive
sage: type(sin(x))
<class 'sage.symbolic.expression.Expression'>
sage: plot(sin(x), 0, 2)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> type(sin)
<class 'sage.functions.trig.Function_sin'>
>>> plot(sin, Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
>>> type(sin(x))
<class 'sage.symbolic.expression.Expression'>
>>> plot(sin(x), Integer(0), Integer(2))
Graphics object consisting of 1 graphics primitive
type(sin)
plot(sin, 0, 2)
type(sin(x))
plot(sin(x), 0, 2)

Por si só, sin não pode ser diferenciado, pelo menos não para produzir cos.

sage: f = sin
sage: f.derivative()
Traceback (most recent call last):
...
AttributeError: ...
>>> from sage.all import *
>>> f = sin
>>> f.derivative()
Traceback (most recent call last):
...
AttributeError: ...
f = sin
f.derivative()

Usando f = sin(x) no lugar de sin funciona, mas é ainda melhor usar f(x) = sin(x) para definir uma expressão simbólica que pode ser evocada.

sage: S(x) = sin(x)
sage: S.derivative()
x |--> cos(x)
>>> from sage.all import *
>>> __tmp__=var("x"); S = symbolic_expression(sin(x)).function(x)
>>> S.derivative()
x |--> cos(x)
S(x) = sin(x)
S.derivative()

Aqui estão alguns problemas comuns, com explicações:

4. Cálculo acidental.

sage: def h(x):
....:     if x<2:
....:         return 0
....:     else:
....:         return x-2
>>> from sage.all import *
>>> def h(x):
...     if x<Integer(2):
...         return Integer(0)
...     else:
...         return x-Integer(2)
def h(x):
    if x<2:
        return 0
    else:
        return x-2

O problema: plot(h(x), 0, 4) cria o gráfico da reta \(y=x-2\), não da função definida por h. O motivo? No comando plot(h(x), 0, 4), primeiro h(x) é calculada: isso significa substituir x na função h, o que significa que x<2 é calculado.

sage: type(x<2)
<class 'sage.symbolic.expression.Expression'>
>>> from sage.all import *
>>> type(x<Integer(2))
<class 'sage.symbolic.expression.Expression'>
type(x<2)

Quando uma equação simbólica é calculada, como na definição de h, se ela não é obviamente verdadeira, então ela retorna False. Logo h(x) é calculada como x-2, e essa é a função que será representada no gráfico.

A solução: não use plot(h(x), 0, 4); em vez disso, use

sage: plot(h, 0, 4)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> plot(h, Integer(0), Integer(4))
Graphics object consisting of 1 graphics primitive
plot(h, 0, 4)

5. Acidentalmente produzindo uma constante em vez de uma função.

sage: f = x
sage: g = f.derivative()
sage: g
1
>>> from sage.all import *
>>> f = x
>>> g = f.derivative()
>>> g
1
f = x
g = f.derivative()
g

O problema: g(3), por exemplo, retorna o erro “ValueError: the number of arguments must be less than or equal to 0.”

sage: type(f)
<class 'sage.symbolic.expression.Expression'>
sage: type(g)
<class 'sage.symbolic.expression.Expression'>
>>> from sage.all import *
>>> type(f)
<class 'sage.symbolic.expression.Expression'>
>>> type(g)
<class 'sage.symbolic.expression.Expression'>
type(f)
type(g)

g não é uma função, é uma constante, logo não possui variáveis associadas, e você não pode substituir nenhum valor em g.

Solução: existem vária opções.

  • Defina f inicialmente como uma expressão simbólica.

sage: f(x) = x        # instead of 'f = x'
sage: g = f.derivative()
sage: g
x |--> 1
sage: g(3)
1
sage: type(g)
<class 'sage.symbolic.expression.Expression'>
>>> from sage.all import *
>>> __tmp__=var("x"); f = symbolic_expression(x        ).function(x)# instead of 'f = x'
>>> g = f.derivative()
>>> g
x |--> 1
>>> g(Integer(3))
1
>>> type(g)
<class 'sage.symbolic.expression.Expression'>
f(x) = x        # instead of 'f = x'
g = f.derivative()
g
g(3)
type(g)
  • Ou com f como definida originalmente, defina g como uma expressão simbólica.

sage: f = x
sage: g(x) = f.derivative()  # instead of 'g = f.derivative()'
sage: g
x |--> 1
sage: g(3)
1
sage: type(g)
<class 'sage.symbolic.expression.Expression'>
>>> from sage.all import *
>>> f = x
>>> __tmp__=var("x"); g = symbolic_expression(f.derivative()  ).function(x)# instead of 'g = f.derivative()'
>>> g
x |--> 1
>>> g(Integer(3))
1
>>> type(g)
<class 'sage.symbolic.expression.Expression'>
f = x
g(x) = f.derivative()  # instead of 'g = f.derivative()'
g
g(3)
type(g)
  • Ou com f e g como definidas originalmente, especifique a variável para a qual você está substituindo.

sage: f = x
sage: g = f.derivative()
sage: g
1
sage: g(x=3)    # instead of 'g(3)'
1
>>> from sage.all import *
>>> f = x
>>> g = f.derivative()
>>> g
1
>>> g(x=Integer(3))    # instead of 'g(3)'
1
f = x
g = f.derivative()
g
g(x=3)    # instead of 'g(3)'

Finalmente, aqui vai mais uma forma de saber a diferença entre as derivadas de f = x e f(x) = x.

sage: f(x) = x
sage: g = f.derivative()
sage: g.variables()  # the variables present in g
()
sage: g.arguments()  # the arguments which can be plugged into g
(x,)
sage: f = x
sage: h = f.derivative()
sage: h.variables()
()
sage: h.arguments()
()
>>> from sage.all import *
>>> __tmp__=var("x"); f = symbolic_expression(x).function(x)
>>> g = f.derivative()
>>> g.variables()  # the variables present in g
()
>>> g.arguments()  # the arguments which can be plugged into g
(x,)
>>> f = x
>>> h = f.derivative()
>>> h.variables()
()
>>> h.arguments()
()
f(x) = x
g = f.derivative()
g.variables()  # the variables present in g
g.arguments()  # the arguments which can be plugged into g
f = x
h = f.derivative()
h.variables()
h.arguments()

Como esse exemplo procura ilustrar, h não aceita argumentos, e é por isso que h(3) retorna um erro.