10Функции. Предел функции

10.1Понятие функции

10.1.1Функции и отображения

Мы, наконец, добрались до главного объекта математического анализа — до функций. Слова «функция» и «отображения» в принципе являются синонимами, они обозначают одно и то же математическое понятие, но в зависимости от контекста чаще используют одно или другое. Говоря «функция», мы будем как правило иметь в виду числовую функцию одной переменной, то есть отображение, которое числу ставит в соответствие число. Именно такие функции изучают в школе.

Определение 1. (Числовой) функцией (одной переменной) называется отображение
где — некоторое подмножество множества вещественных чисел. В этом случае называется областью определения функции. Обозначают также .

Выбранный термин — функция или отображение — также влияет на выбор терминов для обозначения некоторых связанных понятий. Например, если — некоторый элемент области определения, а , в терминах отображений называется прообразом, образом точки под действием отображения . В случае, когда говорят о функциях, называют аргументом функции, а — её значением в точке . Впрочем, учитывая, что математический смысл один и тот же, это терминологическое разделение не очень строгое, и мы зачастую будем использовать то одни слова, то другие.

10.1.2Функции и формулы

Функции можно задавать формулами.

Пример 1. Запись задаёт функцию, которая любому вещественному числу ставит в соответствие его квадрат, см. рис. 10.1.

Нарисованы две вертикально направленные оси, слева x, справа y.
Нарисованы стрелочки, соединяющие точки на левой оси с их квадратами
на правой оси: 0 переходит в 0, 1 в 1, 2 в 4, 0.5 в 0.25.
Рис. 10.1: Функция как отображение: точки с левой оси переходят в точки на правой оси. Стрелочек нужно было бы нарисовать бесконечно много, но тогда ничего нельзя было бы разобрать
Если функция задана формулой, и не сказано ничего специального про её область определения, считается, что областью определения такой функции является множество всех чисел, при которых значение формулы может быть вычислено (так называемая естественная область определения).

Пример 2. Функция определена во всех точках, кроме и . Её область опредеделения — .

При необходимости можно задать функцию, определенную на каком-то более узком подмножестве. Например, можно рассмотреть функцию , . Несмотря на то, что из примера выше и только что определенная задаются одной и той же формулой, это разные функции, поскольку у них разные области определения. Можно сказать, что функция была получена из функции путём ограничения её на множество . Графиком функции (см. ниже) является парабола, а функции — только её правая ветвь.

Иногда область определения функции ясна из контекста и смысла входящих в неё переменных. Например, если — это размер какой-нибудь популяции, вряд ли он может быть отрицательным.

Пример 3. Функции можно задавать более сложными выражениями. Например:
Это пример кусочного задания функции. В зависимости от того, какому условию удовлетворяет значение , применяется либо одна формула, либо другая.

10.1.3График функции

Один из правильных способов думать про функции — это думать про их графики. По определению, график функции — это множество точек на декартовой плоскости, у которых -координата равна какому-то значению из области определения функции, а -координата равна . Формально:
Функции можно задавать графиками. Eсли нарисовать произвольную кривую на декартовой плоскости, она будет графиком некоторой функции если и только если с любой вертикальной прямой у неё будет не более одной точки пересечения, см. рис. 10.2.
Нарисовано четыре картинки, на двух картинках слева нарисованы
графики функций, кривые справа имеют несколько точек пересечений с
некоторыми вертикальными прямыми.
Рис. 10.2: Кривые слева являются графиками функций. Слева сверху функция принимает значение в точке и значение в точке . Слева снизу функция не определена на интервале . Кривые справа не являются графиками функций: для некоторых (в частности, отмеченных) вертикальных прямых у них более одной точки пересечения.
Если точки пересечения нет, значит, функция не определена в точке . Если есть, -координата точки пересечения задаёт значение функции в точке . Если бы нашлась вертикальная прямая с более чем одной точкой пересечения, было бы непонятно, какое значение принимает функция в соответствующей точке.

Как правило, думая о свойствах функции, правильнее всего представлять себе именно графики, а не, скажем, формулы, которыми эти функции задаются. Однако, нужно понимать, что любой физически нарисованный график — лишь приближение к абстрактному математическому графику. Графики как правило сами по себе не могут использоваться для доказательств утверждений, хотя придумать доказательства без них часто может быть очень сложно.

