Линейная алгебра

Повороты и комплексные числа

Приложение на полдня, которое позже окупится в RoPE и позиционных кодировках

Шаг 21 из 117 · ~24 мин

Почему это здесь, а не в начале

Тригонометрию в этом плане специально отложили до конца блока. Причина в том, что угол — понятие производное: он определяется через скалярное произведение, как мы видели двумя уроками ранее. Начав с тригонометрии, приходится принимать угол на веру; начав с неё в конце, всё встаёт на свои места.

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

Радианы и единичная окружность

Радиан — угол, при котором длина дуги равна радиусу. Полный оборот равен 2π2\pi. Смысл соглашения в том, что только в радианах верно ddθsinθ=cosθ\frac{d}{d\theta}\sin\theta = \cos\theta без лишних множителей, — а это понадобится в блоке 2.

Определение через окружность: точка на единичной окружности под углом θ\theta имеет координаты (cosθ,sinθ)(\cos\theta, \sin\theta). Всё остальное — следствия: cos2+sin2=1\cos^2 + \sin^2 = 1 это теорема Пифагора, а периодичность — то, что оборот возвращает в ту же точку.

Матрица поворота

Поворот на θ\theta переводит e1(cosθ,sinθ)\mathbf{e}_1 \mapsto (\cos\theta, \sin\theta) и e2(sinθ,cosθ)\mathbf{e}_2 \mapsto (-\sin\theta, \cos\theta). По правилу «столбцы — это образы базисных векторов» матрица получается сразу:

R(θ)=[cosθsinθsinθcosθ]R(\theta) = \begin{bmatrix} \htmlData{k=first}{\cos\theta} & \htmlData{k=second}{-\sin\theta} \\ \htmlData{k=first}{\sin\theta} & \htmlData{k=second}{\cos\theta} \end{bmatrix}

Столбцы ортогональны и единичны, значит RR ортогональна: R1=RR^{-1} = R^\top, и обратный поворот — это поворот на θ-\theta. Определитель равен cos2θ+sin2θ=1\cos^2\theta + \sin^2\theta = 1: площади сохраняются, ориентация тоже.

Композиция складывает углы

Повернуть на θ\theta, потом на φ\varphi — то же, что повернуть на θ+φ\theta + \varphi:

R(φ)R(θ)=R(θ+φ)R(\varphi)R(\theta) = R(\theta + \varphi)

Раскройте произведение матриц слева и сравните с правой частью поэлементно — получатся ровно формулы сложения углов:

cos(θ+φ)=cosθcosφsinθsinφ\cos(\theta + \varphi) = \cos\theta\cos\varphi - \sin\theta\sin\varphi sin(θ+φ)=sinθcosφ+cosθsinφ\sin(\theta + \varphi) = \sin\theta\cos\varphi + \cos\theta\sin\varphi

Их не нужно запоминать отдельно: это одно матричное равенство, записанное по элементам. Подвигайте оба угла и убедитесь, что пунктирный вектор всегда попадает туда же, куда привела бы сумма:

e₁e₂

матрица поворота

cos θ
0.87
sin θ
0.5
θ в радианах
0.52
θ + φ
75°
угол θ 30°
угол φ 45°
Пунктирный вектор — результат двух поворотов подряд. Он всегда совпадает с поворотом на сумму углов, и это равенство матриц и есть формулы сложения.

Комплексные числа как та же самая структура

Комплексное число z=a+biz = a + bi — это пара (a,b)(a, b) с особым правилом умножения. Правило устроено так, что умножение на zz — это линейное отображение с матрицей

[abba]\begin{bmatrix} a & -b \\ b & a \end{bmatrix}

Сравните с матрицей поворота: при a=cosθa = \cos\theta, b=sinθb = \sin\theta это ровно она. Умножение на комплексное число единичного модуля — поворот, и ничего больше.

В общем случае zz записывается через модуль z=a2+b2|z| = \sqrt{a^2 + b^2} и аргумент argz=θ\arg z = \theta:

z=z(cosθ+isinθ)z = |z|(\cos\theta + i\sin\theta)

Умножение перемножает модули и складывает аргументы — потому что растяжения перемножаются, а повороты складываются.

Формула Эйлера

eiθ=cosθ+isinθe^{i\theta} = \cos\theta + i\sin\theta

Причина, по которой это не произвольное обозначение: у экспоненты определяющее свойство ex+y=exeye^{x+y} = e^x e^y, а у поворотов — «композиция складывает углы». Это одно и то же свойство. Записав поворот как экспоненту, мы получаем закон сложения бесплатно.

Отсюда же eiθ=1|e^{i\theta}| = 1 для любого действительного θ\theta и знаменитое eiπ=1e^{i\pi} = -1 — поворот на половину оборота.

Где это понадобится

  • RoPE: позиционное кодирование, которое поворачивает пары координат на угол, пропорциональный позиции. Это буквально R(θ)R(\theta) из этого урока, применённая блоками по два. Свойство «композиция складывает углы» — причина, по которой относительная позиция получается сама собой: скалярное произведение повёрнутых векторов зависит только от разности углов.
  • синусоидальные позиционные кодировки: набор sin\sin и cos\cos разных частот.
  • преобразование Фурье: разложение по eiωte^{i\omega t}.
  • устойчивость рекуррентных сетей: комплексные собственные значения с модулем около единицы — это медленно затухающие колебания, а не взрыв.

Источники

Проверки

0 из 2
  1. Свойства поворотов

    Отметьте все верные утверждения про матрицу поворота R(θ)R(\theta) и про комплексные числа.

  2. Поворот вектора

    Реализуйте rotate(v, degrees) — поворот двумерного вектора на заданный угол в градусах, против часовой стрелки.

    [xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}

    Не забудьте перевести градусы в радианы: и math.sin, и Math.sin принимают радианы. Это самая частая ошибка в задачах такого рода, и она тихая — код работает, ответ неверен.

    Верните список из двух чисел. Точных нулей ждать не стоит: cos90°\cos 90° в плавающей арифметике даёт 610176 \cdot 10^{-17}, поэтому сравнение здесь с допуском.

    функция rotate

    Загрузка редактора…

    Ctrl/⌘ + Enter