Это же элементарно, Ватсон?

Какие функции принято называть элементарными и почему? И при чём тут Ватсон? Разберёмся со всем по порядку. Обещаю, будет понятно и интересно, хоть и не совсем элементарно.

Когда я был школьником, то моим хобби была охота за функциями, для того чтобы рисовать на миллиметровке их графики, собирая своеобразную коллекцию. Тогда я был вооружён мощным оружием: калькулятором МК-52. До компьютера с графическим, а не текстовым дисплеем (ZX-Spectrum + домашний телевизор), нам всем ещё надо было дорасти, и мне, и доступным мне компьютерам.

Красавец со стековым программированием, непонятными для школьника значками и смешным морганием дисплея.

Красавец со стековым программированием, непонятными для школьника значками и смешным морганием дисплея.

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

cc12948cf0ae0d203bbe3ea65b782e90.jpeg

Содержание явно не выглядело элементарным. Но вот что было интересно: всë, что я находил в справочнике, можно было составить из функций, доступных на калькуляторе. Присмотревшись к клавиатуре, мы найдём там, кроме «бухгалтерской» арифметики — сложения, вычитания, умножения и деления, ряд функций, вот они, жёлтенькие:

5f835c4aab0c2ae13c47414341a9fe85.png

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

* * *

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

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

\mathbf{Arith} = S\left( \{\mathrm{const}\},\ \{+,\ -,\ \times, \ \div \} \right).\\

Первый элемент в паре задаёт множество функций системы. В случае \mathbf{Arith} это единственная функция, которая возвращает указанную константу для любых аргументов: \mathrm{const}\, a = x \mapsto a. На калькуляторе она соответствует кнопкам с цифрами. Второе множество определяет набор операторов, позволяющих комбинировать функции, создавая из них новые функции. Например, сложение функций можно определить так: f + g = x \mapsto f(x) + g(x). Прочие арифметические операторы над функциями определяются подобным образом.

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

Теперь добавим к константе в системе арифметических функций простейшую зависимость, которой у нас ещё не было — тождественное преобразование: \mathrm{id} = x \mapsto x. Эта функция ничего не делает и кажется абсолютно бесполезной. Но обратите внимание, на выделенном мною блоке клавиатуры калькулятора, над клавишей с нулём синим цветом написано НОП. По существу, это и есть тождественное преобразование для которого создатели калькулятора выделили целую команду.

Из функций \mathrm{id} и \mathrm{const} уже можно собрать произвольную линейную функцию:

\mathrm{const}\, a \times \mathrm{id} + \mathrm{const}\, b  = x \mapsto ax + b.

Сумма, разность и композиция любых линейных функций оставляют их линейными, образуя полную и замкнутую систему линейных функций:

\mathbf{Lin} = S(\{\mathrm{id}, \mathrm{const}\},\ \{+,\ -,\ \circ \})^*.

Здесь появились два новых символа — кружочек и звёздочка. Кружочек обозначает композицию функций, или подстановку: f \circ g = x \mapsto f(g(x)),, а звёздочка символизирует операцию замыкания системы. Дело в том, что хотя \mathrm{id} и \mathrm{const} сами являются линейными, это далеко не все мыслимые линейные функции. Однако все возможные арифметические комбинации этих базовых функций порождают всё множество линейных функций. Замыкание и обозначает множество всех комбинаций базовых функций с помощью перечисленных операций.

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

К линейным функциям от x относятся, например, такие:

2x,\ 1.45x+67,\ 2-x

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

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

\mathbf{Poly} = S(\{\mathrm{id}, \mathrm{const}\},\{ +,\ -,\ \times,\ \circ \})^*.

Графики полиномов — всевозможные параболы, уже могут быть достаточно интересными. Они могут аппроксимировать функции, как степенные ряды, или как полиномы Чебышёва, красиво интерполировать точки. А в параметрических координатах они могут использоваться как кривые Безье и ими уже можно нарисовать хоть зайца из «Ну погоди», хоть собственный портрет. Впрочем, правильную окружность одними полиномами не нарисовать.

Наконец, добавив к полиномиальным функциям деление, мы получим систему рациональных функций, отношений двух многочленов:

\mathbf{Rat} = S(\{\mathrm{id}, \mathrm{const}\},\ \{+,\ -,\ \times,\ \div,\ \circ \})^*.

Рисовать их графики поначалу интересно из-за разрывов и асимптот, но быстро становится ясно, что ничего принципиально нового по сравнению в полиномами они не предлагают. Вот несколько примеров рациональных функций от x:

8,\ 2x,\ x^8 - 6x+1,\ \frac{1}{x},\ \frac{1+x}{1-x^2},\ \frac{1+x-2x^6}{1-x^2}

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