Впрочем, бывают функции, графики которых трудно себе представить.

Пример 4. Рассмотрим функцию Дирихле:
Она принимает значение во всех рациональных точках и во всех иррациональных. Представить себе её график довольно сложно — он не выглядит как привычная нам кривая. Поскольку и рациональные и иррациональные числа всюду плотны, на любом сколь угодно маленьком интервальчике будут как точки, в которых функция принимает значение , так и точки, в которых функция принимает значение . Получится два таких «дырявых» множества точек, одно лежит на прямой , другое на .

10.1.4Свойства функций

Часть свойств функций очень похожи на аналогичные свойства последовательностей.

Определение 2. Говорят, что функция ограничена (ограничена сверху, ограничена снизу) на множестве , если существует такое , что для всех выполняется неравенство (соответственно, , ).

В этом определении для краткости сформулированы сразу три определения: из скобок нужно выбирать соответствующие элементы. Если множество не указано, считается, что — вся область определения функции.

Пример 5. Функция не является ограниченной, поскольку выражение может принимать сколь угодно большие значения (для всякого можно выбрать и получить ). Однако, эта функция ограничена на отрезке .

Определение 3. Функция называется возрастающей (убывающей, неубывающей, невозрастающей) на множестве если для всех , таких, что , справедливо неравенство (соответственно, , , ). Неубывание также называется нестрогим возрастанием, а невозрастание — нестрогим убыванием.

Пример 6. Рассмотрим функцию . Она возрастает на отрезке , убывает на отрезке и снова возрастает на отрезке .

Вопрос 1. Верно ли, что функция возрастает на множестве ?
  Верно, об этом же выше написано!

Неверный ответ. Не совсем, написано, что она возрастает на отрезке и на отрезке . Возрастает ли она на их объединении? Проверьте с помощью определения.

  Звучит странно, но нет, неверно.

Верный ответ. Именно так! Хотя функция возрастает на каждом из отрезков, она не возрастает на их объединении, поскольку требования определения не выполняются. Например, если и , обе точки принадлежат объединению, и при этом .

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

Определение 4. Пусть область определения функции симметрична относительно нуля, то есть вместе с каждой точкой содержит и точку . Функция называется чётной, если для всех , . Функция называется нечётной, если для всех , .

График чётной функции симметричен относительно оси : вместе с каждой точкой он содержит точку . График нечётной функции симметричен относительно начала координат: вместе с каждой точкой он содержит точку .

Пример 7. Функция является нечётной, а — чётной. Функция является чётной при чётных значениях и нечётной при нечётных (отсюда и название).

У функций ещё бывают локальные и глобальные максимумы и минимумы (чего тоже не было у последовательностей), но о них мы поговорим позже. А сейчас самое время перейти к главному: понятию предела.

10.2Предел функции

10.2.1Примеры и мотивировка

Начнём как всегда с неформального описания и примеров.

Как бы определение 1. Говорят, что функция имеет предел в точке , равный , если значение этой функции становится сколь угодно близким к числу если значение достаточно близко к , но при этом не равно .

Обозначение:

или
Рассмотрим несколько примеров.

Пример 8. Пусть . К чему стремится , если стремится к 2? Можно посмотреть на график и увидеть, что если мы выибраем значения , близкие к 2, то соответствующая точка на графике будет близка к точке .
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def f(x):
    return x ** 2
def plot_value(x, f):
    plt.plot([x, x, 0], [0, f(x), f(x)], '.--', color='C1')
x = np.linspace(-0.7, 3, 211)
plt.figure(figsize=(6, 5))
plt.plot(x, f(x), label='$y=f(x)$', color='Teal')
plt.plot([2], [4], 'o', 
          color='Teal', markerfacecolor='Teal',
          markeredgewidth=1.5)
plot_value(1.5, f)
plot_value(1.9, f)
plot_value(2.05, f)
plot_value(2-0.02, f)
plt.legend()

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-0.7, xmax=2.7, ymin=-0.2, ymax=7.8, 
               xlabel="x", ylabel="y") 
Рис. 10.3: Предел функции при .
Значит, значение будет близким к 4. Таким образом, предел при стремящемся к двум равен четырём:

Казалось бы, зачем городить такой огород в предыдущем примере — понятно, что достаточно просто подставить значение в формулу для функции и получить ответ. Однако, это не всегда работает. Во-первых, в квазиопределении предела явно сказано, что мы не можем брать , равное . Во-вторых, функция может быть не определена в точке — и это не мешает ей иметь предел в этой точке.

Пример 9. Пусть
К чему приближается значение функции когда приближается к 1? Если попытаться просто подставить значение в формулу, ничего не получится: знаменатель обнуляется и значение не определено. Однако, можно выбирать близкие значения , подставлять их в формулу и посмотреть, что получается:
def f(x):
    return (x ** 2 - 1) / (x - 1)
print("x\tf(x)")
for x in [1.01, 1.001, 1.0001, 1.00001, 
          0.99, 0.999, 0.9999, 0.99999]:
    print(f"{x}\t{f(x)}")
x	f(x)
1.01	2.009999999999999
1.001	2.0009999999999177
1.0001	2.0000999999993923
1.00001	2.0000100000008274
0.99	1.990000000000001
0.999	1.9989999999999712
0.9999	1.9998999999994975
0.99999	1.9999899999991726
Из таблички, которую мы видим, можно сделать вывод, что значение приближается к . То же самое можно увидеть на графике.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def f(x):
    return (x ** 2 - 1) / (x - 1)
def plot_value(x, f):
    plt.plot([x, x, 0], [0, f(x), f(x)], '.--', color='C1')
x = np.linspace(-0.5, 3, 211)
plt.figure(figsize=(6, 5))
plt.plot(x, f(x), label='$y=f(x)$', color='Teal')
plt.plot([1], [2], 'o', 
          color='Teal', markerfacecolor='white',
          markeredgewidth=1.5)
plot_value(0.5, f)
plot_value(0.9, f)
plot_value(1.05, f)
plt.legend()

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-0.9, xmax=1.7, ymin=-0.2, ymax=2.2, 
               xlabel="x", ylabel="y") 
Рис. 10.4: Функция не определена в точке, но предел у неё есть.
Как это можно было бы доказать?

Заметим, что выражение для можно упростить. Если разложить числитель на скобки, получится :

Если , дробь можно сократить на и получится выражение . Если , значение функции не определено. Таким образом, можно сказать, что функция определена при всех значениях , и на этом множестве задаётся формулой
Поскольку нас интересует, к чему приближается , когда приближается к 1, но не равен 1 (см. как бы определение 1), нас интересуют только значения функции при , и значит мы можем смело использовать формулу (10.1). Очевидно, если приближается к 1, то приближается к 2. Таким образом,

Замечание 1. Заметим, что в приведенной выше табличке значения не в точности равны . Это связано с тем, что все компьютерные вычисления с вещественными числами носят приблизительный характер: компьютер не может запомнить все цифры вещественного числа (их бесконечно много, никакой памяти не хватит) и в ходе вычислений постоянно делает округления.

Пример 10. Рассмотрим функцию
Чему равняется её предел при ?

В этом примере функция определена в точке и может возникнуть искушение подставить в формулу и сказать, что результат (число 3) и будет ответом. Однако, это неверно. На самом деле, значение функции в этой точке никак не влияет на ответ: предел функции при стремящемся к зависит от значений функции в точках, близких к , но не в самой точке .

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def f(x):
    return np.ones_like(x) 
def plot_value(x, f):
    plt.plot([x, x, 0], [0, f(x), f(x)], '.--', color='C1')
x = np.linspace(0, 3, 211)
plt.figure(figsize=(6, 5))
plt.plot(x, f(x), label='$y=f(x)$', color='Teal')
plt.plot([2, 2], [0, 3.2], ':', color='Teal')
plt.plot([2], [3], 'o', 
          color='Teal', markerfacecolor='Teal',
          markeredgewidth=1.5)
plt.plot([2], [f(2)], 'o', 
          color='Teal', markerfacecolor='white',
          markeredgewidth=1.5)
# plot_value(1.5, f)
# plot_value(1.9, f)
# plot_value(2.05, f)
plt.legend(loc='lower right')

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-0.9, xmax=2.7, ymin=-1.2, ymax=3.7, 
               xlabel="x", ylabel="y") 
