Область определения и множество значений функции 🎯
Представь: ты обучаешь модель, всё идёт гладко, loss честно падает первые пятьдесят батчей — и вдруг на экране появляется nan. Не ошибка, не exception, а тихое, ничего не объясняющее nan, которое за один шаг превращает в мусор все веса сети. Ты лезешь разбираться и через час находишь причину: в одном батче оказался признак «доход» со значением $0$, а препроцессинг вызывал np.log(income). Логарифм нуля не существует — и вместо ошибки Python молча выдал -inf, которое дальше растворилось по всем вычислениям.
Это и есть история про область определения, только рассказанная на языке продакшена. Каждая функция — будь то формула из учебника или строчка кода — работает не с любыми входами. У неё есть «зона комфорта»: набор значений $x$, которые можно подставить и получить осмысленный результат. Выйти за эту зону — и вместо числа получаешь ошибку, NaN, Inf или бессмысленный ответ. Мы называем эту зону областью определения. А набор всех значений, которые функция вообще способна вернуть на выходе, называется множеством значений — и знать его не менее важно: например, если ты видишь, что модель предсказывает вероятность $1.3$, значит где-то в пайплайне сломалась математика, потому что вероятность физически не может выйти за пределы $[0;1]$.
Давай разберёмся, как находить оба этих множества для любой функции: дробей, корней, логарифмов и их комбинаций. Заодно посмотрим, почему у сигмоиды на выходе никогда не будет ровно $0$ или ровно $1$, почему softmax можно честно интерпретировать как распределение вероятностей, и почему грамотное понимание ОДЗ экономит часы отладки нейросетей.
План урока простой — мы последовательно разберём главные источники «взрывов» в математике:
- деление на ноль,
- чётный корень из отрицательного числа,
- логарифм от неположительного числа,
- что делать, когда таких условий сразу несколько,
- и, наконец, как искать множество значений — то есть весь диапазон возможных выходов функции.
История: откуда это взялось?
Долгое время — вплоть до XVIII века — под «функцией» математики понимали красивую аналитическую формулу: полином, синус, экспоненту. Считалось, что раз есть формула, то функция определена «везде, где формула имеет смысл», и никто особо не формализовал, что это значит. Леонард Эйлер оперировал функциями свободно и интуитивно, не задаваясь вопросом о строгих границах их существования — для практических задач того времени этого хватало.
Переломный момент случился в 1837 году, когда немецкий математик Петер Густав Лежён Дирихле предложил определение, которое используется в математике до сих пор: функция — это произвольное соответствие между двумя множествами, а вовсе не обязательно формула. Именно Дирихле привёл знаменитый пример функции, которая равна $1$ для рациональных чисел и $0$ для иррациональных — она не задаётся ни одной «красивой» формулой, но остаётся полноценной функцией с чётко определённой областью. С этого момента вопрос «а где вообще определена эта функция?» стал не факультативным, а обязательной частью работы с любой функцией.
В XX веке группа математиков под псевдонимом Николя Бурбаки довела эту идею до предела строгости: функция стала формально определяться как тройка из множества-области определения, множества-области значений и правила соответствия между ними — то есть область определения оказалась не «довеском», а частью самого определения функции. Сегодня этот же принцип живёт в программировании: когда ты объявляешь функцию def f(x: PositiveFloat) -> float, ты буквально описываешь её область определения через типы. ОДЗ — это не осталась математической архаикой, а стала фундаментом того, как инженеры проектируют надёжный код.
Деление на ноль: когда знаменатель обнуляется
Интуитивное объяснение
Представь, что ты делишь пиццу поровну между друзьями. Между $4$ друзьями — по четверти каждому. Между $1$ другом — вся пицца ему. А теперь скажи: как разделить пиццу между нулём людей? Вопрос не имеет ответа — не потому что ты плохо считаешь, а потому что сама операция «раздели на группу людей, которых нет» бессмысленна. Именно поэтому деление на $0$ не определено: ни одно число, умноженное на $0$, не даёт что-то, кроме $0$, а значит обратной операции не существует.
Функция, в записи которой есть дробь $\frac{p(x)}{q(x)}$, «падает» ровно там, где знаменатель $q(x)$ обращается в нуль. Всё остальное разрешено.
Определение: Если функция задана выражением, содержащим дробь $\dfrac{p(x)}{q(x)}$, то её область определения — это все $x$, при которых знаменатель не равен нулю: $q(x) \neq 0$.
Примеры с подробным разбором
Пример 1 (простой): $f(x) = \dfrac{5}{x - 4}$.
Решение:
Шаг 1: Знаменатель — это $x - 4$. Он не должен быть равен нулю.
Шаг 2: Решаем $x - 4 \neq 0 \Rightarrow x \neq 4$.
Ответ: $D(f) = (-\infty; 4) \cup (4; +\infty)$.
Пример 2 (средний): $f(x) = \dfrac{x + 1}{x^2 - 5x + 6}$.
Разберём по шагам — знаменатель тут уже квадратный трёхчлен, «в лоб» его не приравняешь к нулю без разложения.
Решение:
Шаг 1: Раскладываем знаменатель на множители. Ищем корни $x^2 - 5x + 6 = 0$ через теорему Виета: сумма корней $= 5$, произведение $= 6$. Подходят $x = 2$ и $x = 3$: действительно, $2+3=5$, $2 \cdot 3 = 6$.
Шаг 2: Значит $x^2 - 5x + 6 = (x-2)(x-3)$, и знаменатель равен нулю при $x = 2$ или $x = 3$.
Шаг 3: Исключаем обе точки из числовой прямой.
Ответ: $D(f) = (-\infty; 2) \cup (2; 3) \cup (3; +\infty)$.
Пример 3 (сложный, ловушка): $f(x) = \dfrac{x^2 - 9}{x^3 - 9x}$.
Вот здесь кроется одна из самых коварных ошибок в этой теме, и её стоит разобрать внимательно.
Решение:
Шаг 1: Раскладываем знаменатель: $x^3 - 9x = x(x^2 - 9) = x(x-3)(x+3)$.
Шаг 2: Знаменатель равен нулю при $x = 0$, $x = 3$ или $x = -3$ — все три точки нужно исключить.
Шаг 3: А теперь соблазн: заметим, что числитель тоже раскладывается как $x^2 - 9 = (x-3)(x+3)$, и дробь сокращается:
$$f(x) = \frac{(x-3)(x+3)}{x(x-3)(x+3)} = \frac{1}{x}$$Если бы ты искал ОДЗ уже после сокращения, ты бы увидел просто $\frac{1}{x}$ и написал $D(f) = (-\infty;0) \cup (0;+\infty)$ — и это была бы ошибка! Точки $x = 3$ и $x = -3$ обязаны остаться исключёнными, потому что в исходном выражении при этих $x$ знаменатель равен нулю, даже если после сокращения это уже незаметно.
Ответ: $D(f) = (-\infty; -3) \cup (-3; 0) \cup (0; 3) \cup (3; +\infty)$.
Почему это важно
В коде это происходит буквально каждый день. Библиотеки вроде pandas и NumPy не «упрощают» дроби, как ты в тетради, — но они точно так же тихо ломаются на скрытых нулях в знаменателе, например при batch-нормализации, где нужно делить на стандартное отклонение $\sigma$ признака внутри батча. Если в батче все значения признака одинаковы, $\sigma = 0$, и вместо ошибки ты получаешь inf, который дальше «отравляет» градиенты. Именно поэтому в реальных формулах batch normalization в знаменателе всегда стоит $\sigma + \varepsilon$, где $\varepsilon$ — крошечная константа вроде $10^{-8}$: инженеры сознательно сдвигают область определения, чтобы избежать деления на ноль даже в редких случаях.
Корень чётной степени: почему нельзя уходить в минус
Интуитивное объяснение
Спроси себя: какое вещественное число, если его умножить само на себя, даст $-9$? Перебери положительные — квадрат положительный. Перебери отрицательные — квадрат снова положительный (минус на минус даёт плюс). Ноль в квадрате — ноль. Ни один вариант не даёт отрицательное число. Значит среди вещественных чисел просто не существует такого $t$, что $t^2 = -9$ — а значит и $\sqrt{-9}$ не существует (в рамках вещественных чисел; комплексные числа с их $i = \sqrt{-1}$ — отдельная и очень интересная история, но не в этом курсе).
Это верно для любого чётного показателя корня — квадратного, четвёртого, шестого и так далее: возведение в чётную степень никогда не даёт отрицательное число, поэтому и обратная операция — извлечение чётного корня — определена только для неотрицательных чисел. С нечётными корнями ($\sqrt[3]{-8} = -2$, например) такой проблемы нет — они прекрасно работают и с отрицательными числами, поэтому в этом уроке речь только про чётные степени корня.
Определение: Выражение $\sqrt[2n]{g(x)}$ (корень чётной степени) определено тогда и только тогда, когда подкоренное выражение неотрицательно: $g(x) \geq 0$.
Примеры с подробным разбором
Пример 1 (простой): $g(x) = \sqrt{x - 5} + 3$.
Решение:
Шаг 1: Подкоренное выражение должно быть $\geq 0$: $x - 5 \geq 0$.
Шаг 2: $x \geq 5$.
Ответ: $D(g) = [5; +\infty)$.
Пример 2 (средний): $g(x) = \sqrt{16 - x^2}$.
Решение:
Шаг 1: Требуем $16 - x^2 \geq 0$.
Шаг 2: Переносим: $x^2 \leq 16$, значит $-4 \leq x \leq 4$ (по свойству квадратного неравенства: $x^2 \leq a^2 \Leftrightarrow -a \leq x \leq a$ при $a > 0$).
Ответ: $D(g) = [-4; 4]$.
Пример 3 (сложный): $g(x) = \sqrt{\dfrac{x - 2}{x + 1}}$.
Здесь подкоренное выражение — само по себе дробь, и её знак зависит от $x$ нетривиально. Разберём по шагам методом интервалов.
Решение:
Шаг 1: Нужно, чтобы $\dfrac{x-2}{x+1} \geq 0$, при этом сразу учитываем, что знаменатель $x + 1 \neq 0$, то есть $x \neq -1$.
Шаг 2: Отмечаем на числовой прямой критические точки: $x = -1$ (выколотая — там знаменатель обнуляется) и $x = 2$ (нужно проверить отдельно — там числитель обнуляется).
Шаг 3: Определяем знак дроби на каждом интервале:
- при $x < -1$: числитель $x - 2 < 0$, знаменатель $x + 1 < 0$, дробь $= \frac{-}{-} > 0$ — подходит;
- при $-1 < x < 2$: числитель $< 0$, знаменатель $> 0$, дробь $= \frac{-}{+} < 0$ — не подходит;
- при $x > 2$: числитель $> 0$, знаменатель $> 0$, дробь $= \frac{+}{+} > 0$ — подходит;
- при $x = 2$: дробь равна $0$, а $0 \geq 0$ — точка входит в ответ.
Ответ: $D(g) = (-\infty; -1) \cup [2; +\infty)$.
Почему это важно
Формула среднеквадратичного отклонения выглядит как $\sigma = \sqrt{E[X^2] - (E[X])^2}$. Математически выражение под корнем всегда неотрицательно — это доказывается через неравенство Йенсена. Но в реальном коде, когда вычисления идут через числа с плавающей точкой, из-за накопления ошибок округления (так называемая «катастрофическая потеря точности» при вычитании близких чисел) выражение под корнем иногда получается чуть-чуть отрицательным — вроде $-10^{-15}$ вместо честного нуля. И тогда np.sqrt() вернёт nan, хотя математически такого быть не должно. Это одна из классических ловушек численных методов, и понимание ОДЗ корня помогает быстро опознать причину такого бага.
Логарифм: аргумент должен быть строго положительным
Интуитивное объяснение
Логарифм отвечает на вопрос «в какую степень нужно возвести основание, чтобы получить это число?». Спроси: в какую степень нужно возвести $2$, чтобы получить $-8$? Переберём: $2^1=2$, $2^2=4$, $2^{-1}=0.5$, $2^{-3}=0.125$ — при любой вещественной степени $2^y$ остаётся строго положительным числом, оно никогда не станет ни отрицательным, ни нулём. Поэтому у $-8$ и у $0$ просто нет логарифма ни по какому положительному основанию — вопрос сформулирован некорректно, ответа не существует.
Определение: Выражение $\log_a g(x)$ (в частности, натуральный логарифм $\ln g(x)$) определено при условии, что основание $a > 0$, $a \neq 1$ (это требование к самому основанию, обычно оно константа), а аргумент строго положителен: $g(x) > 0$.
Примеры с подробным разбором
Пример 1 (простой): $h(x) = \ln(x + 7)$.
Решение:
Шаг 1: Аргумент логарифма должен быть $> 0$: $x + 7 > 0$.
Шаг 2: $x > -7$.
Ответ: $D(h) = (-7; +\infty)$.
Пример 2 (средний): $h(x) = \ln(x^2 - 2x - 15)$.
Решение:
Шаг 1: Раскладываем трёхчлен на множители: по теореме Виета сумма корней $= 2$, произведение $= -15$, подходят $x = 5$ и $x = -3$ (действительно $5 + (-3) = 2$, $5 \cdot (-3) = -15$). Значит $x^2 - 2x - 15 = (x-5)(x+3)$.
Шаг 2: Нужно $(x-5)(x+3) > 0$. Парабола направлена вверх, поэтому выражение положительно вне промежутка между корнями.
Ответ: $D(h) = (-\infty; -3) \cup (5; +\infty)$.
Пример 3 (сложный, вложенные логарифмы): $h(x) = \ln(\ln(x - 1))$.
Разберём по шагам: тут два логарифма подряд, и условие нужно проверить дважды.
Решение:
Шаг 1: Сначала должен существовать внутренний логарифм: $x - 1 > 0 \Rightarrow x > 1$.
Шаг 2: Но этого мало! Внешний логарифм требует, чтобы его аргумент был положителен, а его аргумент — это $\ln(x-1)$. Значит нужно $\ln(x - 1) > 0$.
Шаг 3: Вспоминаем свойство: $\ln(t) > 0 \Leftrightarrow t > 1$ (потому что $\ln(1) = 0$, а логарифм — возрастающая функция). Значит $x - 1 > 1 \Rightarrow x > 2$.
Шаг 4: Условие $x > 2$ автоматически удовлетворяет и первому условию $x > 1$, так что оно «главное».
Ответ: $D(h) = (2; +\infty)$.
Почему это важно
Функция потерь для классификации (cross-entropy) считается как $L = -\ln(p)$, где $p$ — предсказанная моделью вероятность правильного класса. Если модель (из-за особенностей активации или численного андерфлоу) выдаёт $p = 0$, то $\ln(0)$ не существует — на практике это -inf, и обучение мгновенно ломается. Именно поэтому фреймворки вроде PyTorch и TensorFlow либо «зажимают» вероятность в диапазон $[\varepsilon; 1-\varepsilon]$ перед логарифмированием, либо (что элегантнее) считают cross-entropy напрямую по логитам через численно устойчивый log-sum-exp трюк, вообще избегая явного вызова логарифма от вероятности, которая теоретически может оказаться на границе ОДЗ.
Комбинированные ОДЗ и другие ограничения
Интуитивное объяснение
Представь функцию как конвейер: сначала данные проходят через одну операцию, потом через другую. Если на конвейере стоит и деление, и корень, и логарифм — «сломаться» можно на любом из этапов. Чтобы найти общую область определения, нужно выписать условие для каждого рискованного места по отдельности, а затем найти пересечение всех условий — то есть те $x$, которые проходят проверку сразу везде.
Определение: Если функция содержит несколько операций с ограниченной областью определения, то итоговая область определения — это пересечение областей определения по каждому условию: $D(f) = D_1 \cap D_2 \cap \ldots \cap D_n$.
Кроме дробей, корней и логарифмов, ограничения на аргумент есть ещё у нескольких стандартных функций — держи их под рукой:
- $\text{tg}(x)$: не определён при $x = \dfrac{\pi}{2} + \pi n$ (там косинус в знаменателе обнуляется);
- $\text{ctg}(x)$: не определён при $x = \pi n$ (там синус в знаменателе обнуляется);
- $\arcsin(x)$ и $\arccos(x)$: аргумент обязан лежать в $[-1; 1]$ — за пределами этого отрезка ни синус, ни косинус никакого угла не могут равняться такому числу.
Примеры с подробным разбором
Пример 1 (простой): $f(x) = \dfrac{1}{\sqrt{x - 3}}$.
Тут спрятана тонкость: корень стоит в знаменателе.
Решение:
Шаг 1: Обычному корню хватило бы условия $x - 3 \geq 0$. Но здесь корень ещё и в знаменателе, а значит он не может быть равен нулю — иначе получится деление на ноль.
Шаг 2: Значит условие ужесточается до строгого неравенства: $x - 3 > 0 \Rightarrow x > 3$.
Ответ: $D(f) = (3; +\infty)$.
Пример 2 (средний): $f(x) = \dfrac{\sqrt{x + 4}}{\ln(6 - x)}$.
Решение:
Шаг 1: Условие для корня в числителе: $x + 4 \geq 0 \Rightarrow x \geq -4$.
Шаг 2: Условие для аргумента логарифма: $6 - x > 0 \Rightarrow x < 6$.
Шаг 3: Условие для знаменателя (сам логарифм не может быть нулём): $\ln(6-x) \neq 0 \Rightarrow 6 - x \neq 1 \Rightarrow x \neq 5$.
Шаг 4: Пересекаем все три условия: $x \in [-4; 6)$, кроме точки $x = 5$.
Ответ: $D(f) = [-4; 5) \cup (5; 6)$.
Пример 3 (сложный): $f(x) = \ln\left(\sqrt{x - 2} - 1\right)$.
Решение:
Шаг 1: Сначала должен существовать внутренний корень: $x - 2 \geq 0 \Rightarrow x \geq 2$.
Шаг 2: Затем аргумент логарифма должен быть строго положителен: $\sqrt{x-2} - 1 > 0 \Rightarrow \sqrt{x - 2} > 1$.
Шаг 3: Обе части неравенства неотрицательны (корень всегда $\geq 0$, справа положительное число), поэтому можно спокойно возвести в квадрат: $x - 2 > 1 \Rightarrow x > 3$.
Шаг 4: Условие $x > 3$ автоматически сильнее, чем $x \geq 2$ из шага 1.
Ответ: $D(f) = (3; +\infty)$.
Почему это важно
Любой пайплайн предобработки данных в ML — это именно такая цепочка операций: нормализация → логарифмирование → извлечение корня из какой-нибудь статистики. Каждый шаг сужает допустимую область, и если ты не проверил её заранее, ошибка вылезет не сразу и не там, где её удобно найти. Хуже того: один-единственный NaN, полученный на одном примере в батче, при обратном распространении ошибки способен «отравить» градиенты для всего батча целиком — не только для проблемного примера, а для всех, потому что они обучаются совместно через общий loss. Именно поэтому в промышленном ML данные валидируют на входе в пайплайн, а не полагаются на то, что где-то в середине что-нибудь красиво упадёт с понятной ошибкой.
Множество значений функции: что функция может вернуть
Интуитивное объяснение
Представь вендинговый автомат с газировкой. Ты можешь нажать любую кнопку — но выдать он способен только то, чем набит: колу, воду, сок. Даже если ты будешь давить на кнопку сто раз, «лимонад с молоком» он не выдаст никогда, потому что такого напитка физически нет внутри. Множество значений функции работает так же: это полный перечень того, что функция вообще способна вернуть, независимо от того, какой вход ты подашь. Сигмоида — это автомат, который никогда не выдаёт число меньше $0$ и больше $1$, сколько бы «денег» (входного $x$) ты в него ни закинул.
Определение: Множеством значений $E(f)$ функции $y = f(x)$ называется множество всех чисел $y$, для каждого из которых найдётся хотя бы одно значение $x \in D(f)$, такое что $f(x) = y$.
Есть три рабочих способа искать $E(f)$:
- Оценка через композицию: если функция — цепочка монотонных операций (прибавили, извлекли корень, умножили), можно последовательно «протащить» неравенство через каждый шаг.
- Выражение $x$ через $y$: решаем уравнение $y = f(x)$ относительно $x$ и смотрим, при каких $y$ у него есть решение (часто через дискриминант).
- Известные ограниченные функции: $\sin, \cos \in [-1;1]$, сигмоида $\in (0;1)$, $\tanh \in (-1;1)$ — такие диапазоны стоит просто помнить.
Примеры с подробным разбором
Пример 1 (простой, метод оценки): $y = -2(x-1)^2 + 5$.
Решение:
Шаг 1: Квадрат любого числа неотрицателен: $(x-1)^2 \geq 0$ при любом $x$.
Шаг 2: Умножаем на $-2$ (знак неравенства переворачивается, так как множитель отрицательный): $-2(x-1)^2 \leq 0$.
Шаг 3: Прибавляем $5$ к обеим частям: $-2(x-1)^2 + 5 \leq 5$.
Шаг 4: Равенство $y = 5$ достигается при $x = 1$ (когда квадрат равен нулю), а при удалении от $x=1$ значение $y$ безгранично убывает.
Ответ: $E(y) = (-\infty; 5]$.
Пример 2 (средний, метод оценки для составной функции): $y = 3 + \sqrt{x - 2}$.
Решение:
Шаг 1: Область определения: $x \geq 2$, поэтому $x - 2 \geq 0$.
Шаг 2: Значит $\sqrt{x-2} \geq 0$, причём при $x=2$ корень равен $0$, а при $x \to +\infty$ корень неограниченно растёт, непрерывно принимая все значения из $[0; +\infty)$.
Шаг 3: Прибавляем $3$ к обеим частям: $y = 3 + \sqrt{x-2} \geq 3$, и при этом $y$ так же непрерывно пробегает всё от $3$ до $+\infty$.
Ответ: $E(y) = [3; +\infty)$.
Пример 3 (сложный, метод дискриминанта): $y = \dfrac{2x + 1}{x^2 + 1}$.
Здесь монотонность не очевидна, поэтому используем более мощный метод — выражаем $x$ через $y$.
Решение:
Шаг 1: Заметим, что $x^2 + 1 > 0$ при любом $x$ (сумма квадрата и единицы всегда положительна), поэтому $D(y) = \mathbb{R}$ — знаменатель никогда не обнуляется.
Шаг 2: Домножаем обе части на знаменатель: $y(x^2+1) = 2x+1$, то есть $yx^2 - 2x + (y - 1) = 0$.
Шаг 3: Если $y = 0$: уравнение превращается в линейное $-2x - 1 = 0 \Rightarrow x = -\frac{1}{2}$ — решение есть, значит $y=0$ достижимо.
Шаг 4: Если $y \neq 0$: это квадратное уравнение относительно $x$. Чтобы вещественный корень существовал, дискриминант должен быть неотрицателен:
$$D = (-2)^2 - 4y(y-1) = 4 - 4y^2 + 4y = 4(-y^2+y+1) \geq 0$$$$\Rightarrow y^2 - y - 1 \leq 0$$Шаг 5: Находим корни уравнения $y^2 - y - 1 = 0$ по формуле дискриминанта: $y = \dfrac{1 \pm \sqrt{1+4}}{2} = \dfrac{1 \pm \sqrt{5}}{2}$. Парабола $y^2-y-1$ направлена вверх, значит неравенство $\leq 0$ выполняется между корнями.
Ответ: $E(y) = \left[\dfrac{1-\sqrt{5}}{2}; \dfrac{1+\sqrt{5}}{2}\right] \approx [-0.618; 1.618]$.
Пример 4 (ML-контекст, ограниченная функция): сигмоида $\sigma(x) = \dfrac{1}{1 + e^{-x}}$.
Решение:
Шаг 1: Область определения: $e^{-x}$ определена и положительна при любом вещественном $x$, значит знаменатель $1 + e^{-x} > 1 > 0$ никогда не обнуляется. $D(\sigma) = \mathbb{R}$.
Шаг 2: Поскольку $e^{-x} > 0$ всегда, знаменатель $1 + e^{-x} > 1$, а значит $\sigma(x) = \dfrac{1}{1+e^{-x}} < 1$ — строго меньше единицы, никогда не равно.
Шаг 3: С другой стороны, $\dfrac{1}{1+e^{-x}} > 0$, потому что и числитель, и знаменатель положительны — значит $\sigma(x) > 0$ строго, никогда не равно нулю.
Шаг 4: При $x \to +\infty$: $e^{-x} \to 0$, значит $\sigma(x) \to 1$ (но не достигает). При $x \to -\infty$: $e^{-x} \to +\infty$, значит $\sigma(x) \to 0$ (но не достигает). Сигмоида непрерывна и монотонно возрастает, значит по теореме о промежуточном значении она принимает каждое число строго между $0$ и $1$ хотя бы один раз.
Ответ: $E(\sigma) = (0; 1)$ — открытый интервал.
Почему это важно
Границы множества значений — это не абстракция для экзамена, а гарантия, на которую опирается вся архитектура нейросети. Именно потому что $E(\sigma) = (0;1)$, выход сигмоиды можно честно интерпретировать как вероятность в задаче бинарной классификации. Именно потому что $E(\tanh) = (-1;1)$ — симметричный относительно нуля диапазон — эта функция активации часто предпочтительнее сигмоиды для скрытых слоёв: выходы центрированы вокруг нуля, что ускоряет сходимость обучения. А когда ты видишь в логах модели предсказанную «вероятность» $1.4$ — ты сразу понимаешь: где-то в коде забыли применить сигмоиду или напутали с формулой, потому что математически такое число просто не может быть в множестве значений вероятностной функции.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Найди область определения функции $f(x) = \dfrac{7}{x+2}$.
Задание 2: Найди область определения функции $f(x) = \sqrt{x - 9}$.
Задание 3: Найди область определения функции $f(x) = \ln(x - 5)$.
Задание 4: Найди область определения функции $f(x) = \dfrac{3}{x-1} + \dfrac{2}{x+4}$.
Задание 5: Найди область определения функции $f(x) = \sqrt{12 - 3x}$.
Задание 6: Найди область определения функции $f(x) = \ln(8 - 2x)$.
Задание 7: Найди множество значений функции $f(x) = x^2 - 6x + 11$.
Задание 8: Найди множество значений функции $f(x) = 5 - x^2$.
Задание 9: Найди область определения и множество значений функции $f(x) = \dfrac{1}{x^2 + 4}$.
Задание 10: Найди область определения и множество значений функции $f(x) = |x - 2| - 3$.
Средние (задания 11-20)
Задание 11: Найди область определения функции $f(x) = \dfrac{x+5}{x^2 - 4x - 5}$.
Задание 12: Найди область определения функции $f(x) = \sqrt{x^2 - 7x + 10}$.
Задание 13: Найди область определения функции $f(x) = \ln(x^2 - 9)$.
Задание 14: Найди область определения функции $f(x) = \dfrac{\sqrt{x+3}}{x-1}$.
Задание 15: Найди область определения функции $f(x) = \dfrac{1}{\sqrt{10 - 2x}}$.
Задание 16: Найди область определения функции $f(x) = \ln(x+4) + \ln(6-x)$.
Задание 17: Найди множество значений функции $y = \sqrt{x-4} + 1$.
Задание 18: Найди множество значений функции $y = -3\sqrt{x+2} + 5$.
Задание 19 (ML-контекст): Инженер применяет к признаку «доход» (в долларах) преобразование $f(x) = \ln(x - 1000)$, чтобы уменьшить скошенность распределения перед подачей в модель. При каких значениях дохода $x$ это преобразование корректно (не даёт ошибки)?
Задание 20: Найди область определения функции $f(x) = \dfrac{3x-2}{\sqrt{x^2-1}}$.
Продвинутые (задания 21-30)
Задание 21: Найди область определения функции $f(x) = \ln\left(\sqrt{x+5} - 2\right)$.
Задание 22: Найди область определения функции $f(x) = \sqrt{\ln x} + \dfrac{1}{x - e}$.
Задание 23: Найди область определения функции $f(x) = \dfrac{1}{x^2-5x+6} + \sqrt{6-x}$.
Задание 24: Найди множество значений функции $y = \dfrac{x^2-1}{x^2+1}$.
Задание 25: Докажи, что множество значений функции $\tanh(x) = \dfrac{e^x - e^{-x}}{e^x+e^{-x}}$ есть интервал $(-1;1)$, и найди $\tanh(0)$.
Задание 26 (ML-контекст): Двухклассовый softmax сводится к $p_1 = \dfrac{e^{z_1}}{e^{z_1}+e^{z_2}}$. Докажи, что $p_1 \in (0;1)$ для любых вещественных $z_1, z_2$, и что $p_1+p_2=1$.
Задание 27: Найди область определения функции $f(x) = \dfrac{\sqrt{4-x^2}}{\ln(x+3)}$.
Задание 28: Найди область определения функции $f(x) = \arcsin(x-2) + \sqrt{x-1}$.
Задание 29: Функция Softplus: $f(x) = \ln(1+e^x)$. Найди область определения и множество значений.
Задание 30: Найди область определения и множество значений функции $f(x) = \dfrac{1}{\sqrt{9-x^2}}$.
Частые ошибки
❌ Ошибка 1: путать условие для корня $\sqrt{g(x)}$ с условием для $x$
Неправильно: Для $\sqrt{x^2}$ писать условие $x \geq 0$.
Правильно: Условие накладывается на подкоренное выражение, а не на $x$: $x^2 \geq 0$ выполняется при абсолютно любом $x$, поэтому $\sqrt{x^2}$ определён на всей числовой прямой (и, кстати, равен $|x|$, а не $x$).
Почему важно: Это одна из самых частых школьных ошибок — механически писать «$\geq 0$ значит икс больше нуля», не глядя, что именно стоит под корнем.
❌ Ошибка 2: писать нестрогое неравенство для корня в знаменателе
Неправильно: Для $\dfrac{1}{\sqrt{x-3}}$ писать условие $x - 3 \geq 0$.
Правильно: Раз корень стоит в знаменателе, он не может равняться нулю — значит условие строгое: $x - 3 > 0$.
Почему важно: $\sqrt{0}=0$, а деление на $0$ запрещено даже если под корнем стоит абсолютно законное неотрицательное число.
❌ Ошибка 3: искать ОДЗ после сокращения дроби
Неправильно: Для $\dfrac{x^2-9}{x^3-9x}$ сначала сократить до $\dfrac{1}{x}$, а потом искать ОДЗ уже у сокращённого выражения.
Правильно: ОДЗ ищется по исходной записи функции, до всех преобразований и сокращений.
Почему важно: Сокращение дроби может «спрятать» точки, где исходное выражение не определено — они остаются исключёнными из области определения, даже если после упрощения это уже незаметно.
❌ Ошибка 4: путать область определения с множеством значений
Неправильно: Говорить «область определения функции $\sigma(x)$ — это $(0;1)$».
Правильно: $(0;1)$ — это множество значений сигмоиды (диапазон выходов $y$), а её область определения — это вся числовая прямая $\mathbb{R}$ (сигмоида принимает любой вещественный вход).
Почему важно: Это два принципиально разных множества — одно про допустимые входы, второе про возможные выходы. Их путают даже на собеседованиях по data science.
❌ Ошибка 5: писать нестрогое неравенство для логарифма
Неправильно: Для $\ln(x)$ писать условие $x \geq 0$.
Правильно: $\ln(0)$ не существует (никакая степень положительного основания не даёт $0$), поэтому условие строго: $x > 0$.
Почему важно: Разница между $\geq$ и $>$ здесь — разница между корректным кодом и NaN в проде.
❌ Ошибка 6: объединять сумму логарифмов до нахождения ОДЗ
Неправильно: Для $\ln(x) + \ln(-x)$ сразу «упростить» до $\ln(x \cdot (-x)) = \ln(-x^2)$ и решать одно условие $-x^2 > 0$.
Правильно: Сначала нужно потребовать выполнения обоих исходных условий по отдельности: $x > 0$ и $-x > 0$ одновременно — а это невозможно ни при каком $x$, значит область определения пуста.
Почему важно: Свойство $\ln a + \ln b = \ln(ab)$ верно только когда оба логарифма уже определены. Если объединить логарифмы раньше, чем проверить исходные условия, можно случайно получить область определения там, где её на самом деле нет — или наоборот, потерять её.
Главное запомнить
✅ $D(f)$ — все допустимые входы $x$ (то, что можно «скормить» функции без ошибки); $E(f)$ — все возможные выходы $y$ (то, что функция способна вернуть).
✅ Дробь: знаменатель $\neq 0$.
✅ Корень чётной степени: подкоренное выражение $\geq 0$; если корень стоит в знаменателе — строго $> 0$.
✅ Логарифм: аргумент строго $> 0$ (основание — константа, $a>0$, $a \neq 1$).
✅ Несколько условий сразу — находи ОДЗ для каждого по отдельности и пересекай ($\cap$) результаты, не пропуская ни одного.
✅ ОДЗ всегда ищи по исходному выражению — до любых сокращений и упрощений.
✅ Для поиска $E(f)$ есть три метода: оценка через монотонную композицию, выражение $x$ через $y$ (часто через дискриминант), и знание готовых диапазонов известных функций.
✅ Ограниченные функции активации (сигмоида, $\tanh$, softmax) имеют строго предсказуемый диапазон — это критично для интерпретации выходов нейросети как вероятностей.
✅ Открытая скобка $($ значит граница не достигается, лишь бесконечно приближается; закрытая $[$ значит граница входит в множество.
✅ В коде запрещённые значения не выдают красивую математическую ошибку — они превращаются в NaN/Inf, которые незаметно расползаются по всем дальнейшим вычислениям.
Связь с другими темами курса
Что нужно было знать до этого урока:
- Понятие функции — что функция ставит в соответствие каждому $x$ ровно одно значение $y$ (урок «Понятие функции»).
- Метод интервалов и решение квадратных неравенств — без него не разобрать примеры вроде $(x-2)(x-3)>0$.
- Теорема Виета и разложение квадратного трёхчлена на множители — постоянно нужны, чтобы найти нули знаменателя или подкоренного выражения.
Что изучить дальше:
- «График функции» — область определения и множество значений видны на графике буквально: по горизонтали и по вертикали соответственно.
- Чётность и нечётность, монотонность функции — свойства, которые тоже формулируются относительно области определения.
- Предел функции и непрерывность — искать предел на границе интервала имеет смысл только если ты точно знаешь, где эта граница находится.
- Построение графика с помощью производной — там ОДЗ становится первым шагом любого полноценного исследования функции.
Где это нужно в жизни:
- 🤖 В ML/AI: домен и диапазон функций активации (сигмоида, $\tanh$, ReLU, softmax) определяют, как ведёт себя нейросеть и что можно сказать про её выходы.
- 📊 В Data Science: предобработка данных — логарифмирование, извлечение корня, нормализация — требует явно проверять область определения признаков перед трансформацией.
- 💻 В программировании: сигнатуры функций и системы типов — это, по сути, формализованная область определения на уровне кода, а исключения вроде
ZeroDivisionErrorилиValueError— сообщение о выходе за её пределы. - 💰 В финансах и аналитике: формулы с делением (доходность, коэффициенты) требуют проверки, что знаменатель (например, начальная сумма инвестиции) не равен нулю.
Интересные факты
💡 Дирихле и первое строгое определение. До 1837 года «функцией» интуитивно называли формулу. Пётр Густав Лежён Дирихле предложил определение через произвольное соответствие между множествами и привёл функцию-индикатор рациональных чисел как пример «законной» функции без единой формулы — она нигде не непрерывна, но её область определения ($\mathbb{R}$) абсолютно чётко очерчена.
💡 NaN и Inf — компьютерный аналог нарушения ОДЗ. Стандарт IEEE 754, по которому работают числа с плавающей точкой в NumPy, PyTorch и вообще почти во всех языках программирования, специально резервирует значения NaN (Not a Number) и Inf именно для представления результатов операций, которые математически не определены: $0/0$, $\sqrt{-1}$ в вещественных числах, $\ln(0)$. Это буквально цифровое воплощение выхода за область определения.
💡 Softmax никогда не бывает «уверен на 100%». При любых конечных входных логитах каждая компонента softmax строго лежит в открытом интервале $(0;1)$ — она никогда не станет ровно $0$ или ровно $1$. Математически это означает, что модель всегда сохраняет хотя бы теоретическую «неуверенность» — что удобно интерпретировать статистически, но иногда неудобно для калибровки при экстремально уверенных предсказаниях.
💡 Слово «домен». Английское «domain» (область определения) и русская калька «домен» (доменное имя сайта, domain-driven design в программировании) восходят к одному латинскому корню «dominium» — «владение, территория». В обоих случаях смысл один: территория, где нечто имеет силу и определено.
Лайфхаки и полезные трюки
1. Правило «трёх опасностей»
Смотришь на формулу — сразу ищи глазами три вещи: дробь? корень чётной степени? логарифм? Нашёл — сразу выписывай условие, не откладывая на потом.
2. Ищи ОДЗ строго до упрощения
Сначала выпиши все условия по исходной записи функции, и только потом сокращай, раскладывай на множители и упрощай выражение.
3. Рисуй числовую прямую для нескольких условий
Когда условий несколько, отмечай на одной числовой прямой все критические точки (выколотые и закрашенные) — пересечение находится глазами гораздо быстрее, чем в уме.
4. Запомни объединённое правило для корня в знаменателе
$\sqrt{g(x)}$ в знаменателе — это сразу два условия в одном: «под корнем не отрицательное» и «корень не равен нулю», то есть просто $g(x) > 0$ строго.
5. Начинай поиск $E(f)$ с монотонности
Сначала попробуй заметить, что функция — композиция монотонных операций (так решается быстрее всего), и только если не получается — переходи к методу «выразить $x$ через $y$» с дискриминантом.
6. Держи под рукой шпаргалку готовых диапазонов
$\sin, \cos \in [-1;1]$; сигмоида $\in (0;1)$; $\tanh \in (-1;1)$; softmax-компонента $\in (0;1)$; ReLU $\in [0;+\infty)$; Softplus $\in (0;+\infty)$.
7. Проверяй данные до трансформации, а не после
assert (df['income'] > 0).all(), "Найдены неположительные значения дохода"
df['log_income'] = np.log(df['income'])
Одна строчка assert перед логарифмированием экономит часы отладки посреди обучения модели.
Область определения и множество значений — это не формальность для контрольной работы, а инструмент, который отделяет код, который просто «вроде бы работает», от кода, который работает предсказуемо даже на грязных, неидеальных, реальных данных. Каждый раз, когда ты видишь дробь, корень или логарифм — задай себе привычный вопрос: «а где это вообще имеет смысл?» — и большая часть будущих NaN в твоих моделях просто не случится.
Следующий шаг: переходи к уроку «График функции» — там область определения и множество значений станут видны буквально, как границы кривой на координатной плоскости.
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку