15Производная функции

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

15.1Определение производной

15.1.1Функции как динамические процессы

Рассмотрим функцию и пусть — это время, а — результат измерения какой-то величины в момент времени . Это может быть артериальное давление у пациента, или популяция некоторого вида, или количество людей, зараженных вирусом — что угодно. Но проще всего про это думать так: есть точка, которая может двигаться вверх и вниз, — это вертикальная координата (то есть просто высота) этой точки в момент времени . Тогда про эту функцию можно думать в динамических терминах. Например, рассмотрим функцию, заданную графиком на рис. 15.1.
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

x = np.linspace(-4, 4, 200)
plt.plot(x, (x ** 3  - 12 * x) / 16 * 2 + 1)

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
              xlabel="x", ylabel="y", axlabelshift=1.3) 
plt.grid()
plt.yticks([-1, 1, 2, 3])
Рис. 15.1: График функции
Этот график можно интерпретировать следующим образом. В момент времени точка находилась на высоте . Она сразу стала двигаться вверх, и спустя две единицы времени, в момент достигла высоты . Тут она на мгновение остановилась (перестала двигаться вверх) и изменила направление движения. Далее она двигалась вниз на протяжении четырёх единиц времени, до момента . Тут она снова на мгновение остановилась, и стала двигаться вверх, вплоть до момента времени (точка достигла высоты ). Дальнейшая её судьба неизвестна.

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 ** 3  - 12 * x) / 16 * 2 + 1

x = np.linspace(-4, 4, 200)

fig = plt.figure()
camera = Camera(fig)

ax1 = plt.subplot2grid((1, 6), (0, 1), colspan=5, label='ax1')
ax2 = plt.subplot2grid((1, 6), (0, 0), sharey=ax1, label='ax2')
for x0 in np.linspace(-4, 4, 51):
    ax1.plot(x, f(x), color='C0')
    ax1.plot([x0], [f(x0)], 'o', color='C1')
    ax1.set_yticks([-1, 1, 2, 3])
    ob.center_spines(grid=False, minor_ticks=False, ax=ax1)
    ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
                  xlabel="x", ylabel="y", axlabelshift=1.3, ax=ax1) 
    ax1.grid()

    ob.center_spines(grid=False, minor_ticks=False, axes=('y',), ax=ax2)
    ax2.plot([0], [f(x0)], 'o', color='C1')
    ax2.axes.get_xaxis().set_visible(False)
    ob.settle_axes(xmin=-1, xmax=1, ymin=-2.3 + 1, ymax=2.3 + 1,
        xlabel="", ylabel="y", axlabelshift=1.3, ax=ax2)
    ax2.set_yticks([-1, 0, 1, 2, 3])
    ax2.set_yticklabels(['$-1$', '', '$1$', '$2$', '$3$'])
    ax2.set_xticks([0])
    ax2.set_xticklabels([''])

    camera.snap()
animation = camera.animate()
Рис. 15.2: График функции и движение точки
Именно такую интерпретацию функций мы будем использовать в дальнейшем в этой лекции.

15.1.2Производная как мгновенная скорость

Рассмотрим функцию, заданную графиком на рис. 15.3. Пусть нас интересует скорость движения точки в какой-то момент времени .

Нарисован график функции, на горизонтальной оси отмечены точки x_0
и x_0 + Delta x, на вертикальной — f(x_0) и f(x_0 + Delta x)
Рис. 15.3: Вычисление средней скорости движения на интервале времени от до .
В школе нас учат, что чтобы найти скорость, нужно поделить расстояние на время. Рассмотрим период от момента до момента , где — какое-то небольшое число. (Выражение нужно воспринимать как неделимый символ, читается «дельта-икс».) В начале периода точка имела высоту , а в конце — . Пройденное расстояние между двумя моментами равно разности этих двух значений:
Тут нужно иметь в виду, что нас интересует «чистое расстояние», вычисляемое с учётом знака — не «сколько мы проехали», а «на сколько поднялись». Например, если в течение этого промежутка точка в какой-то момент двигалась вниз, в это время «пройденное расстояние» уменьшалось, а не увеличивалось. Также «расстояние» может быть отрицательным, если новое значение высоты окажется меньше исходного (то есть в итоге точка опустилась ниже, чем была).

Вернёмся к вычислению скорости. Время движения равно просто . Значит, скорость движения — вернее, средняя скорость движения на интервале от до находится по формуле:

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

Определение 1. Производная функции в точке равна мгновенной скорости изменения функции в этой точке. Она обозначается через и определяется следующим образом:
Также можно обозначить и записать тот же предел следующим образом:

Замечание 1. Мы раньше рисовали картинки, на которых была положительна. В определении производной этого на самом деле не требуется: используется предел при , а не односторонний предел.

15.2Интерпретация производной

15.2.1Линейная функция и равномерное движение

Рассмотрим функцию . Это хорошо известная линейная функция (по крайней мере, в матанализе её называют именно так, хотя специалисты по линейной алгебре с этим могли бы и поспорить). Возьмём произвольный начальный момент , произвольный промежуток длины и посчитаем среднюю скорость за этот промежуток:
Итак, каким бы ни был начальный момент и какой бы промежуток мы ни взяли, средняя скорость будет всегда одинаковой и равной . Таким образом, линейная функция задаёт движение с постоянной скоростью. Производная линейной функции, как следует из определения, во всех точках одинакова и равна .

Коэффициент называется угловым коэффициентом линейной функции (или угловым коэффициентом прямой, которая является графиком этой функции). Он показывает, на сколько позиций мы сдвинемся вверх, если подождём одну единицу времени (то есть сдвинемся на одну единицу по горизонтали), см. рис. 15.4.

Нарисован график функции y=kx+b, на горизонтальной оси отмечены точки x_0, x_0 + 1, x_0 + 2, не вертикальной - b, kx_0 + b, kx_0 + k + b, kx_0 + 2k + b. Отмечен угол прямой y=kx+b с горизонтальной в точке (x_0, kx_0 + b). Он обозначен alpha. Сказано, что tg alpha = k/1 = 2k/2.
Рис. 15.4: Линейная функция , её график и смысл коэффициентов. Коэффициент задаёт смещение по вертикали, а — наклон прямой.
Геометрически, угловой коэффициент — это тангенс угла наклона прямой, заданной как график линейной функции, к горизонтальной оси.

15.2.2Секущие и касательные

Рассмотрим теперь какую-нибудь нелинейную функцию, например, такую, график которой изображён на рис. 15.5. Пусть нас интересует производная в точке . Рассмотрим выражение под знаком предела в определении производной (15.1) и возьмём какое-то конкретное значение . Проведём прямую через точки и . Она называется секущей для графика функции . Поскольку секущая — это прямая, она является графиком линейной функции. Угловой коэффициент этой прямой как раз и равен средней скорости. Иными словами, если мы хотим двигаться равномерно (с постоянной скоростью) на промежутке времени от до и при этом пройти именно то расстояние, которое мы прошли: от до , то нужно двигаться как раз со средней скоростью на этом промежутке.
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 replace(lst, dct):
    return (dct.get(x, x) for x in lst)

def draw_section(x0=1, delta_x=2.3):
    X = np.linspace(-4, 4, 200)

    x = x0 + delta_x

    def f(x):
        return ((x + 1) / 3) ** 3

    k = (f(x) - f(x0)) / delta_x

    plt.plot(X, f(X), color='C0', label='$y=f(x)$')
    plt.plot([x0, x], [f(x0), f(x)], 'o', color='C1')
    plt.plot(X, k * (X - x0) + f(x0), '-', color='C1')

    plt.legend()

    ob.center_spines(grid=False, minor_ticks=False)
    ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
                  xlabel="x", ylabel="y", axlabelshift=1.3) 
    plt.yticks([])
    plt.xticks([x0, x], 
               ['$x_0$', r'$x_0 + \Delta x$'])
draw_section()
Рис. 15.5: Секущая к графику функции
Будем теперь уменьшать . В этом случае одна точка на графике будет неподвижной, а другая будет к ней приближаться, см. анимацию на рис. 15.6. Секущая при этом может поворачиваться вокруг точки . Однако если существует предел в определении производной, то у секущей будет существовать предельный угловой коэффициент, и значит предельное положение — она будет «стремиться» (в кавычках — потому что мы не определяли, что может значить «стремиться» для прямых) к прямой, проходящей через точку с угловым коэффициентом . У этой прямой есть специальное название: касательная.

Определение 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 replace(lst, dct):
    return (dct.get(x, x) for x in lst)

def draw_section(x0=1, delta_x=2.3):
    X = np.linspace(-4, 4, 200)

    x = x0 + delta_x

    def f(x):
        return ((x + 1) / 3) ** 3

    k = (f(x) - f(x0)) / delta_x

    plt.plot(X, f(X), color='C0', label='$y=f(x)$')
    plt.plot([x0, x], [f(x0), f(x)], 'o', color='C1')
    plt.plot(X, k * (X - x0) + f(x0), '-', color='C1')
    plt.yticks([0], [''])
    plt.xticks([0], [''])

    ob.center_spines(grid=False, minor_ticks=False)
    ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
                  xlabel="x", ylabel="y", axlabelshift=1.3) 

