Программирование, 2022, № 1, стр. 54-64

АНАЛИТИКО-ЧИСЛЕННАЯ РЕАЛИЗАЦИЯ АЛГЕБРЫ ПОЛИВЕКТОРОВ НА ЯЗЫКЕ JULIA

М. Н. Геворкян a*, А. В. Демидова a**, Т. Р. Велиева ab***, А. В. Королькова a****, Д. С. Кулябов ac*****

a Российский университет дружбы народов
117198 Москва, ул. Миклухо-Маклая, Россия

b Российский экономический университет им. Г.В. Плеханова
117997 Москва, Стремянный пер., 36, Россия

c Объединенный институт ядерных исследований, Лаборатория информационных технологий
141980 Московская область, Дубна, ул. Жолио-Кюри, 6, Россия

* E-mail: gevorkyan-mn@rudn.ru
** E-mail: demidova-av@rudn.ru
*** E-mail: velieva-tr@rudn.ru
**** E-mail: korolkova-av@rudn.ru
***** E-mail: kulyabov-ds@rudn.ru

Поступила в редакцию 02.08.2021
После доработки 02.09.2021
Принята к публикации 19.09.2021

Полный текст (PDF)

Аннотация

Геометрическая алгебра основывается на трудах Грассмана и Клиффорда. Основными изучаемыми объектами являются p-векторы (поливекторы) и мультивекторы. Поливекторы вкупе с операцией внешнего умножения дают реализацию алгебры Грассмана, а мультивекторы с операцией геометрического умножения реализуют алгебру Клиффорда. Алгебра мультивекторов позволяет обобщить многие операции и объекты из аналитической и дифференциальной геометрий, такие как векторное и смешанное произведения, векторы нормали и бинормали и т.д. на многомерный случай и дать им наглядную геометрическую интерпретацию. Комплексные числа и кватернионы изоморфны мультивекторам специального вида. В работе рассмотрено применение идей геометрической алгебры для решения некоторых прикладных задач, которые встречаются в компьютерной геометрии. Для решения данных задач используется пакет Grassmann.jl для языка Julia.

1. ВВЕДЕНИЕ

Тензорный формализм является крайне общим. Он описывает произвольные пространства с группой симметрии $GL(n)$. Однако пространство, в котором мы живем, обладает более узкой группой симметрии. В трехмерном случае нам достаточно группы O(3), а в четырехмерном случае – группы Лоренца $\Lambda $. Группа Лоренца является более узкой, чем общая линейная группа, но при этом имеет больше специфических свойств, удобных для описания нашего пространства. Поэтому представляется оправданным использовать более специфический инструментарий, чем тензоры, а именно спиноры. Спиноры являются элементами алгебры Клиффорда. Обычно используют матричное представление спиноров, которое, по историческим причинам, является крайне громоздким. Одним из формализмов, призванных упростить манипуляции со спинорами, является формализм геометрической (и пространственно-временной) алгебры.

В данной статье дается краткий обзор модуля Grassmann.jl [1], который реализует внешнюю алгебру (p-векторы и внешнее произведение) и алгебру мультивекторов (реализация абстрактной алгебры Клиффорда). Если внешняя алгебра широко известна и изучается в расширенном курсе алгебры и дифференциальной геометрии для физико-математических специальностей [2], то геометрическая алгебра гораздо менее распространена.

Геометрическая алгебра довольно прикладная область. Ее результаты нашли применение в области машинной графики и компьютерной геометрии [36]. Ее концепции обладают большой обобщающей силой. Так, например, для двумерного евклидова ортонормированного пространства, мультивекторы второго ранга изоморфны комплексным числам, а в случае трехмерного пространства те же мультивекторы изоморфны уже телу кватернионов. Более того, к операциям геометрической алгебры сводится векторное и смешанное умножения, ориентированная площадь и ориентированный объем.

При выборе языка программирования, на котором должен быть реализован формализм геометрической алгебры мы опирались на идею одного языка. Под этим мы подразумеваем использование одного языка как для манипуляции с символьными данными, так и для численных расчетов11. Ранее мы экспериментировали с созданием рабочего конвейера с использованием разнообразных программных средств [8].

В качестве такого языка мы выбрали язык Julia [9]. Хотя основной парадигмой языка Julia являются высокопроизводительные вычисления [10], а этот язык является своего рада наследником языка FORTRAN [11], в данном случае для нас не является основной причиной выбора языка. Для нас важнее всего была встроенная поддержка создания на основе языка Julia новых предметно-ориентированных языков и поддержка оберток для сторонних программ и библиотек [12].

1.1 Структура статьи

В разделе 2 кратко перечислены некоторые специальные факты из теории поливекторов. В разделе 3 рассмотрены случаи двумерного и трех- мерного векторных пространств. Раздел 4 посвящен изложению базовых концепций геометрической алгебры – геометрического умножения и понятия мультивектора. В разделе 5 подробно разобран пример описания трехмерных вращений с помощью мультивектора особого вида, называемого ротором. В ходе изложения подчеркивается ряд преимуществ, по сравнению с кватернионами, которые на данный момент стали стандартом де-факто для описания поворотов в трехмерном евклидовом пространстве. В разделе 6 на базе изложенного материала дается обзор основных возможностей модуля Grassmann.jl. Данный модуль, как и сам язык Julia, для которого он написан, находится еще в начальной стадии развития, поэтому страдает от явных недоделок. По ходу работы над примерами встречаются несколько таких моментов.

1.2. Обозначения и соглашения

1. Контравариантные векторы (векторы) будем обозначать строчными латинскими буквами и выделять с помощью полужирного шрифта. Например: $v$, $x$ и т.д. Над греческими буквами будем ставить значок стрелки, например: $\vec {\omega }$.

2. Линейное пространство контравариантных векторов будем обозначать буквой $L$ и полагать наличие базиса $\left\langle {{{e}_{1}},\; \ldots ,\;{{e}_{n}}} \right\rangle $. Нумерацию векторов базиса будем вести нижними индексами от $1$ до $n$. Буквой $n$ всегда будем обозначать размерность $L$ т.е. $dimL = n$.

3. Под полем скаляров будем подразумевать поле действительных чисел $\mathbb{R}$, хотя многие формулы и утверждения остаются справедливыми для любого произвольного числового поля $R$. Скаляры будем обозначать строчными греческими буквами $\alpha $, $\beta $ и т.д.

4. Будем полагать, что пространство $L$ наделено структурой скалярного произведения. Кроме того, будем полагать, что в пространстве $L$ можно задать ортонормированный базис $\left\langle {{{e}_{1}},\; \ldots ,\;{{e}_{n}}} \right\rangle $.

5. Скалярное произведение векторов $u$ и v будем обозначать как $(u,v)$, векторное произведение как $[u,v]$ или $u \times v$ и смешанное произведение трех векторов как $(u,v,w)$.

2. ОСНОВНЫЕ СВЕДЕНИЯ ИЗ ГЕОМЕТРИЧЕСКОЙ АЛГЕБРЫ

При изложении материала мы предполагаем, что читатель знаком с основами тензорной алгебры, по крайней мере в объеме, изложенном в книге [2].

2.1. Внешнее умножение и внешняя алгебра

Контравариантные кососимметричные тензоры валентности (ранга) $(0,p)$ называют p-векторами или поливекторами. Обозначать p-вектор произвольного ранга будем также, как и обычные векторы – полужирным латинскими буквами. Когда ранг непонятен из контекста, будем указывать его внизу буквы, например: $\mathop u\limits_P $.

