@c Language=Russian
@c Encoding=UTF-8
@c File=Atensor.texi
@c OriginalRevision=1.10
@c TranslatedBy: (c) 2005-12 Valery Pipin <pip@iszf.irk.ru>

@menu
* Введение в пакет atensor::
* Функции и переменные пакета atensor::
@end menu

@node Введение в пакет atensor, Функции и переменные пакета atensor, Пакет atensor, Пакет atensor
@section Введение в пакет atensor

Пакет @code{atensor} предназначен для вычислений с тензорными алгебрами.
Для того, чтобы использовать @code{atensor}, надо ввести
@code{load("atensor")}, с последующим вызовом функции @code{init_atensor}.

Основой пакета @code{atensor} является набор правил упрощения для
оператора некоммутативного произведения ("@code{.}" -- dot product).
@code{atensor} знает несколько типов алгебр и соответствующий
набор правил активизируется при вызове функции @code{init_atensor}.

Возможности пакета @code{atensor} можно продемонстрировать определив
алгебру кватернионов как алгебру Клиффорда Cl(0,2) с двумя базисными
векторами.  В этом случае три кватернионные мнимые единицы
представляются двумя базисными векторами и их произведением:

@example
    i = v     j = v     k = v  . v
         1         2         1    2
@end example

Хотя @code{atensor} имеет встроенное определение алгебры кватернионов,
оно не используется в данном примере, в котором мы построим
таблицу умножения кватернионов в виде матрицы:

@example

(%i1) load("atensor");
(%o1)       /share/tensor/atensor.mac
(%i2) init_atensor(clifford,0,0,2);
(%o2)                                done
(%i3) atensimp(v[1].v[1]);
(%o3)                                 - 1
(%i4) atensimp((v[1].v[2]).(v[1].v[2]));
(%o4)                                 - 1
(%i5) q:zeromatrix(4,4);
                                [ 0  0  0  0 ]
                                [            ]
                                [ 0  0  0  0 ]
(%o5)                           [            ]
                                [ 0  0  0  0 ]
                                [            ]
                                [ 0  0  0  0 ]
(%i6) q[1,1]:1;
(%o6)                                  1
(%i7) for i thru adim do q[1,i+1]:q[i+1,1]:v[i];
(%o7)                                done
(%i8) q[1,4]:q[4,1]:v[1].v[2];
(%o8)                               v  . v
                                     1    2
(%i9) for i from 2 thru 4 do for j from 2 thru 4 do
      q[i,j]:atensimp(q[i,1].q[1,j]);
(%o9)                                done
(%i10) q;
                   [    1        v         v      v  . v  ]
                   [              1         2      1    2 ]
                   [                                      ]
                   [   v         - 1     v  . v    - v    ]
                   [    1                 1    2      2   ]
(%o10)             [                                      ]
                   [   v      - v  . v     - 1      v     ]
                   [    2        1    2              1    ]
                   [                                      ]
                   [ v  . v      v        - v       - 1   ]
                   [  1    2      2          1            ]
@end example

В качестве базисных векторов @code{atensor} использует переменные с
индексом.  Символ переменой хранится в @code{asymbol} а индекс
может принимать значения от 1 до @code{adim}.
Для переменных с индексом вычисляются билинейные формы
@code{sf}, @code{af} и  @code{av}.  Вычисление подставляет значение
@code{aform[i,j]} вместо @code{fun(v[i],v[j])},
где @code{v} есть значение @code{asymbol} и @code{fun} есть @code{af}
или @code{sf}; либо подставляет @code{v[aform[i,j]]} вместо
@code{av(v[i],v[j])}.

Функции @code{sf}, @code{af} и @code{av} могут быть переопределены
пользователем.

Когда пакет @code{atensor} загружен, устанавливаются следующие
значения переключателей:

@example
dotscrules:true;
dotdistrib:true;
dotexptsimp:false;
@end example

Если вы хотите поэкспериментировать с неассоциативными алгебрами
надо присвоить @code{dotassoc} значение @code{false}.  Однако, в
данном случае @code{atensimp} не всегда может получить желаемое
упрощение.

@opencatbox{Категории:}
@category{Тензоры}
@category{Пакеты библиотеки share}
@category{Пакет atensor}
@closecatbox


@node Функции и переменные пакета atensor,  , Введение в пакет atensor, Пакет atensor

@section Функции и переменные пакета atensor

@deffn {Функция} init_atensor (@var{alg_type}, @var{opt_dims})
@deffnx {Функция} init_atensor (@var{alg_type})

Инициализирует пакет @code{atensor} с указанием типа алгебры.
Здесь @var{alg_type} может принимать одно из следующих
значений:

@code{universal}: Универсальная алгебра без определенных правил
коммутации.

@code{grassmann}: Алгебра Грассмана, определяемая коммутационным правилом
@code{u.v+v.u=0}.

@code{clifford}: Алгебра Клиффорда, определяемая коммутационным
правилом @code{u.v+v.u=-2*sf(u,v)}, где @code{sf} есть симметричная
скалярная функция.  Для этой алгебры @var{opt_dims} может задавать до 3-х
неотрицательных целых чисел, которые представляют собой число
положительных, вырожденных и отрицательных размерностей алгебры.
Если @var{opt_dims} задано, то @code{atensor} автоматически
сконфигурирует значения @code{adim} и @code{aform}.  В противном
случае @code{adim} принимает значение 0 а @code{aform}
остается неопределенным.

@code{symmetric}:  Симметричная алгебра, определяемая коммутационным
правилом @code{u.v-v.u=0}.

@code{symplectic}: Симплектическая алгебра, определяемая
коммутационным правилом @code{u.v-v.u=2*af(u,v)}, гда @code{af} есть
антисимметричная скалярная функция.  Для симплектической алгебры
@var{opt_dims} может задавать до двух неотрицательных целых чисел,
представляющих число невырожденных и вырожденных измерений соответственно.
Если @var{opt_dims} задано, то @code{atensor} автоматически
сконфигурирует значения @code{adim} и @code{aform}.  В противном
случае @code{adim} принимает значение 0 а @code{aform}
остается неопределенным.

@code{lie_envelop}: Обертывающая алгебра Ли, определяемая
коммутационным правилом @code{u.v-v.u=2*av(u,v)}, где @code{av} есть
антисимметричная функция.

@code{init_atensor} также распознает несколько предопределенных
типов алгебр:

@code{complex} реализует алгебру комплексных чисел, как алгебру
Клиффорда Cl(0,1).  Вызов @code{init_atensor(complex)} эквивалентен
@code{init_atensor(clifford,0,0,1)}.

@code{quaternion} реализует алгебру кватернионов. Вызов
@code{init_atensor(quaternion)} эквивалентен
@code{init_atensor(clifford,0,0,2)}.

@code{pauli} реализует алгебру спиноров Паули как алгебру Клиффорда
Cl(3,0).  Вызов @code{init_atensor(pauli)} эквивалентен
@code{init_atensor(clifford,3)}.

@code{dirac} реализует алгебру спиноров Дирака как алгебру Клиффорда
Cl(3,1). Вызов @code{init_atensor(dirac)} эквивалентен
@code{init_atensor(clifford,3,0,1)}.

@opencatbox{Категории:}
@category{Пакет atensor}
@closecatbox

@end deffn


@deffn {Функция} atensimp (@var{expr})

Упрощает алгебраическое выражение @var{expr} в соответствии с
правилами, определенными при вызове @code{init_atensor}.
Упрощение сводится к рекурсивному применению коммутационных правил
м вычислению, где возможно, значений @code{sf}, @code{af} и @code{av}.
При этом применяются предосторожности, обеспечивающие то,
что процесс упрощения завершится.

@opencatbox{Категории:}
@category{Пакет atensor}
@category{Упрощающие функции}
@closecatbox

@end deffn


@deffn {Функция} alg_type

Тип алгебры.  Допустимые значения:  @code{universal}, @code{grassmann},
@code{clifford}, @code{symmetric}, @code{symplectic} или @code{lie_envelop}.

@opencatbox{Категории:}
@category{Пакет atensor}
@closecatbox

@end deffn

@defvr {Переменная} adim
Значение по умолчанию: 0

Размерность алгебры.  @code{atensor} использует @code{adim}
для того чтобы определить является ли индексированный объект
допустимым базисным вектором.  См. @code{abasep}.

@opencatbox{Категории:}
@category{Пакет atensor}
@category{Глобальные переменные}
@closecatbox

@end defvr

@defvr {Переменная} aform
Значение по умолчанию: @code{ident(3)}

Значение билинейных форм @code{sf}, @code{af} или
@code{av}.  Значение по умолчанию -- единичная 3х3 матрица @code{ident(3)}.

@opencatbox{Категории:}
@category{Пакет atensor}
@category{Глобальные переменные}
@closecatbox

@end defvr

@defvr {Переменная} asymbol
Значение по умолчанию: @code{v}

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

@opencatbox{Категории:}
@category{Пакет atensor}
@category{Глобальные переменные}
@closecatbox

@end defvr

@deffn {Функция} sf (@var{u}, @var{v})

Симметричная скалярная функция, используемая в коммутационных
правилах.  По умолчанию с помощью @code{abasep} проверяется, что
оба аргумента функции являются базисными векторами, и если это так,
подставляется соответствующее значение из матрицы @code{aform}.

@opencatbox{Категории:}
@category{Пакет atensor}
@closecatbox

@end deffn

@deffn {Функция} af (@var{u}, @var{v})

Антисимметричная скалярная функция, используемая в коммутационных
правилах.  По умолчанию с помощью @code{abasep} проверяется, что
оба аргумента функции являются базисными векторами, и если это так,
подставляется соответствующее значение из матрицы @code{aform}.

@opencatbox{Категории:}
@category{Пакет atensor}
@closecatbox

@end deffn

@deffn {Функция} av (@var{u}, @var{v})

Антисимметричная скалярная функция, используемая в коммутационных
правилах.  По умолчанию с помощью @code{abasep} проверяется, что
оба аргумента функции являются базисными векторами, и если это так,
подставляется соответствующее значение из матрицы @code{aform}.

Например:

@example
(%i1) load("atensor");
(%o1)       /share/tensor/atensor.mac
(%i2) adim:3;
(%o2)                                  3
(%i3) aform:matrix([0,3,-2],[-3,0,1],[2,-1,0]);
                               [  0    3   - 2 ]
                               [               ]
(%o3)                          [ - 3   0    1  ]
                               [               ]
                               [  2   - 1   0  ]
(%i4) asymbol:x;
(%o4)                                  x
(%i5) av(x[1],x[2]);
(%o5)                                 x
                                       3
@end example

@opencatbox{Категории:}
@category{Пакет atensor}
@closecatbox

@end deffn


@deffn {Функция} abasep (@var{v})

Проверяет является ли аргумент базисным вектором для @code{atensor}.
Т.е. проверяет, что: это индексированная переменная, символ этой
переменной совпадает с значением @code{asymbol}, индекс имеет
числовое значение в пределах от 1 до @code{adim}.

@opencatbox{Категории:}
@category{Пакет atensor}
@category{Функции предикаты}
@closecatbox

@end deffn
