Тригонометрия
Обратные тригонометрические функции
Камера на роботе видит препятствие в точке (dx, dy). Какой угол нужно повернуть? Math.atan2(dy, dx) - одна строка, и робот знает направление. Но почему atan2, а не arctan? Почему не arcsin? Это не произвол - это история о том, как обратить функцию, которая не биективна. Синус принимает значение 0.5 при 30 deg, 150 deg, 390 deg и ещё бесконечно много раз. Обратить его - значит выбрать одного из бесконечных кандидатов. atan2 - финальный ответ, который нашли инженеры: передать x и y раздельно, чтобы не терять квадрант.
- **ROS / SLAM:** atan2(dy, dx) - стандарт вычисления угла поворота в nav_msgs, move_base, cartographer; OpenCV estimatePoseSingleMarkers использует atan2 для извлечения yaw из rvec
- **Arcsin-sqrt трансформация:** arcsin(sqrt(p)) стабилизирует дисперсию бинарных данных в A/B тестах - используется в статистике и ML при работе с вероятностями
- **Активации в ML:** производная arctan = 1/(1+x^2) - прообраз sigmoid и GELU; интеграл 1/sqrt(1-x^2) = arcsin - стандартный табличный интеграл в вычислении длин дуг и замены переменных
Предварительные знания
Почему нужно ограничить область
Камера на роботе видит препятствие в точке (dx, dy). Нужен угол поворота. `Math.atan2(dy, dx)` - и робот знает направление. Но почему atan2, а не arctan? Почему не arcsin? Это не произвол - это история о том, как обратить функцию, когда она не биективна.
Синус - периодическая функция. Уравнение sin(x) = 0.5 имеет бесконечно много решений: 30deg, 150deg, 390deg, -210deg... Чтобы определить **однозначную** обратную функцию, нужно зафиксировать интервал, на котором синус строго монотонен. Для arcsin выбран [-pi/2, pi/2].
Для косинуса выбор другой: cos строго убывает на [0, pi]. Именно этот интервал становится областью значений arccos.
arcsin(x) + arccos(x) = pi/2 для любого x из [-1, 1]. Это следует из sin(alpha) = cos(pi/2 - alpha): если arcsin(x) = alpha, то cos(pi/2 - alpha) = x, значит arccos(x) = pi/2 - alpha.
Производные - через неявное дифференцирование. Пусть y = arcsin(x), тогда sin(y) = x. Дифференцируем обе части: cos(y) * dy/dx = 1. Откуда dy/dx = 1/cos(y). Из тождества cos(y) = sqrt(1 - sin^2(y)) = sqrt(1 - x^2):
Производная arcsin(x) при x -> +-1 стремится к бесконечности - график становится вертикальным у границ. Это не баг, а следствие того, что sin(x) «ложится горизонтально» у pi/2: малое изменение синуса требует большого изменения угла.
Чему равен arcsin(sin(150 deg))?
arctan и atan2: квадрант имеет значение
Тангенс строго возрастает на (-pi/2, pi/2) и принимает все вещественные значения - от -inf до +inf. Область определения arctan - вся числовая прямая. Это делает arctan уникальным среди обратных тригонометрических функций.
Область значений arctan - открытый интервал: значения -pi/2 и pi/2 никогда не достигаются, только приближаются. Это горизонтальные асимптоты. В machine learning производная arctan = 1/(1 + x^2) напоминает сигмоиду - и это не случайно: sigmoid(x) = 1/(1 + e^(-x)) аппроксимирует arctan(x)/pi + 0.5 при подходящем масштабировании.
Вот где начинается главная проблема. arctan(1/1) = 45 deg - точка (1, 1), первая четверть. Но arctan(-1/-1) = arctan(1) = 45 deg тоже - хотя точка (-1, -1) находится в третьей четверти, и её настоящий угол -135 deg. arctan(y/x) теряет информацию о знаках x и y по отдельности.
atan2 - это не новая математическая функция. Это arctan с дополнительной логикой определения квадранта по знакам x и y. Определён везде, кроме точки (0, 0). Первый аргумент - y, второй - x. Порядок аргументов часто путают - atan2(x, y) даёт неверный результат.
В ROS (Robot Operating System) atan2 используется повсюду: `tf2::getYaw()`, `nav_msgs::Odometry`, вычисление угла цели в `move_base`. OpenCV `estimatePoseSingleMarkers` возвращает rvec через Rodrigues - и угол извлекается через atan2 от компонент вектора. SLAM (rob-07) строит карту именно так: scan matching даёт dx, dy смещения, atan2 - угол поворота.
Точка имеет координаты (-3, 4). Какой инструмент даст правильный угол?
Производные через implicit differentiation
Производная arctan выводится тем же методом - через неявное дифференцирование. y = arctan(x), значит tan(y) = x. Дифференцируем: sec^2(y) * dy/dx = 1. Откуда dy/dx = cos^2(y). Из тождества 1 + tan^2(y) = sec^2(y) и tan(y) = x:
Это функция, которая в ML встречается постоянно - в другом обличье. 1/(1 + x^2) - форма лоренцевского распределения. Интеграл от неё - arctan. Сигмоида 1/(1 + e^(-x)) - сглаженная версия той же идеи. GELU (используется в GPT-2, BERT) аппроксимируется через erf, который в свою очередь связан с интегралом Гаусса - тот же класс «колоколообразных производных».
| Функция | Область определения | Область значений | Производная |
|---|---|---|---|
| arcsin(x) | [-1, 1] | [-pi/2, pi/2] | 1/sqrt(1-x^2) |
| arccos(x) | [-1, 1] | [0, pi] | -1/sqrt(1-x^2) |
| arctan(x) | (-inf, +inf) | (-pi/2, pi/2) | 1/(1+x^2) |
Интегральное применение: интеграл от 1/sqrt(1 - x^2) - это arcsin(x) + C. Это стандартный табличный интеграл, который возникает в задачах длины дуги, в формулах преобразования координат и в arcsin-sqrt трансформации в статистике. При бинарных данных (0/1) дисперсия p*(1-p) нестабильна - arcsin(sqrt(p)) стабилизирует variance.
Главная ловушка: arcsin(sin(x)) = x только при x из [-pi/2, pi/2]. За пределами этого интервала результат «сворачивается» обратно. Например, arcsin(sin(150 deg)) = 30 deg, не 150 deg. В одну сторону - sin(arcsin(x)) = x всегда (при x из [-1, 1]). В другую - не всегда.
arcsin(sin(x)) = x всегда
arcsin(sin(x)) = x только при x из [-pi/2, pi/2]. За этим интервалом результат проецируется обратно в него
arcsin определена так, чтобы возвращать единственное значение из [-pi/2, pi/2]. Если x = 5*pi/6, то sin(x) = 1/2, и arcsin(1/2) = pi/6 - не 5*pi/6. Композиция f^-1(f(x)) = x только на области значений f^-1. Это фундаментальное свойство любой обратной функции с ограниченной областью значений.
Чему равен arcsin(sin(5*pi/6))?
Ключевые идеи
- **arcsin, arccos, arctan** - обратные функции с ограниченными областями значений: [-pi/2, pi/2], [0, pi], (-pi/2, pi/2)
- **arcsin(x) + arccos(x) = pi/2** - фундаментальное тождество из sin(t) = cos(pi/2 - t)
- **atan2(y, x)** - практическая замена arctan: передаёт x и y раздельно, возвращает полный угол в (-pi, pi]
- **Производные** через implicit differentiation: d/dx arcsin = 1/sqrt(1-x^2), d/dx arctan = 1/(1+x^2)
- **arcsin(sin(x)) != x** вне [-pi/2, pi/2] - главная ловушка при работе с обратными функциями
Связанные темы
Обратные тригонометрические функции соединяют геометрию, анализ и системы реального мира:
- Основные тождества — Тождество sin^2 + cos^2 = 1 - основа для вывода производных arcsin и arccos
- Тригонометрические уравнения — Уравнения с arcsin и arctan - следующий шаг после понимания главных значений
- Правила дифференцирования — Производные arcsin, arctan - табличные формулы в любом курсе математического анализа
- Первообразные — Интегралы от 1/sqrt(1-x^2) и 1/(1+x^2) выражаются через arcsin и arctan
Вопросы для размышления
- Почему разработчики добавили atan2 как отдельную функцию, а не просто arctan(y/x)? Какие конкретные точки на плоскости arctan обрабатывает неверно?
- Производная arctan = 1/(1+x^2) - это «вещественная» версия чего-то в комплексном анализе. Что такое 1/(1+x^2) с точки зрения полюсов функции 1/(1+z^2)?
- Если бы область значений arcsin выбрали [pi/2, 3*pi/2] вместо [-pi/2, pi/2] - какие свойства сохранились бы, а что изменилось? Тождество arcsin + arccos = pi/2 осталось бы верным?
Связанные уроки
- trig-02 — Тождества нужны для вывода производных arcsin, arccos
- trig-04 — Уравнения с обратными функциями - следующий шаг
- calc-07-derivative-rules — Производные arcsin и arctan - стандартные табличные формулы
- calc-10-antiderivatives — 1/sqrt(1-x^2) интегрируется в arcsin - ключевой приём
- rob-02 — Обратная кинематика через arctan2 - углы суставов из позиции
- rob-07 — SLAM использует atan2 для вычисления угла поворота из координат
- calc-06-derivative-intro