Распространённые проблемы с функциями - Sage Tutorial in Russian

Skip to content
Back to top
View this page
Edit this page

# Распространённые проблемы с функциями

Некоторые аспекты определения функций (например, для дифференцирования или построения графика) могут быть не ясны. В этом разделе мы обращаем внимание на некоторые наиболее распространенные проблемы.

Далее показаны несколько способов определения того, что можно назвать «функцией»:

1. Определите функцию Python, как описано в разделе Функции, отступы и счетчики. Для таких функций можно построить графики, но продифференцировать или проинтегрировать их нельзя.

Sage

    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

Python

    >>> 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

Обратите внимание на синтаксис в последней строчке. `plot(f(z), 0, 2)` выдаст ошибку, так как `z` - это переменная-болванка в определении `f`, которая не определена внутри данной конструкции. Просто `f(z)` возвратит ошибку. Следующее будет работать в данном контексте, однако, в общем, возникнут некоторые затруднения, но они могут быть проигнорированы (см. пункт 4).

Sage

    sage: var('z')   # определение переменной z для символьных вычислений
    z
    sage: f(z)
    z^2
    sage: plot(f(z), 0, 2)
    Graphics object consisting of 1 graphics primitive

[Python]

    >>> from sage.all import *
    >>> var('z')   # определение переменной z для символьных вычислений
    z
    >>> f(z)
    z^2
    >>> plot(f(z), Integer(0), Integer(2))
    Graphics object consisting of 1 graphics primitive

В этом случае `f(z)` - это символьное выражение.

2. Определим «вызываемое символьное выражение». Оно может быть продифференцировано, проинтегрировано, а также можно построить его график.

Sage

    sage: g(x) = x^2
    sage: g        # g отображает x в 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

Python

    >>> from sage.all import *
    >>> __tmp__=var("x"); g = symbolic_expression(x**Integer(2)).function(x)
    >>> g        # g отображает x в 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` — это вызываемое символьное выражение, `g(x)` — это связянный с ним объект, но другого вида, для которого можно построить график и который можно дифференциировать и т.д.

Sage

    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

[Python]

    >>> 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

3. Можно использовать уже определенную функцию Sage — „функцию исчисления“. Для нее может быть построен график, она может быть продифференцирована и проинтегрирована.

Sage

    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

Python

    >>> 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

Сама по себе функция `sin` не может быть продифференцирована, по крайней мере, не может произвести `cos`.

Sage

    sage: f = sin
    sage: f.derivative()
    Traceback (most recent call last):
    ...
    AttributeError: ...

[Python]

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

Использование `f = sin(x)` вместо `sin` работает, но лучше использовать `f(x) = sin(x)` для того, чтобы определить вызываемое символьное выражение.

Sage

    sage: S(x) = sin(x)
    sage: S.derivative()
    x |--> cos(x)

Python

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

Далее следуют некоторые общие проблемы с объяснением:

4. Случайная оценка.

Sage

    sage: def h(x):
    ....:     if x<2:
    ....:         return 0
    ....:     else:
    ....:         return x-2

[Python]

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

Проблема: `plot(h(x), 0, 4)` построит кривую \(y=x-2\). Причина: В команде `plot(h(x), 0, 4)` сначала оценивается `h(x)`, что означает подставку `x` в функцию `h` и оценку `x<2`.

Sage

    sage: type(x<2)
    <class 'sage.symbolic.expression.Expression'>

Python

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

Решение: Не используйте `plot(h(x), 0, 4)`; используйте:

Sage

    sage: plot(h, 0, 4)
    Graphics object consisting of 1 graphics primitive

[Python]

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

5. Ошибочное создание константы вместо функции.

Sage

    sage: f = x
    sage: g = f.derivative()
    sage: g
    1

Python

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

Проблема: `g(3)`, например, возвратит ошибку с сообщением «ValueError: the number of arguments must be less than or equal to 0.»

Sage

    sage: type(f)
    <class 'sage.symbolic.expression.Expression'>
    sage: type(g)
    <class 'sage.symbolic.expression.Expression'>

[Python]

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

`g` не является функцией, это константа, поэтому она не имеет переменных, и вы можете вставлять что угодно в нее.

Решение: есть несколько возможных путей.

- Определить `f` изначально как символьное выражение.

Sage

    sage: f(x) = x        # вместо 'f = x'
    sage: g = f.derivative()
    sage: g
    x |--> 1
    sage: g(3)
    1
    sage: type(g)
    <class 'sage.symbolic.expression.Expression'>

Python

    >>> from sage.all import *
    >>> __tmp__=var("x"); f = symbolic_expression(x        ).function(x)# вместо 'f = x'
    >>> g = f.derivative()
    >>> g
    x |--> 1
    >>> g(Integer(3))
    1
    >>> type(g)
    <class 'sage.symbolic.expression.Expression'>

- Либо вместе с `f`, определенной выше, определить `g` как символьное выражение.

Sage

    sage: f = x
    sage: g(x) = f.derivative()  # вместо 'g = f.derivative()'
    sage: g
    x |--> 1
    sage: g(3)
    1
    sage: type(g)
    <class 'sage.symbolic.expression.Expression'>

[Python]

    >>> from sage.all import *
    >>> f = x
    >>> __tmp__=var("x"); g = symbolic_expression(f.derivative()  ).function(x)# вместо 'g = f.derivative()'
    >>> g
    x |--> 1
    >>> g(Integer(3))
    1
    >>> type(g)
    <class 'sage.symbolic.expression.Expression'>

- Либо с `f` и `g`, заданными, как показано выше, создать переменную, под которую подставляются значения.

Sage

    sage: f = x
    sage: g = f.derivative()
    sage: g
    1
    sage: g(x=3)    # вместо 'g(3)'
    1

Python

    >>> from sage.all import *
    >>> f = x
    >>> g = f.derivative()
    >>> g
    1
    >>> g(x=Integer(3))    # вместо 'g(3)'
    1

Есть еще один способ, как определить различие между производными `f = x` и `f(x) = x`

Sage

    sage: f(x) = x
    sage: g = f.derivative()
    sage: g.variables()  # переменные, которые присутствуют в g
    ()
    sage: g.arguments()  # аргументы, которые могут быть подставлены в g
    (x,)
    sage: f = x
    sage: h = f.derivative()
    sage: h.variables()
    ()
    sage: h.arguments()
    ()

[Python]

    >>> from sage.all import *
    >>> __tmp__=var("x"); f = symbolic_expression(x).function(x)
    >>> g = f.derivative()
    >>> g.variables()  # переменные, которые присутствуют в g
    ()
    >>> g.arguments()  # аргументы, которые могут быть подставлены в g
    (x,)
    >>> f = x
    >>> h = f.derivative()
    >>> h.variables()
    ()
    >>> h.arguments()
    ()

Как показывает данный пример, `h` не принимает аргументов, поэтому `h(3)` вернет ошибку.