\begin{align*}   &x^a = e^{a\ln x},\quad a^x = e^{x\ln a},\\   &\log_xa = \frac{\ln a}{\ln x},\quad \log_ax = \frac{\ln x}{\ln a} \end{align*}

Это значит, что квадратный корень, или 10^x, вместе с десятичным логарифмом мы уже имеем. Кроме того, в вещественных числах нам становятся доступны гиперболические функции:

\cosh x = \frac{e^x + e^{-x}}{2},\quad   \sinh  x= \frac{e^x - e^{-x}}{2},\quad   \tanh x = \frac{e^x + e^{-x}}{e^x - e^{-x}}.

Обратные гиперболические функции можно выразить через логарифмы:

\begin{eqnarray*}   &\mathrm{arch}\, x = \ln\left(a + \sqrt{x^2-1}\right),\quad   \mathrm{arsh}\, x = \ln\left(a + \sqrt{x^2+1}\right),\\   &\mathrm{arth}\, x = \frac12\ln\left(\frac{1+x}{1-x}\right). \end{eqnarray*}

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

\mathbf{Elem} = S(\{\mathrm{id}, \mathrm{const},\exp,\ln\},\{+,-,\times,\div, \circ \})^*.

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

Естественным образом, все указанные нами системы образуют иерархию, которой мы, в общих чертах, следуем, изучая школьную программу математики, переходя из первого класса к одиннадцатому:

\mathbf{Arith} \subset \mathbf{Lin} \subset   \mathbf{Poly} \subset   \mathbf{Rat} \subset \mathbf{Elem}.

Впервые подобную классификацию (только гораздо формальнее, чем мы) произвёл Жозеф Лиувилль в первой половине XIX века. Позже, уже в XX веке, ещё более формально множество элементарных функций определили Готфри Харди и упомянутый в заголовке Джордж Невил Ватсон.

Но почему же все они остановились на этом минимальном наборе, не включив него, например, крайне полезные функции Бесселя, W-функцию Ламберта, или функцию ошибок \mathrm{erf}(x)?

Дело в том, что мы не рассмотрели ещё одну важную операцию, превращающую одну функцию в другую: взятие производной. Все перечисленные нами системы, остаются замкнутыми, если мы добавим в них оператор дифференцирования \partial. В том числе, и система элементарных функций^.

\mathbf{Elem} = S(\{\mathrm{id}, \mathrm{const},\exp,\ln\},\{+,-,\times,\div, \circ,\partial \})^*.

Действительно, любая производная любой элементарной функции остаётся элементарной. Интегрирование таким свойством уже не обладает: очень легко найти элементарную функцию, чья первообразная элементарной уже не будет. Однако никакая функция из \mathbf{Elem} не требует для своего определения интегрирования, все они могут быть выражены как конечная композиция элементарных функций и операций.

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

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

Я не случайно начал рассказ с отсылки к калькулятору. Сейчас результаты работ Лиувилля и его последователей используются при разработке систем символьной алгебры, символьного дифференцирования, интегрирования и решения дифференциальных уравнений. И вот тут-то языковая модель функции становится как нельзя кстати!

В завершение я хочу сделать ещё одно замечание. Хорошо известны со школы свойства экспоненты и логарифма:

\begin{eqnarray*}   e^{x+y} = e^xe^y, && \ln(xy) = \ln{x}+\ln{y}\\   e^{-x}=\frac{1}{e^x}, &&  \ln \frac1{x} = -\ln{x}\\   e^0 = 1, && \ln 1 = 0. \end{eqnarray*}

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

* * *

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

Так что всем, дочитавшим, делаю подарочек, построенный исключительно элементарными методами:

a57856a471260b47172464da14405809.png

using Plots;

bonne(phi,lam,t) = let
    ϕ₀ = 83/180*π
    ρ  = cot(ϕ₀) - ϕ₀ - ϕ(t)
    E  = λ(t)*cos(ϕ(t))/ρ
    (ρ*sin(E), -cot(ϕ₀) + ρ*cos(E))
end;

ϕ(t) = 0.9*pi/2*cos(50t)*(cos(51t))+0.12;
λ(t) = 0.9*pi*sin(50t)*(cos(51t));

plot(legend=false,size=(550,500),bg="black",lw=0.75,la=0.95);
plot!([bonne(ϕ,λ,t + π/2) for t in 0:0.001:π]);
plot!([bonne(ϕ,λ,t - π/2) for t in 0:0.001:π],lc="orangered");
png("bonne.png");

Здесь используется проекция Боннэ от эпициклоиды на поверхности сферы.

© Habrahabr.ru