fig = plt.figure()
camera = Camera(fig)

for delta_x in np.linspace(2.3, 0, 20, endpoint=False):
    draw_section(delta_x=delta_x)
    camera.snap()
draw_section(delta_x=1e-7)
camera.snap()
animation = camera.animate()
Рис. 15.6: Секущая стремится к касательной
Про касательную можно думать так. Представьте себе, что график на рис. 15.5 вблизи точки вырезан из фанеры — вернее, то, что находится над графиком — это кусок фанеры, а то, что под графиком, мы отрезали лобзиком (ровно по графику). Теперь можно взять недлинную линейку и приложить её к графику в точке как можно плотнее. Тогда линейка пройдёт ровно вдоль касательной, см. рис. 15.7.
Нарисован график функции, на горизонтальной оси отмечена точка x_0
и соответствующая точка на графике функции, вблизи точки x_0 график
похож на параболу с ветвями вверх, заштрихована область сверху от
графика, снизу в точке (x_0, f(x_0)) к графику приложена линейка
Рис. 15.7: Нахождение касательной с помощью линейки.

Замечание 2. На уроках геометрии в школе обсуждается касательная к окружности, и определяется она как прямая, имеющая с окружностью единственную общую точку. Непосредственный перенос этого определения на случай функций не работает: касательная может пересекать график в нескольких точках, см. рис. 15.8, и даже в бесконечном числе точек (такой пример будет обсуждаться на семинарах). Однако, геометрически касательная к окружности очень похожа на касательную к графику функции, и может быть получена схожей процедурой: если вы возьмёте две точки на окружности и проведёте через них прямую, а потом начнёте приближать одну точку к другой, то эта прямая будет «стремиться» к касательной.

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 draw_section(x0=1, delta_x=2.3):
    from sympy import Symbol, lambdify, solve
    X = np.linspace(-4, 4, 200)
    x = Symbol('x')
    x0 = -0.3

    def f(x):
        return (x - 1) * x * (x + 1) * (x + 2)

    def deriv(f):
        return lambdify(x, f(x).diff(x))

    def tang(f, x0, x):
        return deriv(f)(x0) * (x - x0) + f(x0)

    plt.plot(X, f(X))
    plt.plot(X, tang(f, x0, X))
    for x_isec in solve(tang(f, x0, x) - f(x), x):
        plt.plot([x_isec], [f(x_isec)], 'o', color='C1')



    ob.center_spines(grid=False, minor_ticks=False)
    ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
                  xlabel="x", ylabel="y", axlabelshift=1.3) 
draw_section()
Рис. 15.8: В отличие от касательной к окружности, касательная к графику функции может иметь больше одной точки пересечения с графиком

15.2.3Производная как функция

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

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

Рассмотрим, например, график, изображенный на рис. 15.9 сверху, и прикинем, чему равна производная в отмеченных точках.

Сверху нарисовн график, похожий на стандартную параболу. Отмечены
точки x1=-2, x2=-1, x3=0, x4=1, x5=2 и проведены касательные в
соответствующих точках. Снизу нарисован график, похожий на прямую
y=2x.
Рис. 15.9: Связь графика функции с графиком касательной.
В точке функция убывает, равно как и в точке . Но если посмотреть на касательные в этих точках, видно, что в функция убывает быстрее, чем в касательная ближе к вертикальной, график более крутой, чем в ), то есть . Можно отметить на графике касательной две точки: они обе должны быть ниже горизонтальной оси, и точка, соответствующая , ниже, чем та, которая соответствует . Теперь посмотрим на точку . В ней касательная горизонтальна. Выражаясь динамическим языком, это момент разворта: левее мы двигались вниз (функция убывала), в момент времени на мгновение остановились и потом стали двигаться вверх. Мгновенная скорость в точке равна нулю. Это значит, что соответствующая точка на графике касательной будет лежать на горизонтальной оси. Наконец, можно посмотреть на точки и . Мы видим, что в обоих точках функция возрастает, но в возрастает быстрее, чем в — график со временем становится начинает расти круче. Это означает, что производная в точке больше производной в , и это также нужно отразить на графике производной. Получается кривая, похожая на изображенную на рисунке 15.9 внизу.

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

График, который мы нарисовали, похож на параболу, график функции . Давайте найдём её производную, пользуясь опредлением:

Точка произвольная, можно заменить её просто на и записать . Скорее всего, вы помните эту формулу из школьного курса. Таким образом, график производной — это прямая линия. И она ведёт себя именно так, как мы нарисовали!