Относительно операции сложения и умножения на скаляр, множество p-векторов образует линейные пространства, обозначаемые как ${{\Lambda }^{p}}(L)$, где пространство L – линейное пространство контравариантных векторов с базисом $\left\langle {{{e}_{1}},\; \ldots ,\;{{e}_{n}}} \right\rangle $. Полагают, что ${{\Lambda }^{0}}(L) = {\mathbf{R}}$ и ${{\Lambda }^{1}}(L) = L$, то есть 1-вектор является контравариантным вектором.

Рассмотрим пространство $\Lambda (L)$, которое представляет собой прямую сумму пространств p-векторов

$\Lambda (L) = {{\Lambda }^{0}}(L) \oplus {{\Lambda }^{1}}(L) \oplus {{\Lambda }^{2}}(L) \oplus {{\Lambda }^{3}}(L) \oplus \; \ldots $

Введем на этом пространстве операцию $ \wedge {\text{:}}\;\Lambda (L) \times \Lambda (L) \to \Lambda (L)$ называемую внешним произведением. Для любых поливекторов $u \in {{\Lambda }^{p}}(L)$, $v \in {{\Lambda }^{q}}(L)$, $w \in {{\Lambda }^{r}}(L)$ внешнее умножение определяется следующими свойствами:

• rank$(\mathop u\limits_p \, \wedge \mathop v\limits_q ) = p + q$.

$u \wedge (v \wedge w) = (u \wedge v) \wedge w$ – ассоциативность.

$1 \wedge u = u \wedge 1 = u$, где $1$ – скалярная единица (единичный элемент).

$\alpha \wedge \beta = \alpha \cdot \beta $ – для скаляров $ \wedge $ эквивалентно простому умножению.

$\mathop u\limits_p \wedge \mathop v\limits_q = {{( - 1)}^{{pq}}}\mathop v\limits_q \wedge \mathop u\limits_p $ – антикоммутативность для нечетных валентностей.

$(u + v) \wedge w = u \wedge w + v \wedge w$ – дистрибутивность (правая).

$w \wedge (u + v) = w \wedge u + w \wedge v$ – дистрибутивность (левая).

$u \wedge (\alpha v) = (\alpha u) \wedge v = \alpha (u \wedge v)$ это свойство в купе с дистрибутивностью дает билинейность операции $ \wedge $.

Операция внешнего произведения наделяет пространство $\Lambda (L)$ структурой ассоциативной алгебры над полем скаляров. Такая алгебра называется внешней алгеброй пространства $L$ (или алгеброй Грассмана) [2].

Все возможные p-векторы ${{e}_{{{{i}_{1}}}}} \wedge {{e}_{{{{i}_{2}}}}} \wedge \; \ldots \; \wedge {{e}_{{{{i}_{p}}}}}$, составленные из базисных векторов пространства L, образуют базис пространства  p-векторов ${{\Lambda }^{p}}(L)$. Так как между собой поливекторы ${{e}_{{{{i}_{1}}}}} \wedge {{e}_{{{{i}_{2}}}}} \wedge \; \ldots \; \wedge {{e}_{{{{i}_{p}}}}}$ отличаются лишь знаком, то можно выбрать один из них, расположив индексы по возрастанию: $1 \leqslant {{i}_{1}} < {{i}_{2}} < \; \ldots \; < {{i}_{p}} \leqslant n$. Такой порядок индексов называется естественным, а выбранный базисный $p$-вектор значимым.

2.2. Размерность пространства и ранг $p$-вектора

При работе с p-векторами следует учитывать следующие размерности и ранги.

• Размерность пространства $L = \left\langle {{{e}_{1}},\; \ldots \;{{e}_{n}}} \right\rangle $ обозначается как $dimL = n$.

• Ранг p-вектора равен p. Указывается при обозначении пространства p-векторов: ${{\Lambda }^{p}}(L)$. Вместо термина ранг также часто используют термин порядок (grade) и обозначение gr [4, 13] и иногда термин step [3].

• Размерность пространства ${{\Lambda }^{p}}(L)$ равна наибольшему рангу, который может быть у ненулевого p-вектора в данном пространстве $L$. Она также равна количеству значимых базисных p-векторов и обозначается как $dim{{\Lambda }^{p}}(L) = C_{n}^{p}$.

• Размерность пространства Λ(L) = = ${{\Lambda }^{0}}(L) \oplus {{\Lambda }^{1}}(L) \oplus {{\Lambda }^{2}}(L) \oplus {{\Lambda }^{3}}(L) \oplus \; \ldots $ равна сумме размерностей всех подпространств, составляющих прямую сумму: $\sum\limits_{i = 0}^n {C_{n}^{i}} = {{2}^{n}}$.

• Формально можно полагать ранг нулевого p‑вектора любым (удобным для манипуляций).

Базис пространства ${{\Lambda }^{p}}(L)$ зависит как от ранга p, так и от $n$ (размерности $L$). $p$-вектор будет иметь разное количество компонент в зависимости от размерности пространства L на котором мы его рассматриваем.

• На ${{\Lambda }^{2}}(L)$ базис задается 2-векторами ${{e}_{{ij}}} = {{e}_{i}} \wedge {{e}_{j}}$, где $i < j$ и $i,j = 1,\; \ldots ,\;n$.

• На ${{\Lambda }^{p}}(L)$ базис задается p-векторами ${{e}_{{{{i}_{1}} \ldots {{i}_{p}}}}} = {{e}_{{{{i}_{1}}}}} \wedge \; \ldots \; \wedge {{e}_{{{{i}_{p}}}}}$, где ${{i}_{1}} < \; \ldots \; < {{i}_{p}}$ и ${{i}_{1}}, \ldots ,{{i}_{p}}$ = 1, ..., n.

• На ${{\Lambda }^{n}}(L)$ базис задается одним $n$-вектором ${{e}_{{12 \ldots n}}} = {{e}_{1}} \wedge {{e}_{2}}\; \ldots \; \wedge {{e}_{n}}$.

Обозначения ${{e}_{{ij}}}$, ${{e}_{{{{i}_{1}}{{i}_{2}}{{i}_{3}}}}}$ и т.д. мы ввели для краткости.

В литературе [4, 13] 2-вектор называют бивектором, 3-вектор – тривектором и 4-вектор – квадривектором. Для $p$-форм малой размерности таких специальных названий авторы не встречали.

2.3. Базисные n-векторы в n-мерном пространстве

Особый случай возникает, когда ранг рассматриваемого объекта совпадает с размерностью пространства L то есть $p = n = dimL$. Тогда размерность пространства ${{\Lambda }^{n}}(L)$ равна $C_{n}^{n} = 1$ и существует только один значимый базисный n-вектор:

${{e}_{{12 \ldots n}}} = {{e}_{1}} \wedge {{e}_{2}}\; \ldots \; \wedge {{e}_{n}}.$

Можно считать, что $n$-вектор ${{e}_{{12 \ldots n}}}$ имеют одну единичную компоненту.

Базисный $n$-вектор ${{e}_{{12 \ldots n}}}$ задает элемент единичного объема. В геометрической алгебре базисный $n$-вектор обозначают как ${{E}_{n}}$ или ${{I}_{n}}$.

2.4. Разложимость

Разложимым называют p-вектор $V$, который выражается через внешнее произведение p различных векторов из $L$:

$V = {{v}_{1}} \wedge {{v}_{2}} \wedge \; \ldots \; \wedge {{v}_{p}}$

В литературе на английском языке для обозначения разложимого вектора используют термин blade [3, 4]. Реже встречается термин простой (simple) вектор.

Формулировка необходимых и достаточных условий для разложимости p-вектора не является тривиальной задачей. Она была решена в работе [14]. В пространстве $L$ размерности n разложимыми являются любые p-векторы, при $p \in {\text{\{ }}0,\;1,\;n - 1,\;n{\text{\} }}$. В трехмерном пространстве все p-векторы являются разложимыми, но уже для четырехмерного пространства это неверно. Например, бивектор следующего вида

$V = {{e}_{{12}}} + {{e}_{{34}}} = {{e}_{1}} \wedge {{e}_{2}} + {{e}_{3}} \wedge {{e}_{4}}$
в четырехмерном пространстве нельзя записать в виде $V = {{v}_{1}} \wedge {{v}_{2}}$ ни для каких ${{v}_{1}}$ и ${{v}_{2}}$ из $L$ [3, стр. 46].

Отдельно стоит заметить, что бивектор V = = ${{V}^{{ij}}}{{e}_{i}}\, \wedge \,{{e}_{j}}$ разложим тогда и только тогда, когда $V \wedge V = 0$ [2, § 6.3.5].

2.5. Операция дополнения и ее свойства

Правым дополнением (right complement) базисного p-вектора $B \in {{\Lambda }^{p}}(L)$, где $dimL = n$ называется такой $(n - p)$-вектор $\bar {B} \in {{\Lambda }^{{n - p}}}(L)$, что

$B \wedge \bar {B} = {{E}_{n}}.$

Соответственно, левым дополнением (left complement) базисного p-вектора $B \in {{\Lambda }^{p}}(L)$ называется такой $(n - p)$-вектор $\underline {\mathbf{B}} \in {{\Lambda }^{{n - p}}}(L)$, что

$\underline B \wedge B = {{E}_{n}}.$

Иногда, базис состоящий из дополнений называют кобазисом [13].

Для любого разложимого p-вектора, в частности, для базисного $p$-вектора $B$ выполняется следующее соотношение

$\underset{\raise0.3em\hbox{$\smash{\scriptscriptstyle-}$}}{B} = {{( - 1)}^{{p(n - p)}}}\bar {B}$

Данное соотношение показывает, что правое и левое дополнение совпадают в случае, если p – четное число и различаются знаком, если p – нечетное.

Также для разложимого p-вектора $B$, где p – нечетное, выполняется равенство:

$\bar {\bar {B}} = \underline {\underset{\raise0.3em\hbox{$\smash{\scriptscriptstyle-}$}}{B} } = {{( - 1)}^{{p(n - p)}}}B$

Для любого разложимого $p$-вектора:

$\underline {\bar {A}} = A$

Определив операцию дополнения для базисных p-векторов, можно распространить ее на произвольный $p$-вектор, потребовав линейности:

$\overline {\alpha V} = \alpha \bar {A}$, где $\alpha $ – скаляр.

$\overline {A + B} = \overline A + \overline B $.

Правое дополнение должно подчиняться тем же свойствам.

После этого не составляет труда вычислять дополнительные (комплиментарные) p-векторы. Так для $v \in L$, $dimL = 3$ получим:

$\begin{gathered} \bar {v} = \overline {{{{v}}^{i}}{{{\mathbf{e}}}_{i}}} = {{{v}}^{i}}\overline {{{{\mathbf{e}}}_{i}}} = {{{v}}^{1}}{{{{\mathbf{\bar {e}}}}}_{1}} + {{{v}}^{2}}{{{{\mathbf{\bar {e}}}}}_{2}} + {{{v}}^{3}}{{{{\mathbf{\bar {e}}}}}_{3}} = \\ {\text{ = }}\,{{{v}}^{1}}{{{\mathbf{e}}}_{{23}}} - {{{v}}^{2}}{{{\mathbf{e}}}_{{13}}} + {{{v}}^{3}}{{{\mathbf{e}}}_{{12}}} \\ \end{gathered} $

Вектор $v \in {{\Lambda }^{1}}(L) = L$, а бивектор $\bar {v} \in {{\Lambda }^{2}}(L)$, но благодаря одинаковым размерностям $L$ и ${{\Lambda }^{2}}(L)$ (при условии $n = dimL = 3$) возможно взаимно однозначное соответствие, устанавливаемое операцией дополнения.

3. ДВУМЕРНЫЕ И ТРЕХМЕРНЫЕ ВЕКТОРНЫЕ ПРОСТРАНСТВА

3.1. Векторное произведение

Пусть $L$ есть трехмерное пространство с базисом $\left\langle {{{e}_{1}},{{e}_{2}},{{e}_{3}}} \right\rangle $. Найдем внешнее произведение двух векторов $u$ и $v$

$\begin{gathered} u \wedge v = ({{u}^{1}}{{{v}}^{2}} - {{u}^{2}}{{{v}}^{1}}){{e}_{{12}}} + \\ + \;({{u}^{1}}{{{v}}^{3}} - {{u}^{3}}{{{v}}^{1}}){{e}_{{13}}} + ({{u}^{2}}{{{v}}^{3}} - {{u}^{3}}{{{v}}^{2}}){{e}_{{23}}}. \\ \end{gathered} $

Найдем дополнение к бивектору $u \wedge v$

$\begin{gathered} \overline {u \wedge v} = ({{u}^{1}}{{{v}}^{2}} - {{u}^{2}}{{{v}}^{1}}){{e}_{3}} - ({{u}^{1}}{{{v}}^{3}} - {{u}^{3}}{{{v}}^{1}}){{e}_{2}} + \\ + \;({{u}^{2}}{{{v}}^{3}} - {{u}^{3}}{{{v}}^{2}}){{e}_{1}} = \\ = \;\left( {\begin{array}{*{20}{c}} {{{u}^{2}}{{{v}}^{3}} - {{u}^{3}}{{{v}}^{2}}} \\ {{{u}^{3}}{{{v}}^{1}} - \,{{u}^{1}}{{{v}}^{3}}} \\ {{{u}^{1}}{{{v}}^{2}} - \,{{u}^{2}}{{{v}}^{1}}} \end{array}} \right) \in {{\Lambda }^{1}}(L) = L \\ \end{gathered} $

Мы получили векторное произведение $u \times v$

$u \times v = \overline {u \wedge v} $

Операция дополнения позволяет найти $1$-вектор, ортогональный бивектору $u \times v$. Если же ее применить к 1-вектору, то, наоборот, получаем бивектор, <<ортогональный>> к исходному вектору. Для больших размерностей данная интерпретация также сохраняется, но теряет наглядность.

3.2. Смешанное произведение

На том же трехмерном пространстве $L$ найдем внешнее произведение трех векторов $u$, $v$ и $w$.

$\begin{gathered} u \wedge v \wedge w = {{u}^{i}}{{{v}}^{j}}{{w}^{k}}{{e}_{i}} \wedge {{e}_{j}} \wedge {{e}_{k}} = \\ = \;{{u}^{i}}{{{v}}^{j}}{{w}^{k}}{{\varepsilon }_{{ijk}}}{{E}_{3}} = \left| {\begin{array}{*{20}{c}} {{{u}^{1}}}&{{{{v}}^{1}}}&{{{w}^{1}}} \\ {{{u}^{2}}}&{{{{v}}^{2}}}&{{{w}^{2}}} \\ {{{u}^{3}}}&{{{{v}}^{3}}}&{{{w}^{3}}} \end{array}} \right|{{E}_{3}}, \\ \end{gathered} $
где ${{\varepsilon }_{{ijk}}}$ – символ Леви-Чивиты.

