Content uploaded by Valery Pipin
Author content
All content in this area was uploaded by Valery Pipin
Content may be subject to copyright.
Тензорная Алгебра в Maxima.
2 апреля 2003 г.
.. В.Пипин
Институт Солнечно-Земной Физики, Иркутск
1
.
Предисловие.
Ниже будут рассмотрены основные операции тензорной алгебры, которые можно прово-
дить в maxima с помощью пакета itensor. При написании данного документа я ориенти-
ровался на руководство [1] описывающее основные функции доступные в itensor. Статья
[1] поставляется вместе с maxima (можно найти в maxima*/share/tensor/tensor-doc.txt).
Данную статью можно рассматривать как дополнение к [1]. Мы постарались изложить
материал более-менее систематически, следуя основным этапам введения тензорного ис-
числения. Кроме того мы рассматриваем только "работающие” функции. Дело в том,
часть из функций, описанных [1] в настоящий момент не может быть использована, по-
видимому в силу того, что изначально itensor был написан для реализации лисп, которая
сильно отличается от современных лисп-диалектов используемых в maxima в настоящий
момент. Наконец, мы добавили некоторые функции к itensor, расширяющие его функци-
ональность, в частности операции с антисимметричными объектами такие как, внешнее
умножение, внешнее дифференцирование, символы Леви-Чевита. Эти функции следует
рассматривать, как экспериментальные.
В целом же статья преследует “обзорно- популяризаторские” цели, т.е., ставится задача
продемонстрировать вычислительную мощь maxima в применении к тензорному исчис-
лению. Представленный вариант не следует считать окончательным и автор с радостью
учтет все конструктивные пожелания и аргументированные возражения.
Общие замечания о maxima.
Maxima это мощная система компьютерной алгебры (КАС) общего назначения. За ис-
ключением нескольких специализированных программ символьной а лгебры maxima это
единственная КАС распространяемая на условиях публичной лицензии GNU (GNU Public
License). Подробнее с этой лицензией можно ознакомиться на http://www.
gnu.org/copyleft/gpl.html. Среди возможностей этой системы следует отметить следующие:
1)символьное интегрирование, символьные операции с полиномами, матрицами, рацио-
нальными функциями, мощный пакет для операций с обыкновенными дифференциаль-
ными уравнениями и др.; 2) развитые средства символьного программирования с возмож-
ностями отладки программ в ходе их исполнения; 3) дост уп к исходным кодам Maxima поз-
воляет свободное развитие всей системы широким сообществом заинтересованных поль-
зователей и программистов.
Бинарные и исходные коды maxima можно отыскать по ссылкам на домашней стра-
ничке, http://Maxima.sf.net. Поскольку автор не имеет опыта использования maxima на
windows платформах то все далее изложенное предполагает, что maxima установлена
1
e-mail:pip@iszf.irk.ru
1
в операционной системе linux
2
. В частности это руководство написано в операционной
системе ALTlinux Sisyphus с использованием текстового редактора emacs-21.2.
Исходный код Maxima написан на лиспе. К настоящему моменту maxima может быть
скомпилирована для следующих диалектов лисп: gcl (GNU Common Lisp), clisp (Common
Lisp, ANSI), cmucl (Carnegie Mellon University Common Lisp), sbcl (Steel Blank Common
Lisp). Каждый из этих диалектов имеет свои преимущества и недостатки. Их обсужде-
ние можно, по-видимому, найти на вебсайте сообщества пользователей лисп, www.lisp.org.
Отметим лишь, что при использовании gcl, sbcl и cmucl скорость вычислений в Maxima
будет на порядок больше чем при использовании clisp. Внимание, если использовать gcl
порт maxima пакеты входящие в itensor необходимо скомпилировать перед загрузкой. Это
делается следующим образом: 1)заходите в maxima*/share/tensor каталог (подразумева-
ется, что у вас есть права на запись файлов там); 2) запускае те maxima; 3) из командной
строки maxima запускаете последовательно, :lisp(compile-file “itensor.lisp”), :lisp(compile-file
“canten.lisp”), :lisp(compile-file “symtry.lisp”), :lisp(compile-file “gener.lisp”). Кстати, набирать
команды заново необязательно, используйте стек команд, доступный по клавише ↑.
Предварительные сведения.
Мaxima включает в себя два типа операций с тензорами: манипулирование компонентами
тензоров и операции жонглирования индексами тензора.
• При операциях с компонентами (пакет ctensor) тензоры рассматриваются, как мно-
гомерные массивы или матрицы. Тензорные операции типа свертки или ковариант-
ного дифференцирования выполняются суммированием по “немым” повторяющимся
индексам массивов при помощи итеративных функций типа DO. Можно выделить
следующие особенности данного способа обращения с тензорами:
i) Представление тензоров через их компоненты упрощает операции с ними по-
скольку весь разработанный аппарат матричной алгебры под руками.
ii) Сложная метрика, включающая скрытые функциональные зависимости меж-
ду координатами, легко приведет к запутанным и необозримым результатам,
которые будет трудно интерпретировать.
• При манипулировании индексами, пакет itensor, тензора рассматриваются, как функ-
ции их ковариантных, контравариантных индексов, включая индексы производных.
Таким образом при операциях типа свертки или ковариантного дифференцирова-
ния все действ ия производятся с индексами тензоро в, а не с их компонентами. Такой
способ обращения с тензорами имеет следующие особенности:
i) Индексное представление тензо ров может существенно упростить тензорные вы-
ражения, особенно при использовании особых свойств симметрии и свертки за-
данных тензоров. Т.e., itensor может быть довольно удобен если нужно понять
общую структуру тензорного выражения.
ii) С другой стороны пользователь может встретить некоторые методические труд-
ности при работе с “индексными” объектами, поскольку программные операции
с ними часто не укладываются в простые процедурные схемы программирова-
ния типичные для фортрана или С.
Замечательной о соб енност ью itensor является возможность перехода от индексного
представления тензорных выражений к компонентному при помощи процедуры generate(tensor
expr). Такой пример рассматривается в конце нашего изложения. Пакеты itensor/ctensr
находятся в каталоге %/maxima/%version/share/tensor
3
.
2
Клиенты MS Windows могут использовать подходящую сборку maxima, которую можно найти на той
же странице
3
Например в моем случае это /usr/local/share/maxima/5.9.0.1cvs/share/tensor
2
Загрузка пакета и визуализаци я.
Для загрузки itensor в maxima используется команда load(itensor). Нужно помнить, что все
дополнительные пакеты необходимо загружать до загрузки itensor,
(C1) load(ctensr)$
(C2) load(itensor)$
(C3) load("contrib/tensor/ten.lisp")$
(C4) load("contrib/tensor/tentex.lisp")$
(C5) bothcases:false$
Переменной bothcases присвоено значение false. В этом случае maxima не будет раз-
личать в каком регистре (вернем или нижнем) написано выражение. П о умолчанию все
результаты будут печататься в верхнем регистре. Это сделано для того, чтобы избежать
конфликта регистров (cases conflicts), возникающего при совместном использовании раз-
личных пакетов maxima, в которых некоторые общие переменные могут быть определены
в разных регистрах, в частности в “ctensr” все функции определены в нижнем регистре, а
в “itensor” в верхнем. Кроме того это полезно для наилучшего визуального представления
индексов, а также если вы намереваетесь обрабатывать полученные тензорные выражения
TeX’ом (скажем, tex(expression)) или работать с Emaxima-mode в e macs.
В itensor тензорный объект рассматривается, как функция трех групп индексов, ко-
торые представляют ковариантные, контравариантные и индексы производных. Ковари-
антные индексы определяются через переменную типа список, стоящую на месте первого
аргумента индексного объекта, контравариантные индексы также определены списком и
этот список стоит на месте второго аргумента. Если тензор не имеет какой либо из групп
этих индексов, тогда соответствующий аргумент дается пустым списком, [].
Индексы производной являются дополнительными аргументами индексной функции и
добавляются, через запятую после аргумента контравариантных индексов. Таким обра-
зом, G([A, B], [C, I], I, J) представляет тензор с именем G, имеющим два ковариантных ин-
декса, A, B, два контравариантных, C , I, и про-дифференцированный 2 раза по индексам
I, J. Для показа его в в иде обычном для тензорных обозначений необходимо использовать
функцию show(),
(C5) show(G([a,b],[c,i],i2,i1))$
(D5)
G
CI
AB,I2I1
При визуализации тензора, индексы производных отделены запятой от группы ковари-
антных индексов, как обычно. При работе в консоли (также как и в xmaxima и в буфере
emacs) результаты печатаются с использованием 2D псевдографики поэтому результат
будет выглядеть несколько хуже,
(C6) show(G([a,b],[c,i],i2,i1))$
C I
(D6) G
AB,I2I1
Далее все результаты печатаются с использование ТеХ препроцессора maxima. Эта
возможность дает особое удобство при работе с EMaxima-mode + latex-preview-mode в
emacs.
Определение тензоров
в maxima равносильно определению некоторой индексной функции. Таким об разо м вполне
подходящим оказывается прием следующего типа,
3
(C7) T(L1,L2):=C*A(L1,L2)+B(L1,L2)$
где L1,L2 обозначают некоторые списки индексов. Например,
(C8) show(T([i,k],[]))$
(D8)
B
IK
+ CA
IK
(C9) show(T([],[j,m]))$
(D9)
A
JM
C + B
JM
В более сложных случаях можно испо льзов ат ь конструкцию block. Например, движе-
ние невязкой жидкости с давлением P , находящейся в гравитационном поле с потенциалом
Φ, описывается уравнением Эйлера. Запишем его в декартовой системе координат, вводя
ковариантный вектор Eu
I
, описывающий I-ую компоненту уравнения,
(C10) Eu(l1,l2):=block(D_t* V(l1,[])+V([],[j])*V(l1,[],j)+
1/rho([])*diff(P([],[]),l1[1])+diff(Phi([],[]),l1[1]))$
(C11) show(Eu([i],[]))$
(D11)
V
J
V
I,J
+
∂
∂t
V
I
+ Φ
,I
+
P
,I
ρ
Операцию взятия производной по времени мы обозначили ска лярным символом D
t
.
Обсуждение причины для этого мы отложим на потом.
Использованное определение можно улучшить в двух отношениях: 1) можно обобщить
на контравариантный случай; 2) поскольку в определении встречаются повторяющиеся
индексы их полезно сразу же декларировать, как “немые” (dummy) индексы. Это избавля-
ет вас от возможных наведенных ошибок использования одинаковых индексов суммирова-
ния в разных тензорных выражениях. Ошибка возникнет если вы попытаетесь вычислить
произведение этих тензоров. Для присв оения некоторому индексу j1 текущего значения
немого индекса используем следующее j1:dummy(), где функция dummy() вычисляет те-
кущее значение немого индекса. Далее I-ая компонента уравнения Эйлера определяется
для ковариантного и контравариантного случая,
(C12) metric(G)$
(C13) Eu(l1,l2):=block(j1:dummy(), if l2=[] then
D_t* V(l1,[])+V([],[j1])*V(l1,[],j1)+1/rho([])*diff(P([],[]),l1[1])+diff(PHI([],[]),l1[1])
else D_t*V([],l2)+V([],[j1])*V([],l2,j1)+
g([],[l2[1],j1])*(diff(P([],[]),j1)/rho([])+diff(Phi([],[]),j1)) )$
(C14) show(Eu([i],[]))$
(D14)
V
%1
V
I,%1
+
∂
∂t
V
I
+ Φ
,I
+
P
,I
ρ
(C15) show(Eu([],[i]))$
(D15)
∂
∂t
V
I
+
Φ
,%2
+
P
,%2
ρ
!
G
I%2
+ V
%2
V
I
,%2
Первая строка в maxima задает имя метрического тензора, необходимого для перевода
ковариантных градиентов давления и потенциала в контравариантные. В принципе, заме-
на простых производных на ковариантные даст выражения, которые можно использовать
4
для произвольной метрики. Это т вопрос рассматривается далее. Повторяющиеся индексы
нумеруются, и по умолчанию начинаются со знака %. Изменив переменную dummyx мож-
но ввести свое обозначение для немого индекса, скажем, пусть это будет D,
(C16) dummyx:D$
(C17) show(Eu([i],[]))$
(D17)
V
D3
V
I,D3
+
∂
∂t
V
I
+ Φ
,I
+
P
,I
ρ
Алгебраические операции на тензорами
Доступны следующие операции, свертка, подъем и опускание индексов, симметризация,
антисимметризация, внешнее умножение, дуализация и операции с симметриями тензор-
ных объектов.
Вначале мы введем обобщенный символ Кронекера, kdelta(L1, L2), где L1, L2 - списки
индексов равной длины. Если каждый список содержит лищь один элемент то вычисление
kdelta([i], [j] возвращает обычный сивол Кронекера δ
j
i
. Например,
(C5) show(kdelta([i],[j]))$
(D5)
δ
J
I
(C6) show(kdelta([i,j],[n,m]))$
(D6)
δ
N
I
δ
M
J
− δ
M
I
δ
N
J
(C7) show(kdelta([i,j,k],[l,n,m]))$
(D7)
−δ
L
I
δ
N
J
δ
M
K
− δ
M
J
δ
N
K
− δ
L
J
δ
M
I
δ
N
K
− δ
N
I
δ
M
K
−
δ
N
I
δ
M
J
− δ
M
I
δ
N
J
δ
L
K
Свертка тензоров определяется функцией defcon(tensor1, tensor2, tensor3). Здесь и да-
лее tensor(i) - имена соответствующих тензоров. Эта функция сообщает maxima, что сверт-
ка тензорного произведения tensor1 и tensor2 дает в итоге tensor3. Если функция имеет
единственный аргумент, скажем tensor1, тогда свертка любого другого тензора с ним при-
ведет к поднятию или опусканию соответствующих индексов. Метрический тензор облада-
ет последним свойством автоматически. Команда metric(name) объявляет имя name мет-
рического тензора. В следующем примере метрический тензор задан при помощи суммы
диады нулевого векторного поля и некоторого постоянного единичного тензора (свертка с
самим собой дает дельту),
(C18) (delare(e, constant), defcon(e), defcon(e,e,kdelta))$
(C19) (defcon(l,l,w),w(l1,l2):=0)$
(C20) g(l1,l2):=block(
if l2=[] then e(l1,[])+m*l([l1[1]],[])*l([l1[2]],[])
else e([],l2)-m*l([],[l2[1]])*l([],[l2[2]]))$
(C21) show(g([i,j],[]))$
(D21)
L
I
L
J
M + E
IJ
5
(C22) show(g([],[i,j]))$
(D22)
E
IJ
− L
I
L
J
M
где функция declare объявляет тензор с именем E константой. При помощи процедуры
contract(exp) вычисляем свертку G
i,j
G
j,k
,
(C23) metric(G)$
(C24) show(contract(rename(expand(g([j,k],[])*g([],[i,j])))))$
(D24)
δ
I
K
Выше была использована функция rename. Она выполняет замену всех повто ряющих-
ся индексов, начиная с текущего значения немого индекса, а также производит переста-
новку индексов в алфавитном порядке считая, все тензоры симметричными. Последнее
управляется глобальной переменной allsym. По умолчанию она имеет значение true. Ес-
ли ее переопределить на allsym : false тогда произвольный тензор не будет обладать ни
какими перестановочными свойствами.
Подъем и опускание индексов . Как было сказано выше эту операцию можно прово-
дить при помощи метрического тензора или любого другого тензора, скажем T i, при усло-
вии, что его свойства свертки описаны, как defcon(T i). Например,
(C25) (defcon(Ti),expr1:Te([i,j],[k,l])*Ti([k,m])*Ti([l,n]),
expr2:Te([i,j],[k,l])*Ti([],[i,n])*Ti([],[j,m]))$
(C26) show(expr1)$
(D26)
TE
KL
IJ
TI
KM
TI
LN
(C27) show(expr2)$
(D27)
TI
IN
TI
JM
TE
KL
IJ
После свертки получаем,
(C30) show(contract(expr1))$
(D30)
TE
NMIJ
(C31) show(contract(expr2))$
(D31)
TE
MNKL
Если списки пусты, как в последнем примере, при свертке получаем размерность мно-
гообразия, которая задается переменной dim. По умолчанию dim : 4.
6
Для симметризации тензора можно ввести конструкцию аналогичную kdel ta, т.е. опре-
делить тензор дающий сумму произведений всех комбинаций символов kdelta 1-го ранга
для заданного списка индексов. Такая функция, kdels(L1, L2), введена в дополнитель-
ном подгружаемом файле “ten.lisp”. Существенно то, что для написания процедуры kdels
не потреб ов алос ь много времени мы лишь использовали готовую конструкцию kdelta из
исходного текста “itensor.lisp” и вынесли ее в отдельный файл. Результаты вычисления
kdels(L1, L2) для различных случаев показаны ниже.
(C32) show(kdels([i],[l]))$
(D32)
δ
L
I
(C33) show(kdels([i,j],[l,k]))$
(D33)
δ
K
I
δ
L
J
+ δ
L
I
δ
K
J
(C34) show(kdels([i,j,k],[l,m,n]))$
(D34)
δ
L
I
δ
M
J
δ
N
K
+ δ
N
J
δ
M
K
+ δ
L
J
δ
M
I
δ
N
K
+ δ
N
I
δ
M
K
+
δ
M
I
δ
N
J
+ δ
N
I
δ
M
J
δ
L
K
(C35) show(ev(kdels([],[]),kdelta))$
(D35)
4
Свертка симметричного и антисимметричного тензора дает 0.
(C36) expr:expand(kdels([i,j,k],[l,m,n])*kdelta([l,m,n],[i1,i2,i3]))$
(C37) show(expr)$
(D37)
−δ
L
I
δ
M
J
δ
N
K
δ
I1
L
δ
I2
M
δ
I3
N
− δ
M
I
δ
L
J
δ
N
K
δ
I1
L
δ
I2
M
δ
I3
N
− δ
L
I
δ
N
J
δ
M
K
δ
I1
L
δ
I2
M
δ
I3
N
− δ
N
I
δ
L
J
δ
M
K
δ
I1
L
δ
I2
M
δ
I3
N
−δ
M
I
δ
N
J
δ
L
K
δ
I1
L
δ
I2
M
δ
I3
N
− δ
N
I
δ
M
J
δ
L
K
δ
I1
L
δ
I2
M
δ
I3
N
+ δ
L
I
δ
M
J
δ
N
K
δ
I2
L
δ
I1
M
δ
I3
N
+ δ
M
I
δ
L
J
δ
N
K
δ
I2
L
δ
I1
M
δ
I3
N
+δ
L
I
δ
N
J
δ
M
K
δ
I2
L
δ
I1
M
δ
I3
N
+ δ
N
I
δ
L
J
δ
M
K
δ
I2
L
δ
I1
M
δ
I3
N
+ δ
M
I
δ
N
J
δ
L
K
δ
I2
L
δ
I1
M
δ
I3
N
+ δ
N
I
δ
M
J
δ
L
K
δ
I2
L
δ
I1
M
δ
I3
N
+δ
L
I
δ
M
J
δ
N
K
δ
I1
L
δ
I3
M
δ
I2
N
+ δ
M
I
δ
L
J
δ
N
K
δ
I1
L
δ
I3
M
δ
I2
N
+ δ
L
I
δ
N
J
δ
M
K
δ
I1
L
δ
I3
M
δ
I2
N
+ δ
N
I
δ
L
J
δ
M
K
δ
I1
L
δ
I3
M
δ
I2
N
+δ
M
I
δ
N
J
δ
L
K
δ
I1
L
δ
I3
M
δ
I2
N
+ δ
N
I
δ
M
J
δ
L
K
δ
I1
L
δ
I3
M
δ
I2
N
− δ
L
I
δ
M
J
δ
N
K
δ
I3
L
δ
I1
M
δ
I2
N
− δ
M
I
δ
L
J
δ
N
K
δ
I3
L
δ
I1
M
δ
I2
N
−δ
L
I
δ
N
J
δ
M
K
δ
I3
L
δ
I1
M
δ
I2
N
− δ
N
I
δ
L
J
δ
M
K
δ
I3
L
δ
I1
M
δ
I2
N
− δ
M
I
δ
N
J
δ
L
K
δ
I3
L
δ
I1
M
δ
I2
N
− δ
N
I
δ
M
J
δ
L
K
δ
I3
L
δ
I1
M
δ
I2
N
−δ
L
I
δ
M
J
δ
N
K
δ
I2
L
δ
I3
M
δ
I1
N
− δ
M
I
δ
L
J
δ
N
K
δ
I2
L
δ
I3
M
δ
I1
N
− δ
L
I
δ
N
J
δ
M
K
δ
I2
L
δ
I3
M
δ
I1
N
− δ
N
I
δ
L
J
δ
M
K
δ
I2
L
δ
I3
M
δ
I1
N
−δ
M
I
δ
N
J
δ
L
K
δ
I2
L
δ
I3
M
δ
I1
N
− δ
N
I
δ
M
J
δ
L
K
δ
I2
L
δ
I3
M
δ
I1
N
+ δ
L
I
δ
M
J
δ
N
K
δ
I3
L
δ
I2
M
δ
I1
N
+ δ
M
I
δ
L
J
δ
N
K
δ
I3
L
δ
I2
M
δ
I1
N
+δ
L
I
δ
N
J
δ
M
K
δ
I3
L
δ
I2
M
δ
I1
N
+ δ
N
I
δ
L
J
δ
M
K
δ
I3
L
δ
I2
M
δ
I1
N
+ δ
M
I
δ
N
J
δ
L
K
δ
I3
L
δ
I2
M
δ
I1
N
+ δ
N
I
δ
M
J
δ
L
K
δ
I3
L
δ
I2
M
δ
I1
N
(C38) show(contract(expr))$
(D38)
0
Рассмотрим теперь симметризацию ковариантного тензора 3-го ранга A
ijk
,
7
(C39) expr:contract(expand(A([i1,j1,k1],[])*kdels([i,j,k],[i1,j1,k1])))$
(C40) show(expr)$
(D40)
A
KJI
+ A
KIJ
+ A
JKI
+ A
JIK
+ A
IKJ
+ A
IJK
Объявляем A полностью симметричным,
(C41) decsym(A,3,0,[sym(all)],[])$
Назначаем значение переменной alls ym и проводим упрощение expr при помощи про-
цедуры canform,
(C42) allsym:true;
(D42)
true
(C43) show(canform(expr))$
(D43)
6A
IJK
Пусть теперь A - полностью антисимметричный тензор. Объявляем свойст ва симмет-
рии и вычисляем результат упрощения exp r,
(C44) allsym:false$
(C45) remsym(A,3,0)$
(C46) decsym(A,3,0,[ANTI(ALL)],[])$
(C47) dispsym(A,3,0);
(D47)
[[ANTI, [[1, 2, 3]] , []]]
(C48) show(canform(expr))$
(D48)
0
Объявление свойства цикличности индексов дает другой результат,
(C49) remsym(A,3,0);
(D49)
DONE
(C50) decsym(A,3,0,[CYC(ALL)],[])$
(C51) show(canform(expand(expr)))$
(D51)
3A
IKJ
+ 3A
IJK
Выше были использованы функции dispsym и r em sym для показа и удаления свойств
симметрии выбранного тензора. Существует также функция dispcon(tensor 1, ...), пока-
зывающая определенные в системе свойства свертки для tensor(i). Если вместо tenso r(i)
задать аргумент all то будут показаны все выше определенные св ойст ва свертки.
8
(C52) dispcon(all);
(D52)
[[[G, G, KDELTA] , [G] , [G, G, KDELTA] , [G]] , [[E, E, KDELTA] , [E]] , [[L, L, W]] , [[TI]]]
Антисимметризация некоторого тензора, как было сказано выше может быть сдела-
на путем его свертки с абсолютно антисимметричным тензором подходящего ранга. Для
этих целей можно использовать об об щенный символ Кронекера δ
L2
L1
где L1,L2 это списки
индексов. Допустим теперь, что имеется тензор B
ikl
не имеющий наперед заданных свойст в
симметрии. Определим, также, абсолютно симметричный контравариантный тензор S
ikl
,
подобно тому как это было сделано ранее.
(C53) decsym(S,0,3,[],[SYM(ALL)]);
(D53)
DONE
Проводим антисимметризацию B и сворачиваем его с S. Результаты вычислений пока-
заны ниже,
(C54) exp1: canform(contract(expand(kdelta([i,k,l],[i1,k1,l1])*B([i1,k1,l1],[]))))$
(C55) show(exp1)$
(D55)
B
LKI
− B
LIK
− B
KLI
+ B
KIL
+ B
ILK
− B
IKL
(C56) exp2:exp1*S([],[i,k,l])$
(C57) show(expand(exp2))$
(D57)
S
IKL
B
LKI
− S
IKL
B
LIK
− S
IKL
B
KLI
+ S
IKL
B
KIL
+ S
IKL
B
ILK
− S
IKL
B
IKL
(C58) show(canform(contract(%)))$
(D58)
0
Внешнее умножение не определено в itensor. Для введения этой полезной опера-
ции вполне достаточно обобщенного символа Кронекера, kdelta. В следующем блоке сес-
сии maxima мы вводим операцию антикоммутативного (внешнего) умножения для косо-
симметричных ковариантных тензоров (“форм”). Внешнее умножение a
i
, b
j
может быть
вычислено сверткой δ
lk
ij
a
l
b
k
. Операцию антикоммутативного (внешнего) умножения обо-
значим символом &. Мы декларируем его как инфиксный оператор и определяем само дей-
ствие,
(C59) infix("&")$
(C60) declare("&",additive)$
(C61) "&"(ANY,BODY):=block(local(I),
L1:first(indices(ANY)), L2:first(indices(BODY)),
if L1=[] then return(ANY*BODY) else if L2=[] then return(ANY*BODY)
else ( L11 : MAKELIST(DUMMY(), I,1, LENGTH(L1)),
L22 : MAKELIST(DUMMY(), I,1, LENGTH(L2)),
L1S:MAP("=",L1,L11), L2S:MAP("=",L2,L22),
9
LK1:append(L1,L2),LK2:append(L11,L22),
ANY:sublis(L1S,ANY), BODY:sublis(L2S,BODY),
evf:(if evenp(length(LK1)) then 1 else -1),
contract(canform(
ratexpand(evf*KDELTA(LK1,LK2)*ANY*BODY/(length(LK1)-1)!)))))$
Несколько пояснений относительно использованных функций. Вычисление функции
indices дает список индексов тензорного выражения. Причем 1 элементом этого списка
является под-список ковариантных индексов . Таким образом, рассмотренная процедура
включает следующие действия (по-строчно): 1) находим списки ковариантных индексов,2)
если один из списков пуст получаем просто умножение, 3) с оздае м список для подстановок,
состоящий из немых индексов (makelist), 4) процедура map (применяющий функционал
= к элементам списков) формирует собственно списки подстановок, 5) затем вычисляем
списки индексов символа Кронекера, 6) делаем подстановки и 7) вычисляем результат.
Примеры определения операций внешнего умножения, внешнего дифференцирования, а
также внутреннего произведения и производной Ли для косо-симметричных ковариант-
ных тензоров даны в “ex_calc.mc”.
Ниже рассмотрены типичные примеры внешнего умножения для 1 и 2 форм,
(C76) allsym:false$
(C77) decsym(p,2,0,[anti(all)],[])$
(C78) show(a([i])&b([j]))$
(D78)
A
I
B
J
− B
I
A
J
(C79) show(a([i])&p([j,k])+a([i])&b([j])&a([k]))$
(D79)
P
IJ
A
K
+ A
I
P
JK
− P
IK
A
J
Процедура дуализации тензора также тесно связана символом Кроннекера. Для вы-
полнения этой операции необходимо ввести авсолютно антисимметричные символы Леви-
Чевитты, далее СЛЧ. В itensor функция определяющая СЛЧ это lc(L1), где L1 - список
индексов. К сожалению эта функция оперирует только целочисленными типами индек-
сов,
(C80) lc([1,2,3]);
(D80)
1
(C81) lc([i,j,j]);
(D81)
LC ([I, J, J])
Результат вычисления во 2-ом случае должен давать 0. Кроме того СЛЧ должен рас-
познавать, что его свертка с двумя одинаковыми об ъектами, например векторное умноже-
ние, также дает 0. Наконец, умножение конртравариантного и ковариантного СЛЧ дает
обобщенный символ Кроннекера. В общем случае определить подобный объект довольно
сложно. Один из вариантов определения тензора Леви-Чевитта дан в “lch.mc”. Загружаем
файл в maxima,
Maxima
10
batch("contrib/tensor/lch.mc")$
В этом пакете определено 3 существенных функции для операций с СЛЧ,
dec_lch(rank) - объявляет lch антисимметричным т ензоро м ранга rank (антисимметрич-
ным по ковариантным и контравариантным индексам); lch_kdt(expr) - функция, которая
ищет в expr произведения контравариантных и ковариантных СЛЧ и преобразует их в
обобщенный символ Кронекера; lch_anti(expr) функция, которая в явном виде применяет
к expr свойства антисимметрии тензорного произведения lch с другими тензорными объек-
тами, например, применение этой функции аннулирует все произведения типа lch
ijk
U
j
U
k
.
Ниже даны соответствующие примеры использования введенных функций,
(C177) dec_lch(3)$
(C178) ax_bxc:lch([i,j,k],[])*A([],[j])*lch([],[k,l,n])*B([l],[])*C([n],[])$
(C179) show(ax_bxc)$
(D179)
A
J
ε
KLN
ε
IJK
B
L
C
N
(C180) show(contract(expand(ev(lch_kdt(ax_bxc),kdelta))))$
(D180)
A
J
B
I
C
J
− A
J
C
I
B
J
(C181) axb_cxu:lch([i,j,k],[])*A([],[j])*B([],[k])*
lch([],[i,l,n])*C([l],[])*U([n],[])$
(C182) show(axb_cxu)$
(D182)
ε
ILN
A
J
B
K
ε
IJK
C
L
U
N
(C183) show(contract(expand(ev(lch_kdt(axb_cxu),kdelta))))$
(D183)
A
J
B
K
C
J
U
K
− A
J
B
K
U
J
C
K
(C184) expr2:lch([i,j,k],[])*A([],[j])*A([],[k])+lch([],[i,j,k])*A([j])*B([k])$
(C185) show(expr2)$
(D185)
ε
IJK
A
J
B
K
+ A
J
A
K
ε
IJK
(C186) show(factor(canform(contract(expand(lch_anti(expr2))))))$
(D186)
ε
%1%2I
(A
%1
B
%2
− B
%1
A
%2
)
2
Введенный аппарат позволяет легко дуализировать заданный тензор или тензорное вы-
ражение, путем умножения на lch подходящего ранга. Используя процедуру lch_kdt мож-
но от дуального тензора перейти обратно к исходному тензору,
(C128) ("declare symmetry prop of B")$
(C129) (allsym:false, decsym(B,2,0,[anti(all)],[]),show(B([i,j],[])))$
(D129)
B
IJ
(C130) ("compute dualization")$
11
(C131) (dual:lch([],[l,i,j])*B([i,j],[])/2,show(dual))$
(D131)
ε
LIJ
B
IJ
2
(C132) ("return to original")$
(C133) (ddual:lch([i,j,l],[])*canform(dual), show(ddual))$
(D133)
ε
%1%2L
B
%1%2
ε
IJL
2
(C134) show(canform(contract(expand(ev(lch_kdt(ddual),kdelta)))))$
(D134)
B
IJ
Операции дифференциров ани я
.
В itensor определены операции как простой так и ковариантной производной. Операции
внешнего дифференцирования и производная Ли от внешней формы произвольного ранга
определены в "ex_calc.mc"аналогично функции внешнего умножения, разобранной выше.
Частная производная от тензора вычисляется путем diff (exp, v 1, n1, v2, n2, ...). Это
стандартная функция дифференцирования maxima. Эта функция берет частную произ-
водную от exp по v1, n1-раз, по v2, n2-раз и т.д. Ее использование в itensor имеет свои
особенности (см.. также функцию undiff),
1 Производные любого индексного объекта в exp автоматически (если тензор не объяв-
лен константой) считаются зависимыми от переменных(индексов) vi. Таким образом,
При упрощениях все индексы сортируются в алфавитном порядке.
2 Переменные vi могут быть целого типа из интервала 1-dim. В этом случае производ-
ная берется по соответствующей переменной из списка coordinates. Данный список
должен быть объявлен заранее, например, coordinates : [x, y, z, t]. Если список не за-
явлен, тогда maxima автоматически рассматривает его как переменную типа атом.
В этом случае индексу производной ав то матически присваивается заданное vi. До-
пускаются также индексированные массивы переменных типа X[1], X[2].. X[i].
3 Определена операция дифференцирования детерминанта метрики. Таким образом,
если метрике присвоено имя G, тогда вычисление diff(determinant(G), K) возвра-
щает 2 ∗ determinant(G) ∗ CHR2([%i, K], [%i]), где CHR2 символ Кристоффеля 2-го
рода.
Функция COV DIF F (exp, v1, v2, ...) вычисляет ковариантную производную exp по пе-
ременным vi в символах Кристоффеля 2-го рода CHR2. Вычисление символов Кристоф-
феля 1-го и 2-го рода через компоненты метрики определяется индексными функциями
CHR1([i, j, k]) и CHR2([i, j], [k]) соответственно. Ниже, мы вычисляем симво лы Кристоф-
феля, а также ковариантную дивергенцию некоторого тензора A
i
jk
,
(C167) kill(g)$
(C168) metric(g)$
(C169) show(CHR1([i,j,k]))$
(D169)
G
JK,I
+ G
IK,J
− G
IJ,K
2
12
(C170) show(CHR2([i,j],[k]))$
(D170)
G
K%78
(G
J%78,I
− G
IJ,%78
+ G
I%78,J
)
2
(C171) show(covdiff(A([j,k],[i]),i))$
(D171)
−A
I
J%79
Γ
%79
KI
+ A
I
JK,I
+ Γ
I
%79I
A
%79
JK
− A
I
%79K
Γ
%79
JI
(C172) expr:canform(contract(expand(EV(%,CHR2))))$
(C173) show(expr)$
(D173)
A
%1%2
J
G
K%2,%1
2
−
A
%1%2
J
G
K%1,%2
2
+
G
J%1,%2
A
%2%1
K
2
−
G
%1%2,J
A
%2%1
K
2
−
G
J%1,%2
A
%1%2
K
2
+A
%1
JK,%1
+
G
%2%3
G
%2%3,%1
A
%1
JK
2
+
G
%3%2
G
%1%2,%3
A
%1
JK
2
−
G
%2%3
G
%1%2,%3
A
%1
JK
2
−
G
%2%1,K
A
%1%2
J
2
(C174) show(geodesic(expr,G))$
(D174)
A
%1
JK,%1
Функция geodesic(exp r, G) использованная в (С229) аннулирует первые производные
метрического тензора в exp. Если вместо G указано CHR2 аннулируются не дифференци-
рованные символы Кристоффеля. Ниже мы проверяем свойства цикличности тензора кри-
визны Римана. Выражение для Римановского тензора кривизны через символы Кристоф-
феля 2-го рода вычисляется функцией CURV AT URE([i, j, k], [h]).
(C180) allsym:true$
(C181) exp:’CURVATURE([R,S,T],[U])+’CURVATURE([S,T,R],[U])+’CURVATURE([T,R,S],[U])$
(C182) show(exp)$
(D182)
R
U
TRS
+ R
U
STR
+ R
U
RST
(C183) show(ev(exp,curvature))$
(D183)
−Γ
U
TS,R
−Γ
U
%88R
Γ
%88
TS
+Γ
U
TR,S
+Γ
U
%88S
Γ
%88
TR
+Γ
U
ST,R
+Γ
U
%87R
Γ
%87
ST
−Γ
U
SR,T
−Γ
U
%87T
Γ
%87
SR
−Γ
U
RT,S
−Γ
U
%86S
Γ
%86
RT
+Γ
U
RS,T
+Γ
U
%86T
Γ
%86
RS
(C184) SHOW(GEODESIC(%,CHR2))$
(D184)
−Γ
U
TS,R
+ Γ
U
TR,S
+ Γ
U
ST,R
− Γ
U
SR,T
− Γ
U
RT,S
+ Γ
U
RS,T
(C185) SHOW(RENAME(%))$
(D185)
0
13
Внешняя производная и производная Ли. Данные функции не определены в itensor.
Примеры введения операций внешнего дифференцирования и производной Ли для внеш-
них форм даны в "ex_calc.mc".
Внешняя производная определена, как внешнее произведение некоторой формы с опе-
ратором дифференцирования обозначенным @ ind, где ind - индекс координаты по кото-
рой производится дифференцирование. Таким образом, (p
ij
)@
k
это на самом деле
∂
∂x
k
!
&(p
ij
)
Ее вычисление дает,
(C186) (allsym:false,decsym(p,2,0,[anti(all)],[]),show(p([i,j])@k))$
(D186)
P
JK,I
− P
IK,J
+ P
IJ,K
Производную Ли мы определили как инфиксный оператор
00
@L
00
(forma, L1) между
некоторой формой forma и списком L1 : [V, k], где V - имя векторного поля вдоль, ко-
торого берется произв одная и k индекс компоненты производной Ли. На данный момент
эта функция не достаточно хорошо реализована. В частности, при ее использовании нуж-
но следить за тем, что бы индексы компонент внешних форм под оператором производ-
ной были отсортированы алфавитно слева направо. Это связано с тем, что производная
Ли вычисляется по формуле Картана, через внешнюю производную и внутреннее про-
изведение получающихся форм с векторным полем. Знак результата внутренней свертки
некоторой формы с вектором существенно зависит от порядка индекса по которому про-
изводится свертка. В будущем, саму операцию производной Ли, наверное, гораздо пра-
вильней будет определить в символьном виде, задавая список индексов компонент в ка-
честве аргумента. Ниже рассмотрены некоторые примеры с применением производной
Ли,
(C187) ("the Lie deCUrivative of 1-form")$
(C188) show(a([i])@L[v,k])$
(D188)
V
%1
A
K,%1
+ V
%1
,K
A
%1
Известно, что внешняя производная коммутирует с производной Ли. Проверим это для
произвольных 1 и 2-форм,
(C189) ("the Lie derivative has to commute with the exterior one.")$
(C190) show((a([i])@L[v,j])@k-(a([i])@j)@L[v,k])$
(D190)
0
(C191) show((p([i1,i2])@L[v,i3])@i4-(p([i1,i2])@i3)@L[v,i4])$
(D191)
0
Проверка коммутации операции внешнего дифференцирования и производной Ли для
форм высших рангов рассмотрена в файле “car_iden.demo”.
Упрощение тензорных выражений.
Это, пожалуй наиболее трудная проблема при символьном обращении с тензорами. В на-
стоящее время набор средств и функций применяемых в упрощении тензоров довольно
14
ограничен. Некоторые из этих функций рассматривались выше. В целом ф ункции упро-
щения выражений можно разделить на 2 группы. В первую группу можно отнести функ-
ции универсального назначения применяемые чаще всего, это canform, rename и canten.
Эти функции используют заданные свойства симметрии тензоров. Упрощение выполня-
ется путем перестановки немых индексов. Ко 2-ой группе от носятся функции специально-
го назначения, форсирующие некоторые специаль ные свойства тензоров типа, уничтоже-
ние производных заданного порядка у выбранных объектов, flush, Лоренцева калибровка
lorentz, дифференцирование вдоль геодезических geodesic и т.д. Здесь упрощение дости-
гается применением заданных правил.
Рассмотрим теперь примеры применения названных функций. rename(exp, count) воз-
вращает выражение эквивалентное exp, но немые индексы каждого тензора переимено-
ваны соотв етс твующими из набора [%1, %2, ...], если 2-ой а ргумент опущен. В противном
случае индексирование немых индексов начинается с номера count. Для суммы несколь-
ких тензоров rename работает на каждое слагаемое в отдельности об нуляя счетчик немых
индексов при переходе следующему вкладу суммы. Тензорные вклады сортируются в
алфавитно-численном порядке по индексам в отношении ковариантных или контравари-
антных индексов, в зависимости от значения переменной flipflag. Если flipflag : false
тогда сортировка идет по ковариантным индексам и если flipflag : true - по контравари-
антным. Очень часто комбинированное применение rename с разным значением flip f lag
упрощает выражение более эффективно однократного применения.
canform(expr) - это наиболее универсальная функция для упрощения expr. Упроще-
ние достигается переименованием немых индексов аналогично процедуре rename пере-
становкой всех индексов с использованием объявленных свойств симметрии (процедурой
decsym). Заметим, что если эта процедура применяется для больших тензорных выра же-
ний время исполнения может быть довольно значительным. Несмотря на то, что canform
не всегда возвращает результат в наиболее упрощенном виде, эта процедура надежна в
математическом отношении. Ниже мы вычисляем тензор Римана для квази-евклидовой
метрики. Конечный результат существенным образом упрощается процедурой canform,
(C69) kill(G)$
(C70) DECLARE(E,CONSTANT)$
(C71) metric:G$
(C72) G(L1,L2):=BLOCK( IF L2=[] THEN RETURN(E(L1,[])+2*L*P(L1,[]) ),
E([],L2)-2*L*P([],L2) )$
(C73) SHOW(G([I,J],[]))$
(D73)
2P
IJ
L + E
IJ
(C74) SHOW(G([],[I,J]))$
(D74)
E
IJ
− 2P
IJ
L
(C75) (RATVARS(L),RATWEIGHT(L,1),RATWTLVL:1)$
(C76) exp1:CURVATURE([S,U,N],[Y])$
(C77) nterms(exp1);
(D77)
4
(C78) (exp2:undiff(exp1),exp3:ev(exp2,chr2),exp4:ev(exp3,diff))$
(C79) nterms(exp4);
(D79)
90
15
(C80) SHOW(CANFORM(CONTRACT(RENAME(RATEXPAND(exp4)))))$
(D80)
−E
%1Y
LP
SU,%1N
+ E
%1Y
LP
NS,%1U
+ E
%1Y
P
%1U,NS
L − E
%1Y
P
%1N,SU
L
Использованная функция nterms(exp) дает в результате вычисление общее количество
слагаемых exp.
Наконец, canten(exp) упрощает exp переименованием индексов и перестановкой немых
индексов тензорных произведений. Использование canten ограничено на суммы тензор-
ных произведений в которых отсутств уют производные. Кроме т ого упрощение тензоров
в этой функции, по-видимому, существенным образом зависит от форсированного (в об-
ход заявленных симметрий) использования опции allsym : true. Ввиду этих ограничений
применять эту функцию желательно только в случае если процедура can f orm не привела
к требуемому упрощению. К математическим результатам полученным с использовани-
ем canten следует подходить с осторожностью. Никогда не следует применять canten в
присутствии антисимметричных тензоров.
При манипулировании тензорными выражениями содержащими производные очень
полезными оказываются функции flush, lorentz и ра ссмотренная ранее gejdesic.
Процедура flush(exp, tensor1, tensor2, ...) обнуляет все tensori в exp не имеющие индек-
сов производных. Функция fl us hd(exp, tensor1, tensor2, ...) обнуляет все tensori в exp, име-
ющие индексы производной. flushdn(exp, tensor, n) аннулирует в exp все объекты tensor,
имеющие производные ранга n и выше. Ниже, некоторые примеры использования “flush”
функций.
(C64) exp:U([I],[J,R],K,R)+A([I],[J,R,S],K,R,S)+B([I,K],[J,R],R)+U([I,K,R],[J,R])$
(C65) show(exp)$
(D65)
U
JR
IKR
+ B
JR
IK,R
+ A
JRS
I,KRS
+ U
JR
I,KR
(C66) show(flush(exp,U))$
(D66)
B
JR
IK,R
+ A
JRS
I,KRS
+ U
JR
I,KR
(C67) show(flushd(exp,U,B))$
(D67)
U
JR
IKR
+ A
JRS
I,KRS
(C68) show(flushnd(exp,A,1))$
(D68)
U
JR
IKR
+ B
JR
IK,R
+ U
JR
I,KR
Функция lorentz(exp, tensor1, tensor 2, ...) налагает обобщенные условия Лоренцевой
калибровки на exp, аннулируя все tensori имеющие индекс производной совпадающий с
одним из контравариантных индексов. Если функция имеет единственный аргумент, тогда
калибровка выполняется для всех тензоров из exp. В сессии maxima, ниже, мы вычисляем
тензор Эйнштейна для плоской метрики и применяем Лоренцеву калибровку,
(C148) defcon(E,E,kdelta)$
(C149) defcon(E,P,P)$
(C150) defcon(P,E,P)$
16
(C151) RR : G([],[r,t])*curvature([r,s,t],[s])$
(C152) RRIJ : G([],[i,r])*G([],[j,t])*curvature([r,s,t],[s])$
(C153) ein:-(RRIJ-1/2*RR*G([],[i,j]))$
(C154) undiff(ein)$
(C155) ev(%,chr2)$
(C156) ev(%,diff)$
(C157) ein:canform(rename(contract(ratexpand(%))))$
(C158) show(ein)$
(D158)
−E
%1%2
P
IJ
,%1%2
L−P
%1%2
,%1%2
E
IJ
L+P
,%1%2
E
%1%2
E
IJ
L+E
%1I
P
%2J
,%1%2
L+P
%1I
,%1%2
E
%2J
L−P
,%1%2
E
%1I
E
%2J
L
(C159) ein_l:lorentz(ein,P)$
(C160) show(ein_l)$
(D160)
−E
%1%2
P
IJ
,%1%2
L + P
,%1%2
E
%1%2
E
IJ
L − P
,%1%2
E
%1I
E
%2J
L
Рассмотрим напоследок перестановочные свойства тензора кривизны Римана. Во-первых
симметризация по паре последних ковариантных индексов дает 0,
(C10) ("firstly, compute symmetrization")$
(C11) exp:contract(expand(’curvature([k,i1,j1],[l])*kdels([i,j],[i1,j1])/2))$
(C12) show(exp)$
(D12)
R
L
KJI
2
+
R
L
KIJ
2
(C13) (exp1:ev(exp,curvature),show(exp1))$
(D13)
Γ
L
KJ,I
+ Γ
L
%4I
Γ
%4
KJ
− Γ
L
KI,J
− Γ
L
%4J
Γ
%4
KI
2
+
−Γ
L
KJ,I
− Γ
L
%3I
Γ
%3
KJ
+ Γ
L
KI,J
+ Γ
L
%3J
Γ
%3
KI
2
(C14) ("simplify via canform")$
(C15) show(canform(exp1))$
(D15)
0
Антисимметризация ковариантных индексов также аннулирует тензор Римана,
(C36) ("compute antisymmetrization")$
(C37) exp:contract(expand(’curvature([i1,j1,k1],[l])*kdelta([i,j,k],[i1,j1,k1])))$
(C38) show(exp)$
(D38)
R
L
KJI
− R
L
KIJ
− R
L
JKI
+ R
L
JIK
+ R
L
IKJ
− R
L
IJK
(C39) (exp1:ev(exp,curvature),show(expand(exp1)))$
(D39)
17
2Γ
L
KJ,I
+ Γ
L
%34I
Γ
%34
KJ
+ Γ
L
%33I
Γ
%33
KJ
− 2Γ
L
KI,J
−Γ
L
%34J
Γ
%34
KI
−Γ
L
%33J
Γ
%33
KI
− 2Γ
L
JK,I
− Γ
L
%32I
Γ
%32
JK
− Γ
L
%31I
Γ
%31
JK
+ 2Γ
L
JI,K
+Γ
L
%32K
Γ
%32
JI
+ Γ
L
%31K
Γ
%31
JI
+ 2Γ
L
IK,J
+Γ
L
%30J
Γ
%30
IK
+Γ
L
%29J
Γ
%29
IK
− 2Γ
L
IJ,K
− Γ
L
%30K
Γ
%30
IJ
− Γ
L
%29K
Γ
%29
IJ
(C27) show(canform(exp1))$
(D27)
0
Перейдем к тождествам Бъянки. Эти тождества записываются следующим образом
R
l
k[ij;m]
= 0
В maxima это уравнение можно записать,
(C47) bianki_r:’covdiff(’curvature([k,i1,j1],[l]),m1)*’kdelta([i,j,m],[i1,j1,m1])=0$
(C48) show(bianki_r)$
(D48)
δ
I1J1M1
IJM
COVDIFF
R
L
KI1J1
, M1
= 0
(C55) exp:contract(expand(ev(lhs(bianki_r),kdelta,curvature,covdiff)))$
(C56) nterms(exp);
(D56)
108
(C57) show(canform(exp))$
(D57)
0
(D57) показывает справедливость тождеств Бъянки.
Переход к компонентам.
Допустим, что мы получили некоторое тензорное выражение или уравнение и теперь же-
лаем представить результат для некоторой фиксированной системы координат. Эта задача
выполняется процедурой generate(eq), где eq это некое тензоное уравнение. Чтобы не за-
сорять документ излишними формулами рассмотрим простейший пример, уравнение теп-
лопроводности в декартовой и сферической системах коо рдинат. Пакет ctensr должен быть
загружен в систему до itensor.
(C5) dummyx:di$
(C6) METRIC:G$
(C7) DIM:3$
(C8) (" The RHS of heat transport equation ")$
(C9) eq1 : TD = canform(rename(expand(covdiff( -k([],[])*covdiff(T([],[]),i),j)*G([],[i,j]))))+
source$
18
(C10) heat : GENERATE(eq1 )$
На следующем этапе ипользуются функции пакета ctensr. Мы получаем треб уемые
уравнения, вычисляя компоненты метрики, связности (символы Кристоффеля) и под-
ставляя результаты в уравнение сгенерированое в itensor. Для плоской метрики име-
ем,
(C11) (OMEGA:[X,Y,Z],LG:MATRIX([1,0,0],[0,1,0],[0,0,1]),UG : INVERT(LG))$
(C12) (omega:OMEGA,lg:LG,ug:UG,christof(false),MCS:mcs)$
(C13) (depends(T,omega),depends(k,X))$
(C14) ev(heat);
(D14)
−K
d
2
dZ
2
T +
d
2
dY
2
T +
d
2
dX
2
T
!
−
d
dX
K
d
dX
T
!
+ SOURCE
Для сферической метрики повторяем процедуру,
(C31) (" get equation in spherical coordinates ")$
(C32) OMEGA:[r,theta,phi];
(D32)
[R, ϑ, ϕ]
(C33) LG:MATRIX([1,0,0],[0,r^2,0],[0,0,r^2*sin(theta)^2])$
(C34) UG : INVERT(LG)$
(C35) (omega:OMEGA,lg:LG,ug:UG,christof(false),MCS:mcs)$
(C36) remove([T,k],dependency)$
(C37) (depends(T,omega),depends(k,r))$
(C38) ev(heat);
(D38)
K
−
d
dϑ
T cos ϑ
R
2
sin ϑ
−
2
d
dR
T
R
− K
d
2
dϕ
2
T
R
2
sin
2
ϑ
+
d
2
dϑ
2
T
R
2
+
d
2
dR
2
T
−
d
dR
K
d
dR
T
!
+ SOURCE
В maxima*/share/tensor каталоге есть ряд демонстрационных файлов, которые допол-
няют наше изложение в этом вопросе.
Приложение. Сохранение завихренности и вмороженность
магнитных полей в магнитной гидродинамике.
Данная часть посвящена решению двух упражнений, 4.3(5) и 4.3(6) из [2] средствами
maxima.
Используя введенные операции косо-симметричного умножения и дифференцирования
легко доказать некоторые из законов сохранения идеальной (невязкой) магнитогидроди-
намики.
Начнем с закона сохранения завихренности. В обычных обозначениях завихренность
поля скорости
~
V характеризуется ∇×
~
V . Согласно „, можно установить взаимно-однозначное
соответствие между операциями взятия ротора от некоторого векторного поля и опера-
цией внешней производной 1-формы соответствующей этому векторному полю. Запишем
уравнение Эйлера в ковариантной форме,
Maxima
batch("contrib/tensor/ex_calc.mc")$
19
(C203) dummyx:j$
(C204) Euler: D_t*V([i1])+
’"@L"(V([i0]),[V,i1])=-(P([])@i1)/rho([])+(V([i0])|_V/2-Phi([]))@i1$
(C205) show(Euler)$
(D205)
∂
∂t
V
I1
+ @L (V
I0
, [V, I1]) =
V
J1
V
J1,I1
2
+
V
J1
,I1
V
J1
2
− ϕ
,I1
−
P
,I1
ρ
Возьмем теперь внешнюю производную от обоих частей. С учетом коммутации произ-
водных Ли и внешниих производных получаем,
(C209) Euler1: D_t*Omega([i1,i2])+’"@L"(Omega([i0,i1]),[V,i2])=(-(P([])@i1)/rho([])+(V([i0])|_V/2-
Phi([]))@i1)@i2$
(C210) show(Euler1)$
(D210)
∂
∂t
ω
I1I2
+ @L (ω
I0I1
, [V, I2]) =
ρ
,I1
P
,I2
ρ
2
−
P
,I1
ρ
,I2
ρ
2
(C211) show(Omega([i1,i2])=V([i1])@i2)$
(D211)
ω
I1I2
= V
I2,I1
− V
I1,I2
Правая часть уравнения Эйлера для вихря может быть записана, как ρ([], i1)&p([], i2)/ρ
2
.
Декларируем теперь функциональную зависимость термодинамических переменных сре-
ды, например p = p(ρ) или в более общем случае p = p(ρ, S),
(C212) depends(P,[RHO,S])$
где S - энтропия. Далее, выражаем производные от через зависимые переменные.
Для этого определяем правила преобразования производных, используя matchdeclare и
defrule,
(C213) matchdeclare(i,symbolp);
(D213)
DONE
(C214) defrule(p_r, P([],[],i), ’diff(P,RHO)*rho([],[],i));
(D214)
P_R : P ([] , [] , I) → ρ ([] , [] , I)
d
dρ
P
!
(C215) defrule(p_sr, P([],[],i), ’diff(P,S)*S([],[],i)+’diff(P,RHO)*rho([],[],i));
(D215)
P_SR : P ([] , [] , I) → S ([] , [] , I)
d
dS
P
!
+ ρ ([] , [] , I)
d
dρ
P
!
Применяя полученные правила для баротропной среды получаем
(C216) show(apply1(Euler1,p_r))$
(D216)
∂
∂t
ω
I1I2
+ @L (ω
I0I1
, [V, I2]) = 0
20
Это и ест ь дифференциальная форма закона сохранения завихренности установленная
Кельвином и Гельмгльцом. Для более общего уравнения состояния, p = p(ρ, S), соответсву-
ющий закон сохранения для адиабатического течения был установлен Эртелем. Применяя
цепные правила для производных получаем,
(C217) show(factor(expand(apply1(Euler1,p_sr))))$
(D217)
∂
∂t
ω
I1I2
+ @L (ω
I0I1
, [V, I2]) =
(ρ
,I1
S
,I2
− S
,I1
ρ
,I2
)
d
dS
P
ρ
2
Таким образом в общем случае сама по-себ е завихренность не сохраняется. Заметим,
что левая часть уравнения может быть выражена через внешнее произведение 1-форм,
ρ
i1
&S
i2
. Поэтому для адиабатического течения сохраняется 3-форма, об разо ва нная внеш-
ним произведением 2-формы завихренност и и дифференциальной 1-формы энтропии. В
этом можно убедится непосредственно, взяв внешнее умножение, полученного уравнения
для завихренности с произвольной дифференциальной 1-формой энтропии и сложив ре-
зультат с соответсвующим внешним произведением уравнения адиабатт ы с 2-формой за-
вихренности. Вычисление внешнего произведения правой части, полученного выше урав-
нения, с произвольной 1-формой S
i
3 дает
(C218) rhs(Euler1)&(S([])@i3)$
(C219) show(factor(expand(apply1(%,p_sr))))$
(D219)
0
Вмороженность магнитного поля в плазму В ковариантной формулировке элек-
тродинамики магнитное и электрическое поле представляются, как компоненты антисим-
метричного ковариантного тензора Фарадея 2-го ранга, F . Магнитное поле представле-
но пространственными компонентами компонентами F , а електрическое - временными.
В результате, для описания магнитного поля можно ввести пространственный антисим-
метричный ковариантный тензор 2-ранга(2-форма) B
2
, а для электрического поля ввести
1-форму E
1
. Для идеально проводящей среды, с учетом E
1
− i
V
B
2
= 0 имеем,
(C230) allsym:false$
(C231) decsym(B,2,0,[anti(all)],[])$
(C232) e_field:B([i1,i2])|_V$
(C233) Equat: D_t*B([i2,i3])=-e_field@i3$
(C234) show(Equat)$
(D234)
∂
∂t
B
I2I3
= V
J3
B
I3J3,I2
+ V
J3
,I2
B
I3J3
− V
J3
B
I2J3,I3
− V
J3
,I3
B
I2J3
Условие отсутсвия магнитных зарядов означает,что d
i
&B
jk
= 0, т.е., форма B
2
- замкну-
та. Каждая замкнутая форма локально точна(по лемме Пуанкаре). Иначе говоря мож-
но записать рав енств о, B
jk
= d
j
&A
k
. Использование последнего условия (Equat) к виду,
(C246) ("re-compute the electric field")$
(C247) e_field1:A([i1])@i2|_V$
(C248) ("subt it in Equat")$
21
(C249) Equat1: D_t*B([i2,i3])=-e_field1@i3$
(C250) ("compute the Lie derivative of B")$
(C251) Lie_derB: ’"@L"(B([i1,i2]),[V,i3])=(A([i1])@i2)@L[V,i3]$
(C252) ("summing up lhs and rhs parts")$
(C253) emded:lhs(Equat1)+lhs(Lie_derB)=canform(rhs(Equat1)+rhs(Lie_derB))$
(C254) show(emded)$
(D254)
∂
∂t
B
I2I3
+ @L (B
I1I2
, [V, I3]) = 0
Последнее уравнение зав ершает доказательство вмороженности магнитного потока (ас-
социированного с формой B
2
) в движущуюся идеальную жидкость.
Список литературы
[1] Pavelle R., Wester M.,In Vol. 2, Chap. 3 of the MACSYMA REFERENCE MANUAL,
"Computer Programs for Research in Gravitation and Differential Geometry", 1982.
[2] Frankel T., “The Geometry of Physics”, Cambridge University Press, 1998.
22