DataPDF Available

Тензорная Алгебра в Maxima.

Authors:

Abstract

Ниже будут рассмотрены основные операции тензорной алгебры, которые можно проводить в maxima с помощью пакета itensor. При написании данного документа я ориентировался на руководство [1] описывающее основные функции доступные в itensor.
Тензорная Алгебра в 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
LP
%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
LP
,%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
L
KJ,I
+ Γ
L
%34I
Γ
%34
KJ
+ Γ
L
%33I
Γ
%33
KJ
L
KI,J
Γ
L
%34J
Γ
%34
KI
Γ
L
%33J
Γ
%33
KI
L
JK,I
Γ
L
%32I
Γ
%32
JK
Γ
L
%31I
Γ
%31
JK
+
L
JI,K
L
%32K
Γ
%32
JI
+ Γ
L
%31K
Γ
%31
JI
+
L
IK,J
L
%30J
Γ
%30
IK
L
%29J
Γ
%29
IK
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
T cos ϑ
R
2
sin ϑ
2
d
dR
T
R
K
d
2
2
T
R
2
sin
2
ϑ
+
d
2
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
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
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
ResearchGate has not been able to resolve any citations for this publication.
Book
Theodore Frankel explains those parts of exterior differential forms, differential geometry, algebraic and differential topology, Lie groups, vector bundles and Chern forms essential to a better understanding of classical and modern physics and engineering. Key highlights of his new edition are the inclusion of three new appendices that cover symmetries, quarks, and meson masses; representations and hyperelastic bodies; and orbits and Morse-Bott Theory in compact Lie groups. Geometric intuition is developed through a rather extensive introduction to the study of surfaces in ordinary space. First Edition Hb (1997): 0-521-38334-X First Edition Pb (1999): 0-521-38753-1
Каждая замкнутая форма локально точна(по лемме Пуанкаре) Иначе говоря можно записать равенство, 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
  • Условие Отсутсвия Магнитных Зарядов Означает
Условие отсутсвия магнитных зарядов означает,что 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")$ (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