Рис. 10.5: Предел функции в точке не равен её значению в этой точке.
Во всех точках, близких к , значение функции равно . Значит, предел этой функции при также равен 1:

Пример 11. Рассмотрим функцию
Что вы можете сказать про её предел при ?

Посмотрим на график.

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def f(x):
    return np.where(x < 1, x + 1, 
                    np.where(x == 1, 
                        np.full_like(x, np.nan), x - 2))
def plot_value(x, f):
    plt.plot([x, x, 0], [0, f(x), f(x)], '.--', color='C1')
x = np.linspace(-0.5, 2.5, 211)
plt.figure(figsize=(6, 5))
plt.plot(x, f(x), label='$y=f(x)$', color='Teal')
plt.plot([1, 1], [-1.2, 2.7], ':', color='Teal')
plt.plot([1], [2], 'o', 
          color='Teal', markerfacecolor='Teal',
          markeredgewidth=1.5)
plt.plot([1], [-1], 'o', 
          color='Teal', markerfacecolor='white',
          markeredgewidth=1.5)
plot_value(0.9, f)
plot_value(0.95, f)
plot_value(1.1, f)
plot_value(1.05, f)
plt.legend(loc='lower right')

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-0.9, xmax=2.7, ymin=-1.2, ymax=2.7, 
               xlabel="x", ylabel="y") 
Если чуть меньше 1, действует верхняя строчка в определении функции и значение оказывается чуть меньше 2. Однако, если чуть больше 1, действует уже нижняя строчка, и значение функции оказывается чуть больше . Никакого одного числа, к которому бы приближалось значение функции, когда приближается к 1, нет. Значит, нет и предела.

Итак, в этом случае не существует.

В этом примере несуществование предела было связано с тем фактом, что при приближении с разных сторон значение функции приближалось к разным числам. Это не единственный механизм несуществования предела.

Пример 12. Рассмотрим функцию
Что вы можете сказать про её предел при ? Просто подставить в формулу нельзя, да и как мы видели это не всегда работает. Попробуем использовать тот же приём, что и в примере 8: подставим в какие-нибудь значения , близкие к 0, и посмотрим, что получается.
import numpy as np

def f(x):
    return np.sin(np.pi / x)
print(" x\t\t f(x)")
for x in [0.01, 0.001, 0.0001, 0.00001, 
          -0.01, -0.001, -0.0001, -0.00001]:
    print(f"{x: .7f}\t{f(x): .7f}")
 x		 f(x)
 0.0100000	 0.0000000
 0.0010000	-0.0000000
 0.0001000	-0.0000000
 0.0000100	-0.0000000
-0.0100000	-0.0000000
-0.0010000	 0.0000000
-0.0001000	 0.0000000
-0.0000100	 0.0000000
Чему же равен предел? Из таблички может сложиться ощущение, что нулю — во всех наших пробных точках значение функции нулевое. Однако, на самом деле это не так.

Рассмотрим последовательность точек . Очевидно при . Найдём :

Таким образом, существуют сколь угодно близкие к нулю числа, в которых значение функции принимает значение 1. Это значит, что предел никак не может быть равен нулю! На самом деле, предел в этом случае не существует: выбирая разные значения , близкие к нулю, например, справа (то есть положительные числа), можно получать значения функции, близкие к , или к , или к , или ещё к чему-нибудь. Одного числа, к которому приближалось бы значение функции, не существует.

Упражнение 1. Крайне полезное упражнение — построить график функции . Чтобы понять, как он выглядит, полезно найти все значения , при которых функция принимает значения , и и отметить соответствуюие точки на графике.

10.2.2Строгое определение предела

Мы хотим формализовать квазиопределение 1. В нём есть слова «значение функции становится сколь угодно близким». Что это значит? Это значит, что мы можем сделать значения настолько близкими к числу , насколько хотим. Но для этого нужно потребовать, чтобы был достаточно близок к (и при этом не равен ). С чем-то подобным мы уже сталкивались, когда придумывали понятие предела последовательности. Определение предела функции очень похоже.

Нам понадобится пара вспомогательных определений.

Определение 5. Окрестностью точки называется любой интервал , содержащий точку , см. рис. 10.7. Проколотой окрестностью точки назвается окрестность, из которой выкинули саму точку , то есть множество , где . Эпсилон-окрестностью (-окрестностью) точки называется интервал . Проколотой -окрестностью точки называется множество
Обычно -окрестность точки обозначается как , а проколотая -окрестность — как .