15.3Существование производной

15.3.1Дифференцируемость и непрерывность

Всякий раз, когда мы видим определение, заданное с помощью предела, мы должны задать вопрос: а всегда ли существует этот предел? Как правило, ответ: «не всегда». Это относится и к производной.

Определение 3. Если у функции существует производная в точке , функция назыается дифференцируемой в этой точке.

Что может помешать функции быть дифференцируемой? Много что.

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

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

Теорема 1. Если функция дифференцируема в точке , то она непрерывна в этой точке.

Доказательство. Пусть мы знаем, что производная существует, то есть существует предел
Чтобы доказать непрерывность функции в точке , нужно изучить предел , или, что то же самое,
Преобразуем выражение под знаком предела. Во-первых, вычтем и добавим :
Теперь возьмём первые два слагаемые и умножим и поделим их на (под знаком предела не может обращаться в ноль, поэтому операция корректна):
Теперь заметим, что выражение стремится к при , стремится к нулю, значит, их произведение стремится к . Предел второго слагаемого, числа , равен ему самому (это константа, не зависящая от ). Значит, предел всего выражения равен , то есть . Значит
и функция непрерывна в точке .

15.3.2Точки изломов

Итак, чтобы быть дифференцируемой в некоторой точке, функция должна быть по меньшей мере непрерывной в этой точке. Но достаточно ли этого? Оказывается, нет.

Пример 1. Рассмотрим функцию , см. рис. 15.10.
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

x = np.linspace(-4, 4, 200)
plt.plot(x, np.abs(x))

ob.center_spines(grid=False, minor_ticks=False)
ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 + 1, ymax=2.3 + 1, 
              xlabel="x", ylabel="y", axlabelshift=1.3) 
Рис. 15.10: График функции .
Есть ли у неё производная в точке ? Давайте найдём предел:
Модуль раскрывается по-разному в зависимости от знака . Как мы обсуждали выше (см. замечание 1), не обязана быть положительной, и нужно рассмотреть два случая. Если , выражение под знаком предела превращается в 1, то есть
Для отрицательных модуль раскрывается со знаком минус, и дробь равна . Значит,
Таким образом, при приближении к нулю с разных сторон, функция стремится к разным значениям, и общего предела нет. Функция не дифференцируема в точке .

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

15.3.3Вертикальные касательные

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

Пример 2. Рассмотрим функцию . Попробуем построить касательную в точке . На анимации на рис. 15.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 replace(lst, dct):
    return (dct.get(x, x) for x in lst)

def draw_section(x0=1, delta_x=2.3):
    X = np.linspace(-5, 4, 200)
    x = x0 + delta_x

    def f(x):
        return np.sign(x - 1) * (np.abs(x - 1) ** (1. / 3))

    k = (f(x) - f(x0)) / delta_x

    plt.plot(X, f(X), color='C0', label='$y=f(x)$')
    plt.plot([x0, x], [f(x0), f(x)], 'o', color='C1')
    plt.plot(X, k * (X - x0) + f(x0), '-', color='C1')
    plt.yticks([0], [''])
    plt.xticks([0], [''])

    ob.center_spines(grid=False, minor_ticks=False)
    ob.settle_axes(xmin=-4.2, xmax=4.2, ymin=-2.3 , ymax=2.3, 
                  xlabel="x", ylabel="y", axlabelshift=1.3) 
fig = plt.figure()
camera = Camera(fig)

for delta_x in np.linspace(2.3, 0, 20, endpoint=False):
    draw_section(delta_x=delta_x)
    camera.snap()
draw_section(delta_x=1e-7)
camera.snap()
animation = camera.animate()
Рис. 15.11: Вертикальная касательная

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

15.4Касательные и линейные приближения

15.4.1Формулировка и иллюстрация

По своему смыслу, касательная — это такая прямая, которая проходит вблизи графика функции (что, собственно, и означает «касается»). Чтобы придать этому аккуратный смысл, сформулируем такое утверждение.

Утверждение 1. Функция дифференцируема в точке тогда и только тогда, когда существует такое число и такая функция , определенная в проколотой окрестности нуля, и стремящаяся к нулю при , что справедливо равенство
В этом случае .

Прежде, чем приступить к доказательству, давайте обсудим, что всё это значит. Что означает условие (15.3)? С помощью замены , его можно переписать в таком виде:

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

Таким образом, равенство (15.4) записывается в виде:

Если бы в нём не было второго слагаемого, это бы просто означало, что функция линейна и её график совпадает с касательной. Второе слагаемое, показывает, на сколько сильно график функции отклоняется от касательной, см. рис. 15.12.
Нарисован график функции, на горизонтальной оси отмечены точки x_0
и x, проведена касательная в точке x_0, она обозначена как y=l(x). На вертикальной отмечены точки f(x_0), l(x) и f(x). Отмечено, что расстояние по вертикали между f(x) и l(x) равно alpha(x-x_0) (x-x_0)
Рис. 15.12: Отклонение графика функции от касательной
Утверждение, которое мы сейчас рассматриваем, говорит, что это отклонение становится маленьким, если маленькое — но не просто маленьким, а «маленьким по сравнению с ». Действительно, если вернуться к выражению (15.3), в правой части мы видим три слагаемых: , и . Второе и третье слагаемые оба становятся маленькими при маленьких . Но при этом второе слагаемое пропорционально , а третье — уменьшается быстрее, чем . Например, если , выражение всегда ровно в десять раз меньше , а выражение при уменьшении становится в десять, потом в сто, потом в тысячу раз меньше — и так во сколько угодно раз меньше.

Почему это важно? Давайте посмотрим на график какой-нибудь функции вблизи фиксированной точки, см. рис. 15.13.

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 sympy import Symbol, lambdify, solve
from itertools import zip_longest

def f(x):
    return x ** 2

def deriv(f):
    return lambdify(x, f(x).diff(x))

def tang(f, x0, x):
    return deriv(f)(x0) * (x - x0) + f(x0)

x = Symbol('x')

scales = [(2, 2), (1, 1), (0.5, 0.5), (0.1, 0.1), (None, None)]
x0 = 1

for i, ((deltax, deltay), 
     (deltax_next, deltay_next)) in enumerate(zip(scales[:-1], 
                                                  scales[1:])):
    plt.subplot(2, 2, i + 1)
    X = np.linspace(x0 - deltax, x0 + deltax, 200)

    plt.plot([x0], [f(x0)], 'o', color='C1')
    plt.plot(X, f(X))
    plt.plot(X, tang(f, x0, X))
    if deltax_next is not None:
        plt.plot([x0 - deltax_next, 
                  x0 - deltax_next, 
                  x0 + deltax_next, 
                  x0 + deltax_next, 
                  x0 - deltax_next], 
                 [f(x0) - deltay_next, 
                  f(x0) + deltay_next, 
                  f(x0) + deltay_next, 
                  f(x0) - deltay_next, 
                  f(x0) - deltay_next])
    plt.ylim(f(x0) - deltay, f(x0) + deltay)
Рис. 15.13: Увеличение графика функции и касательной вблизи фиксированной точки. На каждом графике мы выбираем область вблизи точки (она нарисована зелёным) и растягиваем её на всю картинку — так получается следующий график.
На первом графике различие между графиком нашей функции и её касательной было хорошо заметно, при каждом увеличении это различие становилось всё меньше и меньше, и на последней картинке настоящий график практически не виден — его полностью загораживает касательная, то есть две кривые почти совпадают. Почему так происходит?

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

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

Но если маленькое, то маленький и эта величина стремится к нулю! Таким образом, результат, который мы видим на рис. 15.13, не является чем-то удивительным — в нём вся суть понятия касательной, и на самом деле вся суть идеи дифференцируемости: вблизи фиксированной точки дифференцируемая функция очень близка к линейной функции, задающей касательную в этой точке.

15.4.2Доказательство утверждения о линейном приближении

Доказательство утверждения 1. Нам нужно доказать эквивалентность двух утверждений:
  • функция дифференцируема в точке ;
  • существует представление (15.3), которое говорит о том, что функция хорошо приближается некоторой линейной функцией в окрестности точки .

Из дифференцируемости следует линейное приближение. Пусть функция дифференцируема в точке . Положим и

В этом случае представление (15.3) соблюдается (я просто выразил из него), и содержательным является утверждение, что при . Докажем его:
Мы воспользовались определением производной, теоремой о пределе суммы и тем фактом, что мы сами выбрали .

Из линейного приближения следует дифференцируемость. Наборот, пусть теперь известно, что представление (15.3) верно для какого-то и , причём . Докажем, что функция дифференцируема в точке и . Из (15.3) следует, что

Перенесём в левую часть и перейдём к пределу при . Имеем:
Мы воспользовались тем фактом, что при и пределом суммы. Теперь в левой части стоит определение производной функции в точке , а справа . Значит, производная существует и равна .

Замечание 3. Можно доопределить в нуле нулём: тогда эта функция будет непрерывной в нуле, что полезно для некоторых приложений.

15.5Заключение

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