Найдем дополнение к тривектору $u \wedge v \wedge w$

$\overline {u \wedge v \wedge w} = {{u}^{i}}{{{v}}^{j}}{{w}^{k}}{{\varepsilon }_{{ijk}}}{{\bar {E}}_{3}} = {{u}^{i}}{{{v}}^{j}}{{w}^{k}}{{\varepsilon }_{{ijk}}}$

Это не что иное, как смешанное произведение трех векторов $u$, $v$ и $w$:

$(u,v,wu,{v},w) = \overline {u \wedge v \wedge w} $

3.3. Комплексная структура

Рассмотрим теперь $L = \left\langle {{{e}_{1}},{{e}_{2}}} \right\rangle $ и некоторый вектор $u \in L$. Найдем правое дополнение к ${{e}_{1}}$, e2

$\begin{gathered} {{{\bar {e}}}_{1}} = {{e}_{2}}\quad {\text{так}}\;{\text{как}}\quad {{e}_{1}} \wedge {{e}_{2}} = {{E}_{2}}, \\ {{{\bar {e}}}_{2}} = - {{e}_{1}}\quad {\text{так}}\;{\text{как}}\quad {{e}_{2}} \wedge ( - {{e}_{1}}) = {{e}_{1}} \wedge {{e}_{2}} = {{E}_{2}}. \\ \end{gathered} $

Найдем теперь дополнение к $u$:

$\bar {u} = {{u}^{1}}{{\bar {e}}_{1}} + {{u}^{2}}{{\bar {e}}_{2}} = {{u}^{1}}{{e}_{2}} - {{u}^{2}}{{e}_{1}} = \left( {\begin{array}{*{20}{c}} { - {{u}^{2}}} \\ {{{u}^{1}}} \end{array}} \right)$

Это не что иное, как комплексная структура на двумерном декартовом пространстве:

• поворот на угол $\frac{\pi }{2}$:

$J{\mathbf{u}} = \left( {\begin{array}{*{20}{c}} 0&{ - 1} \\ 1&0 \end{array}} \right)\left( {\begin{array}{*{20}{c}} {{{u}^{1}}} \\ {{{u}^{2}}} \end{array}} \right)\left( {\begin{array}{*{20}{c}} { - {{u}^{2}}} \\ {{{u}^{1}}} \end{array}} \right),$

• поворот на угол $ - \tfrac{\pi }{2}$:

$\underline u = {{u}^{1}}\mathop {\underline e }\nolimits_1 + {{u}^{2}}\mathop {\underline e }\nolimits_2 = - {{u}^{1}}{{e}_{2}} + {{u}^{2}}{{e}_{1}} = \left( {\begin{array}{*{20}{c}} {{{u}^{2}}} \\ { - {{u}^{1}}} \end{array}} \right).$

Вновь рассмотрим двумерное пространство L. Найдем смешанное произведение двух векторов $u$ и $v$:

$\begin{gathered} u \wedge v = {{u}^{i}}{{{v}}^{j}}{{e}_{i}} \wedge {{e}_{j}} = {{u}^{i}}{{{v}}^{j}}{{\varepsilon }_{{ij}}}{{E}_{2}} = \\ = \;\left| {\begin{array}{*{20}{c}} {{{u}^{1}}}&{{{{v}}^{1}}} \\ {{{u}^{2}}}&{{{{v}}^{2}}} \end{array}} \right|{{E}_{2}} = ({{u}^{1}}{{{v}}^{2}} - {{u}^{2}}{{{v}}^{1}}){{E}_{2}}. \\ \end{gathered} $

Найдем дополнение от бивектора $u \wedge v$

$\overline {u \wedge v} = ({{u}^{1}}{{{v}}^{2}} - {{u}^{2}}{{{v}}^{1}}){{\bar {E}}_{2}} = ({{u}^{1}}{{{v}}^{2}} - {{u}^{2}}{{{v}}^{1}}).$

Мы получили ориентированную площадь параллелограмма, построенного на векторах $u$ и v. Ориентированная площадь может служить геометрической интерпретацией бивектора.

4. ГЕОМЕТРИЧЕСКОЕ ПРОИЗВЕДЕНИЕ И ГЕОМЕТРИЧЕСКАЯ АЛГЕБРА

4.1. Мультивекторы и геометрическое произведение

Если допустить сложение элементов $\Lambda (L)$ различного ранга, то мы получим более общую структуру, задаваемую операцией сложения и внешнего умножения. Объект из $\Lambda (L)$, состоящий из элементов различного ранга, называется мультивектором или числом Клиффорда [15]:

$M = \alpha + u + \mathop V\limits_2 \, + \mathop W\limits_3 \, + \ldots $

Поскольку $\Lambda (L)$ является градуированной алгеброй, то в этом выражении знак суммы надо воспринимать также как и знак суммы в комплексных числах и кватернионах. Этот знак связывает скаляры, векторы, бивекторы, тривекторы и т.д. в единую сущность.

Операция геометрического умножения обладает большей общностью, чем операции скалярного и внешнего произведений. Поэтому разумно определить ее аксиоматически, а не выражать через скалярное и внешнее произведения. Тем не менее, мы будем предполагать, что в пространстве $L$ задан метрический тензор $g(u,v)$.

Геометрическим произведением двух векторов $u$ и $v$ назовем отображение $L \times L \to L$, которое имеет следующие свойства.

• Геометрическое умножение двух скаляров сводится к обычному умножению, определенному в поле этих скаляров.

• Геометрическое умножение скаляра на вектор из $L$ сводится к обычному умножению, определенному в $L$.

• Геометрическое произведение вектора $u$ самого на себя равно скаляру, значения которого определяется метрическим тензором:

${{u}^{2}} \equiv uu = g(u,u) = \mathop {\left\| u \right\|}\nolimits^2 .$

• Дистрибутивность:

$\begin{gathered} u(v + w) = uv + uw, \\ u(v + w) = uv + uw. \\ \end{gathered} $

• В силу того, что $u$ может быть скаляром, из дистрибутивности следует линейность.

• Ассоциативность: $v(uw) = (vu)w$.

Коммутативность или антикоммутативность явным образом не требуется.

Множество $\Lambda (L)$ с ассоциативной операцией геометрического произведения называется алгеброй мультивекторов и является реализацией абстрактной алгебры Клиффорда, обобщающей алгебру Грассмана и алгебру кватернионов Гамильтона.

Из аксиом следует формула

$uv = (u,v) + u \wedge v{\text{,}}$
которую можно использовать для определения геометрического произведения векторов.

4.2. Обратный элемент и деление

Из свойства $uu = \mathop {\left\| u \right\|}\nolimits^2 \equiv {{u}^{2}}$ следует, что для любого ненулевого вектора $u$ существует обратный элемент $\tfrac{u}{{\mathop {\left\| u \right\|}\nolimits^2 }}$:

$u\frac{u}{{\mathop {\left\| u \right\|}\nolimits^2 }} = \frac{{uu}}{{\mathop {\left\| u \right\|}\nolimits^2 }} = \frac{{\mathop {\left\| u \right\|}\nolimits^2 }}{{\mathop {\left\| u \right\|}\nolimits^2 }} = 1.$