Рис. 10.7: Различные типы окрестностей: обычная окрестность, проколотая окрестность, -окрестность и проколотая -окрестность.

Замечание 2. Условие можно записать в виде
а условие в виде

Определение 6. Пусть функция определена в некоторой проколотой окрестности точки , то есть существует такая проколотая окрестность, в которой функция определена; в самой точке она может быть определена, а может и не быть. Говорят, что предел функции в точке равен числу , если для всякого найдётся такое , что для всех из проколотой -окрестности точки значения функции лежат в -окрестности точки , см. рис. 10.8.

Формально: утверждение

по определению означает, что
или, с учётом замечания 2:

Слева: две вертикальные оси, левая x, правая y, на правой отмечена
ϵ-окрестность точки b, на левой проколотая δ-окрестность точки x_0.
Справа график функции, на вертикальной оси отмечена ϵ-окрестность
точки b, на горизонтальной проколотая δ-окрестность точки x_0.
Видно, что весь график, лежащий над проколотой окрестностью точки
x_0, умещается в коридор, ограниченный прямыми y=b-ϵ и y=b+ϵ.
Значение функции в самой точке x_0 может выходить за этот коридор
или вовсе не существовать.
Рис. 10.8: Окрестности в определении предела. Заметим, что значение функции в самой точке может не лежать в -окрестности точки или быть вообще не определено, но может и лежать: про него мы ничего не говорим.

Пример. Вернёмся к примеру 8 и докажем, что , пользуясь только что сформулированным определением.

Пусть нам дано произвольное . Мы хотим подобрать такое , что для всех из проколотой -окрестности точки , . Заметим, что

Если лежит в проколотой дельта-окрестности точки , значит, . Таким образом мы получили оценку на первый сомножитель: его можно сделать сколь угодно маленьким подходящим выбором . Осталось оценить второй сомножитель. Поскольку мы выбираем сами, на неё можно накладывать любые условия, какие мы хотим. Пусть . (Почему именно ? На самом деле, подойдёт любое фиксированное число, нужно взять какое-то конкретное, почему бы и не ?) Тогда
или (прибавим ко всем членам число 2):
В этом случае выражение обязательно меньше : поскольку , выражение под модулем гарантированно положительно и значит его нужно сделать как можно больше, чтобы модуль был как можно больше, и значит нужно брать как можно большее значение , но . Таким образом, если ,
Мы хотим, чтобы эта величина была меньше . Это будет выполняться, если потребовать, чтобы . Итак, у нас есть два условия на : и . Чтобы они оба были удовлетворены, достаточно взять
Проверяем: для всех верно неравенство , и значит
Таким образом, выбранная нами удовлетворяет определению, и предел действительно равен 4, см. анимацию на рис. 10.9.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

from celluloid import Camera
def f(x):
    return x ** 2
def plot_value(x, f):
    plt.plot([x, x, 0], [0, f(x), f(x)], '.--', color='C1')
def get_delta(eps):
    return min(eps / 5, 1)
x = np.linspace(-0.7, 3, 211)
fig = plt.figure(figsize=(6, 5))
camera = Camera(fig)
x0 = 2

for eps in  np.linspace(2, 0.1, 30):
    plt.plot(x, f(x), label='$y=f(x)$', color='Teal')
    plot_value(x0, f)
    delta = get_delta(eps)
    plt.plot([x0 - delta, x0 - delta], [-0.7, 7], '-',
        linewidth=0.7, color='C1')
    plt.plot([x0 + delta, x0 + delta], [-0.7, 7], '-',
        color='C1', linewidth=0.7)

    plt.plot([-0.5, 2.5], [f(x0) - eps, f(x0) - eps], '-',
        color='C1', linewidth=0.7)

    plt.plot([-0.5, 2.5], [f(x0) + eps, f(x0) + eps], '-',
        color='C1', linewidth=0.7)
    ob.center_spines(grid=False, minor_ticks=False)
    ob.settle_axes(xmin=-0.7, xmax=2.7, ymin=-0.2, ymax=7.8, 
                   xlabel="x", ylabel="y") 
    camera.snap()
animation = camera.animate()