В позапрошлой главе (которую я написал 5 лет назад) была выведена такая псевдометрика:
причём она работает только для кватернионов единичной нормы.
В прошлой главе попытался её обобщить до произвольных кватернионов, отчего она стала ещё толще, повсюду добавилось "нормирование" этих кватернионов, и при этом мы вынуждены были исключить из рассмотрения нулевой кватернион, т.к для него выходит "деление на ноль".
Всё это выглядит как костыли - ну не должно фундаментальное математическое выражение так выглядеть!
И вот сегодня я, наконец-то, пришёл к куда более изящному выражению:
сначала как эквивалент своей первой псевдометрики. Для кватернионов единичной нормы эти две формулы эквивалентны, и одно в другое переходит в пол-пинка.
Но подставляя туда другие кватернионы, вдруг осознал: это выражение корректно работает с ЛЮБЫМИ кватернионами, оценивая, насколько они близки, если рассматриваются как преобразования над векторами, т.е поворот и масштабирование!
Например, мы тут же видим: заменив Λ на -Λ или Μ на -Μ, мы придём к тому же значению - в первой формуле это было далеко не очевидно. А ещё, если воткнуть сюда Μ=0, то получим ответ |Λ|2, например, 1 для нормированного кватерниона. То есть, отличие между единичным вектором, повёрнутым кватернионом поворота, и "преобразованным" с помощью нулевого кватерниона (т.е просто обращённого в ноль) всегда равно ЕДИНИЦЕ. Логично!
Весь день потратил на доказательство, расписал несколько страниц (а вообще обобщённую на произвольные кватернионы псевдометрику ковырял с 1-го августа), и ВНЕЗАПНО осознал, как этот вывод провести буквально в две строчки!
Пока что пребываю в полном восторге, этот результат мне кажется "жемчужиной" данного ликбеза. Наверняка, "это уже было в Симпсонах", но этого точно не было у Бранца и Шмыглевского!
Напомним, в чём состоит "физический смысл" данной метрики. Нам заданы два кватерниона, Λ и Μ. Берём произвольный единичный вектор n. Преобразуем его с помощью кватерниона Λ:
Его же преобразуем с помощью кватерниона Μ:
Находим разность между этими двумя векторами:
Некоторые вектора могут после преобразования получиться одинаковыми даже для существенно различных кватернионов. Например, вектор (1;0;0) останется на месте от поворота на 180° вокруг оси X, поэтому для него и нулевой поворот, и поворот на 180° окажутся "одинаковыми". Так что для конкретных кватернионов Λ и Μ мы должны найти вектор, который сильнее всего "разойдётся". Длину вектора разности мы и назовём метрикой, показывающей, насколько похожи друг на друга два преобразования, заданные с помощью этих кватернионов:
Пока кватернионы обладали единичной нормой, мы смогли вывести это выражение из геометрических соображений: мы поняли, что можем "повернуть координаты", сведя два разных поворота к одному повороту . Затем мы понимали, что нужно взять вектор, перпендикулярный к оси поворота. По ходу дела получались красивые равнобедренные треугольнички, так что мы получили результат:
Преобразовать его к новой форме довольно легко. Для начала внесём двойку под корень:
Раскроем скобку:
Не торопимся заменять |Λ|2 и |Μ|2 на единички, лучше поступить наоборот, "раскрыть" четвёрку как сумму удвоенных норм:
Вот и всё, корень исчезает, и мы приходим к искомому выражению:
Но теперь снимаем условие единичной нормы кватернионов. Тут уже "геометрически" вывести чрезвычайно тяжело: вместо красивого равнобедренного треугольника у нас получается треугольник с произвольными тремя сторонами, для которого надо использовать теорему косинусов. Получаются длиннющие выражения, которые упрощаться не желают, даже когда повсюду начинаешь избавляться от "бесконечно малых высших порядков".
Так что поступим принципиально по-другому, в кои-то веки воспользуемся напрямую математикой кватернионов и их свойствами.
Начнём от печки:
Введём два новых кватерниона, суммы и разности:
(не забываем, что кватернионы принято называть заглавными греческими буквами. Сейчас мы взяли заглавную сигму и заглавную дельту. В последующих выражениях не пугайтесь: мы не собираемся брать ни конечных разностей, ни сумм, так что это просто буквы.)
Исходные кватернионы выразим через них:
Подставим их в выражение для d:
Попробуем найти выражение, сопряжённое к первому слагаемому:
Как видно, мы тем самым пришли ко второму слагаемому, но со знаком "минус". То есть, выражение можно записать ещё и так:
Прокомментируем происходящее на произвольном кватернионе A:
То есть, мы вычленили из кватерниона его мнимую (векторную) составляющую. Наше выражение можно записать следующим образом:
Наконец, найдём длину получающегося вектора:
Мы сразу можем дать оценку сверху для этой длины:
В правой части у нас и вылезла искомая псевдометрика, но пока в качестве оценки сверху. Оно и понятно: пока что мы не конкретизировали значение вектора n, для некоторых векторов эта разность вообще получится нулевой.
Настала пора выбрать такое значение n, при котором будет достигнуто точное равенство! Таковое будет достигнуто, если
поскольку если действительная (скалярная) часть кватерниона равна нулю, то норма кватерниона равна норме его мнимой (векторной) части! Можно попросту заявить: у нас достаточно степеней свободы, чтобы выбором n занулить скалярную составляющую. Но всё-таки проведём выкладки честно. Запишем действительную (скалярную) и мнимую (векторную) часть кватернионов обычным способом, с помощью строчных греческих букв:
Найдём сначала промежуточное выражение:
и теперь выражение целиком:
У нас получилось два скалярных произведения и одно смешанное произведение. Рассмотрим возможные варианты, в порядке возрастания сложности:
1. . В такой ситуации выражение заведомо обращается в ноль, поэтому можем выбрать произвольный вектор n. Например, n=(1;0;0).
2. , возможно либо (нулевой вектор коллинеарен любому другому). В таком случае, смешанное произведение заведомо обратится в ноль. Останется выражение:
Достаточно выбрать либо (т.е перпендикулярен к ненулевому вектору), чтобы оба скалярных произведения, а значит, и вся действительная часть кватерниона обратилась в ноль.
3. . В таком случае выразим вектор n в виде линейной комбинации двух векторов:
Подставив его в действительную часть кватерниона, получим:
Можно задать:
при этом действительная часть заведомо обратится в ноль. По условиям варианта 3, α≠0, поэтому мы также сможем смасштабировать вектор n, получив единичную длину.
Что и требовалось доказать: при любых возможных входных данных, мы всегда можем подобрать такой единичный вектор n, который занулит действительную часть нашего промежуточного кватерниона, благодаря чему его мнимая (векторная) часть будет иметь максимально возможную норму, вычисленную по простой формуле:
Практическое применение
У нас появился удобный инструмент для оценки точности вычисления кватернионов, когда нас интересует не только точность представления поворота, но и паразитное удлинение/укорочение векторов, которое они испытывают при повороте из-за того, что норма кватерниона оказалась нарушена.
По сути, посчитанная метрика - это безразмерное число, относительная погрешность работы с вектором. Если мы получили 0,01, это значит: вектор ушёл "куда-то не туда" на 1% своей длины. Это могло быть "вбок", что интерпретируется как неверный поворот, либо "вдоль себя", что интерпретируется как неверный масштаб.
Ранее мы давали оценку точности 16-битных представлений компонентов кватерниона, в формате Q1.15. Мы говорили, что точность составляет 6·10-5 радиан, либо 12 угловых секунд. Но можно сказать по-другому: из-за погрешностей в представлении кватерниона, вектор уйдёт от корректного положения "в произвольном направлении" на 6·10-5 от своей длины, и сюда относится как поворот, так и удлинение.
Ещё немного "проверок на вшивость". Допустим, у кватерниона Λ начисто убежала норма, к примеру, |Λ|=10, в то время, как Μ имеет единичную норму, как положено. Тогда в каждой скобке Λ будет начисто "доминировать", и псевдометрика окажется равной ≈100. Всё верно: у нас же вектор умножается на кватернион и слева, и справа, и каждый раз его длина возрастёт в 10 раз!
С другой стороны, если мы берём достаточно близкие кватернионы, Λ≈Μ с нормой, близкой к единице, то вторую скобку (которая с плюсом) можно просто заменить на двойку. У этой двойки ровно такое толкование: и поворот применяется "дважды" (и слева, и справа), и удлинение в том числе! То есть, удлинение на 5% и потом ещё на 5% с большой точностью превращается в удлинение на 10%.
PS. Под спойлером - "неудачные дубли" - гора макулатуры, порождённая с 1 августа, прежде чем пришёл к правильному решению. [Spoiler (click to open)]
P.P.S теперь точно книжку надо издавать, вот сдать бы наконец это "изделие", закопался я с ним по уши...