Можно определить операцию (правого) деления, как произведение справа на обратный элемент:

$\frac{u}{v} = u{{v}^{{ - 1}}} = \frac{{uv}}{{\mathop {\left\| u \right\|}\nolimits^2 }}.$

Если умножение произвести слева, то получим иное выражение: ${{v}^{{ - 1}}}u = \tfrac{{vu}}{{\mathop {\left\| v \right\|}\nolimits^2 }}$ так как $uv \ne vu$.

Используя операцию деления можно записать произвольный вектор $u$ относительно некоторого вектора $v$ как:

$\begin{gathered} u = \frac{u}{v}v = u\frac{v}{{\mathop {\left\| v \right\|}\nolimits^2 }}v = uv\frac{v}{{\mathop {\left\| u \right\|}\nolimits^2 }} = \\ = \;\frac{{uv}}{v} = \frac{{(u,v)}}{v} + \frac{{u \wedge v}}{v}. \\ \end{gathered} $

Первое слагаемое ${{u}_{{\parallel v}}}$ является проекцией вектора $u$ на $v$, а второе слагаемое ${{u}_{{ \bot v}}}$ является ортогональной компонентой вектора $u$ относительно вектора $v$.

4.3. Геометрическое произведение произвольных мультивекторов

Обобщение геометрического произведения на произвольные p-векторы, требует обощения скалярного произведения. Однако, в случае если введен ортонормированный базис, можно обойтись без такого обобщения.

Рассмотрим евклидово пространство L = = $\langle {{e}_{1}},{{e}_{2}}, \ldots ,{{e}_{n}}\rangle $ и найдем геометрические произведения базисных векторов ${{e}_{i}}$.

Произведение базисного вектора самого на себя находится из определения:

${{e}_{i}}{{e}_{i}} = ({{e}_{i}},{{e}_{i}}) = e_{i}^{2}.$

Для произведения ${{e}_{i}}{{e}_{j}}$, где $i \ne j$ можно доказать следующее равенство [3]

${{e}_{i}}{{e}_{j}} = - {{e}_{j}}{{e}_{i}},\quad i \ne j,$

Где ${{e}_{i}}{{e}_{j}} = {{e}_{i}} \wedge {{e}_{j}}$. Вообще, для любого ортонормированного базиса справедливо тождество ${{e}_{{{{i}_{1}}}}}$ ... ${{e}_{{{{i}_{p}}}}}{{e}_{1}} \wedge \ldots \wedge {{e}_{p}}$ то есть базисные p-векторы могут быть записаны через геометрическое произведение.

Пользуясь указанными выше свойствами, можно находить геометрическое произведение любых мультивекторам, достаточно знать их разложение по базисным p-векторам. Например:

$\begin{gathered} (3 + 5{{e}_{1}}{{e}_{2}} - {{e}_{1}}{{e}_{3}})(4{{e}_{1}}{{e}_{2}}{{e}_{3}}) = \\ = \;12{{e}_{1}}{{e}_{2}}{{e}_{3}} + 20{{e}_{1}}{{e}_{2}}{{e}_{1}}{{e}_{2}}{{e}_{3}} - 4{{e}_{1}}{{e}_{3}}{{e}_{1}}{{e}_{2}}{{e}_{3}} = \\ = \;12{{e}_{1}}{{e}_{2}}{{e}_{3}} - 20{{e}_{3}} - 4{{e}_{2}}. \\ \end{gathered} $

Это справедливо, так как

$\begin{gathered} {{e}_{1}}{{e}_{2}}{{e}_{1}}{{e}_{2}}{{e}_{3}} = - {{e}_{1}}\underbrace {{{e}_{2}}{{e}_{2}}}_1{{e}_{1}}{{e}_{3}} = - \underbrace {{{e}_{1}}{{e}_{1}}}_{ = 1}{{e}_{3}} = - {{e}_{3}}, \\ {{e}_{1}}{{e}_{3}}{{e}_{1}}{{e}_{2}}{{e}_{3}} = {{e}_{1}}\underbrace {{{e}_{3}}{{e}_{3}}}_{ = 1}{{e}_{1}}{{e}_{2}} = \underbrace {{{e}_{1}}{{e}_{1}}}_{ = 1}{{e}_{2}} = {{e}_{2}}. \\ \end{gathered} $

4.4. Случай трехмерного пространства

В трехмерном декартовом пространстве мультивектор в общем случае будет иметь следующий вид:

$\begin{gathered} V = {{{v}}^{0}} + {{{v}}^{1}}{{e}_{1}} + {{{v}}^{2}}{{e}_{2}} + {{{v}}^{3}}{{e}_{3}} + \\ + \;{{{v}}^{{12}}}{{e}_{1}}{{e}_{2}} + {{{v}}^{{23}}}{{e}_{2}}{{e}_{3}} + {{{v}}^{{13}}}{{e}_{1}}{{e}_{3}} + {{{v}}^{{123}}}{{e}_{1}}{{e}_{2}}{{e}_{3}} \\ \end{gathered} $

Обозначим ${{e}_{1}}{{e}_{2}}{{e}_{3}}$ как $I$. Тогда верно равенство

$\begin{gathered} II = {{e}_{1}}{{e}_{2}}{{e}_{3}}{{e}_{1}}{{e}_{2}}{{e}_{3}} = {{e}_{1}}{{e}_{1}}{{e}_{2}}{{e}_{3}}{{e}_{2}}{{e}_{3}} = \\ = \; - {{e}_{1}}{{e}_{1}}{{e}_{2}}{{e}_{2}}{{e}_{3}}{{e}_{3}} = - 1 \Rightarrow \boxed{{{I}^{2}} = - 1}. \\ \end{gathered} $

Также, переставляя сомножители и правильно меняя знак, можно показать, что

${{e}_{1}}I = + {{e}_{2}}{{e}_{3}},$$I{{e}_{1}} = + {{e}_{2}}{{e}_{3}},$
${{e}_{2}}I = - {{e}_{1}}{{e}_{3}},$$I{{e}_{2}} = - {{e}_{1}}{{e}_{3}},$
${{e}_{3}}I = + {{e}_{1}}{{e}_{2}},$$I{{e}_{3}} = + {{e}_{1}}{{e}_{2}},$
${{e}_{1}}{{e}_{2}}I = - {{e}_{3}},$$I{{e}_{1}}{{e}_{2}} = - {{e}_{3}},$
${{e}_{1}}{{e}_{3}}I = + {{e}_{2}},$$I{{e}_{1}}{{e}_{3}} = + {{e}_{2}},$
${{e}_{2}}{{e}_{3}}I = - {{e}_{1}},$$I{{e}_{2}}{{e}_{3}} = - {{e}_{1}}.$

Видно, что $I$ коммутирует с базисными векторами и бивекторами: $I{{e}_{i}} = {{e}_{i}}I$ и $I{{e}_{i}}{{e}_{j}} = {{e}_{i}}{{e}_{j}}I$ из чего следует, что произвольный мультивектор $U$ в трехмерном пространстве коммутирует с $I$:

$IU = UI.$

Также для произвольного бивектора справедливы равенства

$I\mathop U\limits_2 = \mathop v\limits_1 \quad {\text{и}}\quad \mathop U\limits_2 I = - \mathop v\limits_1 ,$
что дает возможность записать произвольный мультивектор в виде

$V = {{{v}}^{0}} + u + vI + {{{v}}^{{123}}}I$

Кроме того, с помощью $I$ можно связать внешнее и векторное произведения:

$Iu \times v = u \wedge v,\quad u \times v = - Iu \wedge v$

Обозначим

$i = {{e}_{1}}{{e}_{2}},\quad j = {{e}_{2}}{{e}_{3}},\quad k = {{e}_{1}}{{e}_{3}}.$

Данные бивекторы ведут себя точно также как и мнимые единицы кватернионов. Можно составить таблицу умножения:

$\begin{array}{*{20}{c}} {}&\vline & 1&\vline & i&\vline & j&\vline & k \\ \hline 1&\vline & 1&\vline & i&\vline & j&\vline & k \\ \hline i&\vline & i&\vline & { - 1}&\vline & k&\vline & { - j} \\ \hline j&\vline & j&\vline & { - k}&\vline & { - 1}&\vline & { - i} \\ \hline k&\vline & k&\vline & j&\vline & { - i}&\vline & { - 1} \end{array}$

Кроме того $ijk = - 1$.

Таким образом в трехмерном пространстве множество мультивекторов вида

$V = {{{v}}^{0}} + \mathop v\limits_2 $
изоморфно множеству кватернионов.

5. ИСПОЛЬЗОВАНИЕ КВАТЕРНИОНОВ ДЛЯ ОПИСАНИЯ ПОВОРОТОВ В ТРЕХМЕРНОМ ПРОСТРАНСТВЕ

Кватернионами [16] называют гиперкомплексные числа вид $q = {{q}_{0}} + i{{q}_{1}} + j{{q}_{2}} + k{{q}_{3}}$, где i, $j$ и $k$ – мнимые единицы, обладающие следующими свойствами: ${{i}^{2}} = {{j}^{2}} = {{k}^{2}} = ijk = 1$, $ij = - ji = k$, $jk = - kj = i$ и $ki = - ik = j$.

В терминах общей алгебры говорят, что множество кватернионов с операцией сложения и умножения образуют тело, то есть ассоциативное, унитарное, некоммутативное по умножению кольцо. Обратный элемент в таком кольце существует для любого ненулевого элемента.

Мнимые единицы $i$, $j$, $k$ ассоциируют с тремя ортами $i$, $j$ и $k$. Число ${{q}_{0}}$ называют скалярной частью кватерниона, а элемент ${{q}_{1}}i + {{q}_{2}}j + {{q}_{3}}k$ – векторной частью, которой дают простую геометрическую интерпретацию в виде вектора $q = {{({{q}_{1}},{{q}_{2}},{{q}_{3}})}^{{\text{т}}}}$. Кватернион, состоящий только из векторной части, называют чистым. Кватернион в общем случае записывают как

$q = {{q}_{0}} + q = {{q}_{0}} + {{q}_{1}}i + {{q}_{2}}j + {{q}_{3}}k.$

Для кватерниона определяют норму и комплексное сопряжение:

$\begin{gathered} \mathop {\left\| q \right\|}\nolimits^2 = q_{0}^{2} + (q,q) = q_{0}^{2} + q_{1}^{2} + q_{2}^{2} + q_{3}^{2} \\ {\text{и}}\quad q* = {{q}_{0}} - q. \\ \end{gathered} $

Кватернион с нормой, равной единице, называют нормированным. Обратный элемент для произвольного кватерниона вычисляется как ${{q}^{{ - 1}}} = \tfrac{{q{\text{*}}}}{{\mathop {\left\| q \right\|}\nolimits^2 }}$, а для нормированного обратным является сопряженный к нему кватернион: ${{q}^{{ - 1}}} = q{\text{*}}$.

Нормированный кватернион можно представить в особенно простом тригонометрическом виде:

$q = {{q}_{0}} + q = cos\theta + usin\theta ,\quad u = \frac{q}{{\left| q \right|}},$
где угол $\theta $ лежит в полуинтервале $( - \pi ,\pi ]$. При умножении двух кватернионов с углами $\alpha $ и $\beta $ соответственно, получаем кватернион с углом $\alpha + \beta $.

Кватернионы нашли свое применение в теории трехмерных вращений. Если поставить в соответствие некоторому вектору в трехмерном евклидовом пространстве чистый кватернион ${v} = v = i{{{v}}^{1}} + j{{{v}}^{2}} + k{{{v}}^{3}}$, то следующая операция

$w = qvq* = (2q_{0}^{2} - 1)v + 2(q,v)q + 2{{q}_{0}}q \times v$
эквивалентна повороту вектора $v$ на угол $2\theta $ вокруг оси $q$, где q – нормированный кватернион $q = cos\theta + usin\theta $. Вращение в противоположную сторону задается похожей операцией:

$w = q{\text{*}}vq = (2q_{0}^{2} - 1)v + 2(v,q)q + 2{{q}_{0}}v \times q.$

Вращение с помощью кватернионов стало стандартом де-факто в области компьютерной графики, вытеснив альтернативное описание с помощью углов Эйлера. С чисто алгоритмической точки зрения, кватернионное описание вращений очень эффективно, однако менее наглядно из-за сложностей в геометрической интерпретации угла $\theta $. Далее рассмотрим подход к описанию поворотов с помощью мультивекторов особого вида, который столь же алгоритмически прост, но при этом имеет гораздо большую общность и геометрическую наглядность.

5.1. Повороты в трехмерном пространстве

