Тригонометрия

Обратные тригонометрические функции

Камера на роботе видит препятствие в точке (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
Обратные тригонометрические функции

0

1

Войти