Рассмотрим вектор $v$ и умножим его слева на некоторый вектор $a$, а справа на обратный вектор a–1. Так как операция геометрического произведения не коммутативна, то мы получим вектор $v{\text{'}}$ отличный от $v$. Пользуясь тем, что ${{u}_{{\parallel v}}} = \tfrac{{(u,v)}}{v}$ и ${{u}_{{ \bot v}}} = \tfrac{{u \wedge v}}{v}$ получим:

$\begin{gathered} v{\text{'}} = av{{a}^{{ - 1}}}\frac{{av}}{a} = \frac{{(a,v)}}{a} + \frac{{a \wedge v}}{a} = \\ = \;\frac{{(v,a)}}{a} - \frac{{v \wedge a}}{a} = {{v}_{{\parallel a}}} - {{v}_{{ \bot a}}}. \\ \end{gathered} $

Таким образом, вектор $v{\text{'}}$ является отражением вектора $v$ относительно вектора $a$. Для двумерного случая данная процедура проиллюстрированна на рис. 1.

Рис. 1.

Отражение вектора $v$ относительно вектора a

Заметим, что длина (норма) вектора $v$ сохраняется. Так как по определению геометрического произведения $aa = \mathop {\left\| a \right\|}\nolimits^2 $, то

$\begin{gathered} {\text{||}}av{{a}^{{ - 1}}}{\text{|}}{{{\text{|}}}^{2}} = av{{a}^{{ - 1}}}av{{a}^{{ - 1}}} = \frac{1}{{\mathop {\left\| a \right\|}\nolimits^4 }}avaava = \\ = \;\frac{1}{{\mathop {\left\| a \right\|}\nolimits^4 }}av\mathop {\left\| a \right\|}\nolimits^2 va = \frac{1}{{\mathop {\left\| a \right\|}\nolimits^2 }}a\mathop {\left\| v \right\|}\nolimits^2 a = \\ = \;\mathop {\left\| v \right\|}\nolimits^2 \frac{1}{{\mathop {\left\| a \right\|}\nolimits^2 }}aa = \mathop {\left\| v \right\|}\nolimits^2 . \\ \end{gathered} $

В случае единичного вектора $a$ обратный вектор ${{a}^{{ - 1}}}$ совпадает с самим $a$ так как норма a = 1 и операция отражения сводится к умножению на вектор $a$ слева и справа: $v{\text{'}} = ava$.

Вектор $v$ – отражение вектора $v$ относительно вектора $a$. Длины векторов $v{\text{'}}$ и $v$ совпадают и значения углов $\angle (v,a)$ и $\angle (a,v{\text{'}})$. Следовательно, геометрические произведения $av$ и $v{\text{'}}a$ совпадают:

$v{\text{'}}a = av{{a}^{{ - 1}}}a = av.$

На рис. 2 показаны бивекторы $a \wedge v$ и $v{\text{'}} \wedge a$.

Рис. 2.

Равенство бивекторных частей мультивекторов $av$ и $v{\text{'}}a$

Рис. 3.

Поворот

Применим к вектору $v$ последовательно два отражения: относительно вектора $a$, а затем относительно вектора $b$:

$v{\text{'}} = av{{a}^{{ - 1}}},$
$v{\text{''}} = bv{\text{'}}{{b}^{{ - 1}}} = bav{{a}^{{ - 1}}}{{b}^{{ - 1}}} = bav{{(ba)}^{{ - 1}}}.$

Мультивектор $ba$ обозначают как $R$ и называют ротором (вращателем).

$v{\text{''}} = Rv{{R}^{{ - 1}}}$
$R$ вращает $v$ на угол $2\theta $ от $a$ к $a$$b$, где $\theta = \angle (a,b)$ (см. рис. справа). Вращение происходит от $a$ к $a$ параллельно плоскости соответствующей бивектору $a \wedge b$, а не $ba$, поэтому $R$ записывают как

$R = (b,a) + b \wedge a = (a,b) - a \wedge b$

Формула для вращения $v{\text{'}} = Rv{{R}^{{ - 1}}}$ остается справедливой для любой размерности, а не только для двумерного или трехмерного случая.

Ротор $R$ можно применять к объектам более высокого порядка, чем векторы, например:

$Ruv{{R}^{{ - 1}}} = Ru{{R}^{{ - 1}}}Rv{{R}^{{ - 1}}} = (Ru{{R}^{{ - 1}}})(Rv{{R}^{{ - 1}}}).$

Рассмотрим трехмерный случай для нормированных векторов $a$ и $b$. Так как

$\begin{gathered} a \wedge b = \overline {a \times b} = \overline {\underbrace {\left\| a \right\|\left\| b \right\|}_{ = 1}sin\theta n} = \\ = \;sin\theta \bar {n},\quad \bar {n} = \frac{{a \times b}}{{\left\| {a \times b} \right\|}}, \\ \end{gathered} $
то

$R = cos\theta - sin\theta \bar {n}.$

Такой ротор повернет вектор на угол $2\theta $. Если нужен поворот на угол $\theta $, то нужно взять половинный угол:

$R = cos\frac{\theta }{2} - sin\frac{\theta }{2}\bar {n}.$

5.2. Сравнение с кватернионами

Применение мультивекторов не дает очевидного вычислительного выигрыша по сравнению с кватернионами. Однако можно выделить ряд концептуальных преимуществ

• Ротор $R$ и операция $Rv{{R}^{{ - 1}}}$ задают вращение в пространстве любой размерности.

• Операция $Rv{{R}^{{ - 1}}}$ находит геометрическую интерпретацию в виде двойного отражения. В случае кватернионов операция $qvq{\text{*}}$ вводится ad hoc.

• Угол $\theta $ имеет геометрический смысл угла между a и b. В случае кватернионов геометрическая интерпретация данного угла затруднительна.

6. МОДУЛЬ GRASSMANN.JL ДЛЯ ЯЗЫКА JULIA

6.1. Базовые возможности модуля Grassmann.jl

Модуль Grassmann.jl [17, 18] предназначен для языка программирования Julia. В нем реализованны все базовые операции геометрической алгебры. Одной из особенностей является поддержка смешанных численно-символьных вычислений: основные вычисления выполняются численно, но при подключении модуля Reduce появляется возможность задавать символьные компоненты и параметры.

Рассмотрим вначале базовый функционал данного модуля на примерах, повторяющих примеры изложенные нами выше. Укажем также на ошибки с которыми мы столкнулись в ходе изучения данного пакета. Наши замечания справедливы для версии библиотеки |0.7.5|. Рассмотрим следующий фрагмент кода.

1 G2 = L(^2) # DirectSum.Basis{++,4}(v, v1,

     ↪ v2, v12)

2 @basis ^2

3 complementright(e1), complementright(e2) #

     ↪ (1v2, -1v1)

4 complementleft(e1), complementleft(e2) #

     ↪ (-1v2, 1v1)

5 using Reduce

6 u = :u1 * e1 + :u2 * e2

7 complementright(u) # Error

8 u = 1*e1 + 2*e2

9 complementright(u) # -2v1 + 1v2

10 complementleft(u) # 2v1 - 1v2

Работа начинается с задания размерности пространства $L$, после чего генерируются все возможные p-векторы для пространства $\Lambda (L)$. В первой строке представлен вариант задания двумерного пространства $\Lambda (L) = \mathbb{R} \oplus L \oplus {{\Lambda }^{2}}(L)$ без экспорта сгенерированных базисных векторов в общее пространство имен, а во второй строке с экспортом.

Отметим, что для исходного кода на языке Julia общепринятым является использование различных специфических символов в кодировке Unicode. Для ввода тех символов, которые обычно используются в математике можно применять макросы LATEX. Так, например, для ввода буквы $\Lambda $ в Jupyter Notebook или во встроенной оболочке, следует набрать \Lambda и нажать клавишу Tab. Некоторые макросы определены непосредственно в подключаемых пакетах. В нашем примере букву $\mathbb{R}$ можно ввести с помощью макроса /bbR, о чем, между прочим, ничего не сказано в официальной документации пакета Grassmann.

Далее (строки 3 и 4) мы применяем операции правого и левого дополнения. Вначале используется смешанный численно-символьный вариант, а затем делается попытка использовать чисто символьный вариант, однако она приводит к неудаче. Опытным путем авторами было установленно, что кроме операции внешнего произведения все остальные операции символьные вычисления не поддерживают. Ниже приведем пример вычисления ориентированной площади $S = \overline {u \wedge w} $ в символьном виде.

1 u = :u1 * e1 + :u2 * e2

2 w = :w1 * e1 + :w2 * e2

3 u w # (u1 * w2 - u2 * w1)v12

4 # u = (1, 2) w = (2, 1)

5 complementright(uw), complementleft(uw) #

        ↪ -3v

6 complementright(wu), complementleft(wu) #

        ↪ +3v

Ниже показаны примеры вычисления векторного и смешанного произведений с помощью внешнего произведения и правого дополнения: $u \times w = \overline {u \wedge w} $ и $(u,{v},w) = \overline {u \wedge v \wedge w} $.

1 @basis ^3

2 uw # (u1 * w2 - u2 * w1)v12 + (u1 * w3 - u3

    ↪ * w1)v13 + (u2 * w3 - u3 * w2)v23

3 complementright(uw) # Error!

4 complementright.((e12, e13, e23)) # (1v3,

    ↪ -1v2, 1v1)

Операция $ * $ переопределена для геометрического умножения. Можно перемножать мультивекторы, разложенные по базисным p-векторам, как это показано в фрагменте кода ниже.

1 (3 + 5*e1*e2 - e1*e3) * (4*e1*e2*e3) # - 4v2

     ↪ - 20v3 + 12v123

2 e1*e2*e1*e2*e3 # -1v3

3 e1*e3*e1*e2*e3 # 1v2

Относительно операции геометрического произведения множество мультивекторов вида V = = $a + b{{e}_{{12}}}$ изоморфно множеству комплексных чисел в случае двумерного пространства $L$. Данные мультивекторы состоят только из скалярной и бивекторной части, а векторная часть равна нулю. Продемонстрируем этот факт на следующем примере, сравнив действия с мультивекторами с встроенным в язык Julia типом данных комплексных чисел.

1 (1e + 2*e12) * (2e + e12) # 0 + 5v12

2 (1 + 2im)*(2 + im) # 0+5im

3 (1.0e + 2*e12) / (2.0e + e12) # 0.8 + 0.6v12

4 (1 + 2im) / (2 + im) # 0.8 + 0.6im

5 sqrt(1.0e + 2*e12) # 1.2720196542002786 +

     ↪ 0.7861513560627762v12

6 sqrt(1 + 2im) # 1.272019649514069 +

     ↪ 0.7861513777574233im

Отметим, что в выражении sqrt(1.0e + 2*e12) нам пришлось указать 1.0 вместо 1, так как иначе возникает ошибка извлечение квадратного корня из целого числа, появляющаяся из-за отсутствия явного приведения типов.

Стоит повысить размерность пространства $L$ до 3, как мультивекторы того же вида V = a + + $b{{e}_{{12}}} + c{{e}_{{23}}} + d{{e}_{{13}}}$ становятся изоморфными относительно операции геометрического произведения множеству кватернионов. Бивекторная часть в трехмерном пространстве имеет уже три компонента. Следующий код позволяет распечатать таблицу умножения мнимых единиц кватернионов.

1 using Printf

2 @basis ^3 L e

3 i = e12; j = e23; k = e13

4 for x in (1e, i, j, k)

5 @printf “%6s|%6s|%6s|%6s\n” x*1e x*i x*j

       ↪ x*k

6 end

7 i*j*k # -1v

6.2. Реализация роторов

Рассмотрим конкретный пример вращения вектора [16]. При задании вращения в трехмерном пространстве вначале следует определить ось вращения. Для примера возьмем в качестве такой оси нормированный вектор $u = \tfrac{1}{{\sqrt 3 }}(1,\;1,\;1)$ вокруг которого на угол $\tfrac{{2\pi }}{3}$ поворачивается базисный вектор (орт) ${{e}_{1}}$. Из геометрических соображений понятно, что результатом такого вращения будет другой орт ${{e}_{2}}$.

Если необходимо задать вращение в терминах мультивекторов, то следует задавать не ось вращения, а плоскость, параллельно которой данное вращение происходит. Данная плоскость определяется некоторым бивектором вида $U = a \wedge b$. Чтобы вычислить $U$ следует взять правое дополнение от оси вращения $u$:

$U = \bar {u}.$

После чего можно вычислить ротор, используя его тригонометрическую форму:

$R = cos\frac{\pi }{3} - sin\frac{\pi }{3}U$

Далее с помощью этого ротора производится вращение:

$Re{{R}^{{ - 1}}} = ReR{\text{*}}.$

Продемонстрируем вычисление данного примера с помощью пакета Grassmann. Оператор ~ является синонимом функции reverse взятия обратного элемента.

1 u = (v1 + v2 + v3)/sqrt(3)

2 # 0.5773502691896258v1 +

     ↪ 0.5773502691896258v2 +

     ↪ 0.5773502691896258v3

3 U = complementright(u)

4 # 0.5773502691896258v12 -

     ↪ 0.5773502691896258v13 +

     ↪ 0.5773502691896258v23

5 R = cos(π/3) - sin(π/3)*U

6 # 0.5000000000000001 - 0.5v12 + 0.5v13 -

     ↪ 0.5v23

7 R*v1*(~R)

8 # 0.0 + 1.1102230246251565e-16v1 + 1.0v2 -

     ↪ 1.1102230246251565e-16v3 -

     ↪5.551115123125783e-17v123

7. ЗАКЛЮЧЕНИЕ

Формализм геометрической алгебры является элегантным способом представления алгебры Клиффорда. При всей своей простоте она еще не стала привычным инструментом научного исследования. И нам представляется, что именно использование аналитико-численного подхода позволит внедрить данный формализм в практику научных исследований.

Список литературы

  1. Reed M.E. Differential geometric algebra with leibniz and grassmann // Proceedings of JuliaCon, 2019. P. 1–6.

  2. Кострикин А.И. Линейная алгебра. М.: МЦНМО, 2009. Т. 2. 368 с.

  3. Dorst L., Fontijne D., Mann S. Geometric algebra for computer science (with errata). The Morgan Kaufmann Series in Computer Graphics. 1 ed. Morgan Kaufmann, 2007.

  4. Lengyel E. Mathematics. Lincoln, California: Terathon Software LLC. 2016. V. 1. 195 p.

  5. Chisolm E. Geometric algebra, 2012, arXiv: 1205.5935.

  6. Hitzer E. Introduction to clifford’s geometric algebra. 2012. V. 51. № 4. P. 338–350.

  7. Bezanson J., Edelman A., Karpinski S., Shah V.B. Julia: A fresh approach to numerical computing // SIAM Review. 2017. V. 59. № 1. P. 65–98. arXiv: 1411.1607.

  8. Геворкян М.Н., Королькова А.В., Кулябов Д.С. Использование шаблонизатора как инструментария компьютерной алгебры // Программирование. 2021. № 1. С. 25–34.

  9. Bezanson J., Karpinski S., Shah V.B., Edelman A. Julia: A fast dynamic language for technical computing. 2012. P. 1–27. arXiv: 1209.5145.

  10. Gevorkyan M.N., Demidova A.V., Korolkova A.V., Kulyabov D.S. Statistically significant performance testing of julia scientific programming language // Journal of Physics: Conference Series. 2019. V. 1205. № 1. P. 012017.

  11. Gevorkyan M.N., Korolkova A.V., Kulyabov D.S., Lovetskiy K.P. Statistically significant comparative performance testing of julia and fortran languages in case of runge–kutta methods // Numerical Methods and Applications. NMA 2018 / Ed. by Geno Nikolov, Natalia Kolkovska, Krassimir Georgiev. Cham: Springer International Publishing, 2019. V. 11189 of Lecture Notes in Computer Science. P. 400–407.

  12. Кулябов Д.С., Королькова А.В. Компьютерная алгебра на julia // Программирование. 2021. № 2. С. 44–50.

  13. Browne J. Grassmann Algebra. CreateSpace Independent Publishing Platform, 2012. V. 1. 588 p.

  14. Eastwood M.G., Michor P. Some remarks on the pluecker relations. 2000. V. 63. P. 85–88.

  15. Казанова Г. Векторная алгебра / Под ред. М.К. Поливанов. Современная математика. М.: Мир, 1979. 120 с.

  16. Kuipers J.B. Quaternions And Rotation Sequences. Princeton, New Jersey: Princeton University Press, 2002. 391 p.

  17. Reed M.E. Grassmann.jl documentation site. 2021. https://grassmann.crucialflow.com/stable/.

  18. Reed M.E. Grassmann.jl code. 2021. https://github.com/chakravala/Grassmann.jl.

Дополнительные материалы отсутствуют.