4 @c OriginalRevision=1.44
5 @c TranslatedBy: (c) 2005-12 Valery Pipin <pip@iszf.irk.ru>
8 * Введение в пакет itensor::
9 * Функции и переменные пакета itensor::
12 @node Введение в пакет itensor, Функции и переменные пакета itensor, Пакет itensor, Пакет itensor
13 @section Введение в пакет itensor
15 В Maxima реализованы два различных типа операций над тензорами:
16 операции над компонентами -- пакет @code{ctensor} и операции с индексами -- пакет
19 ВАЖНОЕ ЗАМЕЧАНИЕ: Пожалуйста, ниже, обратите внимание на нововведения в системе индексных
20 обозначений для тензоров.
22 При операциях с компонентами тензорный объект рассматривается, как многомерный массив
23 или матрица. Операции свертки и ковариантного дифференцирования над такими объектами
24 фактически сводятся к дифференцированию элементов матрицы и суммированию по повторяющимся индексам
25 при помощи команды @code{do}. Полученный результат операций над компонентами тензора
26 хранится в форме массива или матрицы.
28 При операциях с индексами, тензор рассматривается как функция своих индексов (ковариантных,
29 контравариантных и индексов производной). В этом случае результат тензорных операций,
30 например, таких как свертка или ковариантное дифференцирование, достигается только
31 с помощью соответствующих манипуляций с индексами, а не с
32 компонентами, которым они соответствуют.
34 Оба подхода к рассмотрению дифференциальных, алгебраических и аналитических проблем в
35 контексте Римановой геометрии имеют и преимущества, и недостатки,
36 которые выявляются при рассмотрении конкретных задач. Необходимо иметь ввиду
37 следующие специфические свойства каждого из методов:
39 i) Представление тензоров в явном виде через их компоненты делает
40 @code{ctensor} алгоритмически простым в использовании. Вычисления метрики,
41 производных тензоров и инвариантов реализуются непосредственно по определению.
42 Однако, несмотря на вычислительную мощь Maxima, в случае достаточно
43 сложной метрики, внутренние функциональные связи и координатные зависимости
44 компонент метрики легко могут привести к чрезвычайно громоздким выражениям,
45 со скрытой структурой.
47 ii) В силу специфики способа, при котором тензора и операции над ними
48 рассматриваются в терминах символьных операций над их индексами, выражения,
49 вычисления которых в компонентном представлении выглядели бы громоздко, могут быть
50 иногда сильно упрощены при помощи использования симметрий тензоров и
51 специальных функций пакета @code{itensor}, использующих симметрии. В тоже
52 время, индексное представление тензоров в этом пакете создает
53 определенные трудности при определении метрики, функций
54 и вычислении дифференцируемых объектов.
56 @opencatbox{Категории:}
58 @category{Пакеты библиотеки share}
59 @category{Пакет itensor}
62 @subsection Новые соглашения для обозначения тензорных индексов
64 До настоящего времени, в пакете @code{itensor} были приняты обозначения,
65 которые не сохраняли порядок индексов при операциях свертки, например:
70 (%i3) ishow(g([],[j,k])*g([],[i,l])*a([i,j],[]))$
74 (%i4) ishow(contract(%))$
79 Этот результат не верен за исключением случая когда тензор @code{a}
80 симметричен. Порядок следования индекса теряется при свертке, несмотря на
81 то, что @code{itensor} сохраняет порядок индексов внутри
82 каждого набора ковариантных и контравариантных индексов (в соответствии
83 со свойствами симметрии).
85 Для того, чтобы избежать данной проблемы была предложена новая система
86 обозначений, которая совместима с существующей. В данном случае
87 контравариантные индексы могут быть вставлены в нужную позицию в наборе
88 ковариантных, но со знаком минус. Функции типа @code{contract()} и
89 @code{ishow()} были модифицированы таким образом, чтобы понимать
92 В данных обозначениях вычисление предыдущего примера дает:
95 (%i5) ishow(g([-j,-k],[])*g([-i,-l],[])*a([i,j],[]))$
99 (%i6) ishow(contract(%))$
104 В настоящий момент, единственной функцией, где новые обозначения
105 играют существенную роль является @code{lc2kdt}. Благодаря этому
106 удается получить корректный результат для тензорного произведения
107 символов Леви-Чивита, применяя метрический тензор не прибегая
108 к пересортировке численных индексов обобщенных символов Кронекера.
110 Поскольку данные нововведения сделаны относительно недавно, можно
111 ожидать присутствие ошибок. Код был достаточно тщательно
112 протестирован, чтобы убедиться, что ничего не нарушается
113 при использовании старых обозначений. В тоже время при работе
114 в новых обозначения шанс получения ошибки довольно значителен.
115 Для исправления замеченных ошибок обращайтесь к разработчикам.
118 @subsection Манипулирование тензорными индексами
120 Пакет манипулирования тензорными индексами загружается в Maxima командой
121 @code{load(itensor)}. Доступен ряд демонстрационных программ,
122 которые загружаются командой @code{demo(tensor)}.
124 В этом пакете тензор рассматривается, как функция индексов и их списков.
125 Список ковариантных индексов -- это первый аргумент индексного
126 объекта. Далее идет список контравариантных индексов и индексы
127 производной. Списки могут быть пустыми -- @code{[]}. Это говорит об отсутствии
128 ковариантный или контравариантных индексов тензора. Таким образом, @code{g([a,b],[c])}
129 представляет тензор @code{g}, который имеет 2 ковариантных индекса
130 @code{(a,b)}, один контравариантный -- (@code{c}) и не имеет индексов производной.
132 Если есть индексы производной, то они добавляются в качестве
133 дополнительных аргументов после списка контравариантных индексов.
134 Они могут быть либо определены пользователем в явном виде, либо
135 получены в процессе дифференцирования тензора.
136 Поскольку обычная производная -- это коммутативная операция, то индексы
137 производной по умолчанию сортируются в алфавитном порядке если флаг
138 @code{iframe_flag} не равен @code{true}, указывая на то, что
139 используется тетрадная метрика. Такой принцип сортировки делает возможным
140 для Maxima распознать что, например, @code{t([a],[b],i,j)} есть тоже
141 самое что и @code{t([a],[b],j,i)}. Дифференцирование индексных
142 объектов в отношении координат, индексы которых не являются аргументом
143 этого объекта, в обычной ситуации давало бы ноль, потому, что
144 по-умолчанию Maxima не знает, что тензор, представляемый в виде функции
145 по индексам, может неявно зависеть от соответствующей
146 координаты. Модификация существующей функции @code{diff} в
147 пакете @code{itensor} приводит к тому, что любой индексный объект зависит от
148 любой переменной дифференцирования пока не объявлено обратное. Это
149 делает возможным распространить известное правило суммирования по немым
150 индексам на индексы производных. Необходимо отметить, что @code{itensor} не
151 заложена возможность для подъема индексов производных и поэтому они
152 всегда рассматриваются как ковариантные.
154 В настоящий момент, все функции направленные на упрощение тензорных
155 выражений предполагают, что по умолчанию тензор не обладает
156 какими-либо свойствами симметрии. Это условие может быть переопределено путем
157 замены значения флага @code{allsym:false} на @code{true}. В этом
158 случае функции манипулирования индексами будут рассматривать все
159 индексные объекты, как полностью симметричные по спискам ковариантных
160 и контравариантных индексов.
162 Пакет @code{itensor} рассматривает тензора, как функциональные объекты. При
163 манипулировании тензорными уравнениями используются алгебраические правила,
164 свойства симметрии и свертки. Кроме того, в @code{itensor} определены операции
165 ковариантного дифференцирования, а также кривизна и
166 кручение. Вычисления могут проводится также и с учетом метрики
167 подвижных базисов (тетрады) если значение переменной
168 @code{iframe_flag} равно @code{true}.
170 В примере ниже показано как загрузить пакет @code{itensor}, задать имя
171 метрики и выполнить простые вычисления.
175 (%o1) /share/tensor/itensor.lisp
178 (%i3) components(g([i,j],[]),p([i,j],[])*e([],[]))$
179 (%i4) ishow(g([k,l],[]))$
182 (%i5) ishow(diff(v([i],[]),t))$
186 (%i7) ishow(diff(v([i],[]),t))$
190 (%i8) ishow(idiff(v([i],[]),j))$
193 (%i9) ishow(extdiff(v([i],[]),j))$
198 (%i10) ishow(liediff(v,w([i],[])))$
202 (%i11) ishow(covdiff(v([i],[]),j))$
206 (%i12) ishow(ev(%,ichr2))$
208 (%t12) v - g v (e p + e p - e p - e p
209 i,j %4 j %5,i ,i j %5 i j,%5 ,%5 i j
213 (%i13) iframe_flag:true;
215 (%i14) ishow(covdiff(v([i],[]),j))$
219 (%i15) ishow(ev(%,icc2))$
223 (%i16) ishow(radcan(ev(%,ifc2,ifc1)))$
225 (%t16) - (ifg v ifb + ifg v ifb - 2 v
226 %6 j %8 i %6 i j %8 i,j
231 (%i17) ishow(canform(s([i,j],[])-s([j,i])))$
234 (%i18) decsym(s,2,0,[sym(all)],[]);
236 (%i19) ishow(canform(s([i,j],[])-s([j,i])))$
238 (%i20) ishow(canform(a([i,j],[])+a([j,i])))$
241 (%i21) decsym(a,2,0,[anti(all)],[]);
243 (%i22) ishow(canform(a([i,j],[])+a([j,i])))$
248 @node Функции и переменные пакета itensor, , Введение в пакет itensor, Пакет itensor
250 @section Функции и переменные пакета @code{itensor}
251 @subsection Манипулирование индексными объектами
253 @deffn {Функция} entertensor (@var{name})
255 это интерактивная функция, которая позволяет создать индексный объект с
256 именем @var{name}, содержащий заданные пользователем списки
257 ковариантных и контравариантных индексов и индексы производных.
258 Отдельный индекс или список индексов (возможно пустой) считаются
259 допустимым вводом (см. пример в секции @code{covdiff}).
261 @opencatbox{Категории:}
262 @category{Пакет itensor}
266 @deffn {Функция} changename (@var{old}, @var{new}, @var{expr})
268 заменяет имя тензора со старого @var{old} на новое @var{new}
269 в выражении @var{expr}. @var{old} может быть как простым символом,
270 так и списком в форме @code{[@var{name}, @var{m}, @var{n}]}.
271 В последнем случае переименовываются только индексные объекты
272 с именем @var{name} с @var{m} ковариантным и @var{n}
273 контравариантным индексами.
275 @opencatbox{Категории:}
276 @category{Пакет itensor}
280 @deffn {Функция} listoftens (@var{expr})
282 в качестве результата возвращает список всех тензоров выражения
283 @var{expr}. Например,
287 (%i6) ishow(a([i,j],[k])*b([u],[],v)+c([x,y],[])*d([],[])*e)$
291 (%i7) ishow(listoftens(%))$
293 (%t7) [a , b , c , d]
298 @opencatbox{Категории:}
299 @category{Пакет itensor}
303 @deffn {Функция} ishow (@var{expr})
305 печатает выражение @var{expr}, содержащее индексные объекты,
306 в виде, где ковариантные индексы изображены в нижней позиции,
307 а контравариантные в верхней. Индексы производной изображаются после
308 ковариантных индексов и отделены запятой (примеры вывода данной
309 функции можно найти практически в любой части этого документа).
311 @opencatbox{Категории:}
312 @category{Пакет itensor}
317 @deffn {Функция} indices (@var{expr})
319 Возвращает список из двух элементов. Первый -- список свободных
320 индексов, не участвующих в свертке, в @var{expr}. Второй --
321 список немых индексов, участвующих в свертках. Например,
326 (%o1) /share/tensor/itensor.lisp
327 (%i2) ishow(a([i,j],[k,l],m,n)*b([k,o],[j,m,p],q,r))$
332 (%o3) [[l, p, i, n, o, q, r], [k, j, m]]
336 Тензорное произведение в котором один и тот же немой индекс
337 встречается более чем два раза является синтаксически
338 неправильным. При работе с ним Maxima выдаст ошибку.
340 @opencatbox{Категории:}
341 @category{Пакет itensor}
345 @deffn {Функция} rename (@var{expr})
346 @deffnx {Функция} rename (@var{expr}, @var{count})
348 Возвращает выражение эквивалентное исходному @var{expr}, но в
349 котором все немые индексы переименованы и пронумерованы. Имена берутся из списка
350 @code{[%1, %2, ...]}. В качестве опции можно задать номер @var{count}
351 с которого начинается список пронумерованных индексов. По умолчанию
352 немые индексы нумеруются от текущей величины @var{count}. Все немые
353 индексы в произведении встречаются ровно 2 раза. В случае ошибки
354 пользователя, когда в исходном выражении одно и тоже имя немого индекса
355 встречается более двух раз, Maxima выдаст ошибку и остановит вычисления.
356 Для суммы тензорных произведений, @code{rename} применяется к каждому
357 члену суммы при этом счетчик @var{count} каждый раз обнуляется при переходе к следующему
358 слагаемому. В этом случае функция @code{rename} может служить
359 для упрощения тензорных выражений. Кроме того, если @code{allsym} равно
360 @code{true}, то индексы сортируются в алфавитном порядке.
361 Если значение @code{flipflag} равно @code{false}, то переименование
362 и сортировка осуществляется относительно порядка контравариантных индексов.
363 В случае если значение @code{flipflag} равно @code{true} переименование и сортировка
364 производится относительно порядка ковариантных индексов. Часто
365 бывает, что комбинированный эффект двух применений @code{rename} с
366 переменой значения флага @code{flipflag} позволяет существенно
367 упростить исходное выражение. Например,
372 (%o1) /share/tensor/itensor.lisp
375 (%i3) g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%4],[%3])*
376 ichr2([%2,%3],[u])*ichr2([%5,%6],[%1])*ichr2([%7,r],[%2])-
377 g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%2],[u])*
378 ichr2([%3,%5],[%1])*ichr2([%4,%6],[%3])*ichr2([%7,r],[%2]),noeval$
381 %4 %5 %6 %7 %3 u %1 %2
382 (%t4) g g ichr2 ichr2 ichr2 ichr2
383 %1 %4 %2 %3 %5 %6 %7 r
385 %4 %5 %6 %7 u %1 %3 %2
386 - g g ichr2 ichr2 ichr2 ichr2
387 %1 %2 %3 %5 %4 %6 %7 r
390 (%i6) ishow(rename(expr))$
391 %2 %5 %6 %7 %4 u %1 %3
392 (%t6) g g ichr2 ichr2 ichr2 ichr2
393 %1 %2 %3 %4 %5 %6 %7 r
395 %4 %5 %6 %7 u %1 %3 %2
396 - g g ichr2 ichr2 ichr2 ichr2
397 %1 %2 %3 %4 %5 %6 %7 r
398 (%i7) flipflag:false;
400 (%i8) rename(%th(2));
402 (%i9) ishow(rename(expr))$
403 %1 %2 %3 %4 %5 %6 %7 u
404 (%t9) g g ichr2 ichr2 ichr2 ichr2
405 %1 %6 %2 %3 %4 r %5 %7
407 %1 %2 %3 %4 %6 %5 %7 u
408 - g g ichr2 ichr2 ichr2 ichr2
409 %1 %3 %2 %6 %4 r %5 %7
412 @opencatbox{Категории:}
413 @category{Пакет itensor}
417 @defvr {Управляющая переменная} flipflag
418 Значение по умолчанию: @code{false}
420 Если значение @code{flipflag} равно @code{false}, то сортировка и переименование индексов
421 осуществляется относительно порядка контравариантных индексов, в
422 противном случае -- относительно порядка ковариантных индексов.
423 Значение флага @code{flipflag} влияет на результат применения функции
424 @code{rename()} следующим образом: если @code{flipflag} равно
425 @code{false} то @code{rename} формирует список немых индексов по списку контравариантных
426 индексов, по мере поступления, слева направо (если значение флага равно
427 @code{true}, тогда используется список ковариантных индексов). Первый
428 немой индекс в списке переименовывается в @code{%1}, следующий в
429 @code{%2} и т.д.). Затем индексы сортируются (см. пример в @code{rename()}).
431 @opencatbox{Категории:}
432 @category{Пакет itensor}
437 @deffn {Функция} defcon (@var{tensor_1})
438 @deffnx {Функция} defcon (@var{tensor_1}, @var{tensor_2}, @var{tensor_3})
439 задает свойства тензорной свертки тензора @var{tensor_1} с @var{tensor_3} так, что в
440 результате получается @var{tensor_3} с соответствующими индексами.
441 Если задан единственный аргумент, @var{tensor_1}, тогда свертка любого
442 другого тензора (скажем @code{my_tensor}) с @var{tensor_1} дает тот
443 же тензор (@code{my_tensor}), но с новым набором индексов в
444 соответствии с операцией свертки. В этом случае, @var{tensor_1}
445 может быть использован для подъема или опускания индексов.
447 Например, пусть @code{imetric:g}, тогда путем @code{defcon(g)} можно
448 реализовать подъем и опускание индексов тензора, сворачивая его с метрическим тензором.
450 Для одного и того же индексного объекта может быть задано более одного
451 правила свертки. В этом случае, для одинаковых объектов
452 используется правило свертки заданное последним.
453 @code{contractions} содержит список индексных объектов с заданными,
454 посредством @code{defcon}, правилами свертки.
456 @opencatbox{Категории:}
457 @category{Пакет itensor}
462 @deffn {Функция} remcon (@var{tensor_1} , ..., @var{tensor_n})
463 удаляет все правила свертки для объектов @var{tensor_i}.
464 @code{remcon(all)} удаляет все правила свертки для всех
467 @opencatbox{Категории:}
468 @category{Пакет itensor}
473 @deffn {Функция} contract (@var{expr})
475 Выполняет свертку тензорного выражения @var{expr}, которое само по себе может быть
476 произвольной комбинацией сумм и произведений тензоров. Правила свертки должны
477 быть предварительно заданы с помощью @code{defcon}.
478 Для наилучших результатов, в выражении @var{expr}, необходимо раскрыть
479 все скобки. Если коэффициенты при тензорах в @var{expr}
480 не содержат дробей, то наиболее эффективный и быстрый способ
481 раскрытия скобок в @var{expr} состоит в применении функции
482 @code{ratexpand}. При этом, флаг @code{gcd} можно положить равным
483 @code{false}, чтобы программа не пыталась искать сокращение
484 множителей, используя GCD алгоритмы.
486 @opencatbox{Категории:}
487 @category{Пакет itensor}
492 @deffn {Функция} indexed_tensor (@var{tensor})
494 Данная операция необходима всяких раз, когда пользователь собирается
495 присвоить новые индексные выражения компонентам тензора
496 @var{tensor}, для которого в системе уже предусмотрено свое
497 индексное представление. Примером могут служить символы Кристоффеля 1-го и 2-го рода
498 @code{ichr1}, @code{ichr2}, выраженные через компоненты метрики, или
499 тензор кривизны Римана @code{icurvature}. См. пример в
500 пункте @code{icurvature}.
502 @opencatbox{Категории:}
503 @category{Пакет itensor}
508 @deffn {Функция} components (@var{tensor}, @var{expr})
510 Данная функция присваивает тензору @var{tensor} индексное выражение
511 @var{expr}. Это приводит к тому, что при последующих вычислениях
512 индексные выражения @var{tensor} автоматически заменяются на
513 соответствующие @var{expr}. @var{tensor} должен иметь вид @code{t([...],[...])},
514 где каждый из списков может быть пустым. @var{expr} может быть любым
515 индексным выражением имеющим тот же набор свободных индексов (не
516 участвующих в свертке), что и @var{tensor}. Если @var{expr} содержит
517 свертки, то необходимо быть внимательным в выборе значений немых
518 индексов, чтобы избежать повторных немых индексов. В
519 этом случае можно рекомендовать другой способ присваивания
520 компонент, заключающийся в использовании конструкций @code{defrule}
521 (см. пример ниже). Функция @code{remcomps} очищает использованное
522 ранее определение компонент тензора.
524 Важно понимать, что для @code{components} важна только валентность
525 тензора а не порядок индексов. Присваивание значения
526 @code{x([i,-j],[])}, @code{x([-j,i],[])} или @code{x([i],[j])}
527 приводит к одному результату -- значение присваивается
528 тензору с именем @code{x} и валентностью @code{(1,1)}.
531 Любому индексному выражению можно присвоить любое другое индексное
532 представление и компоненты 4-мя различными способами, 2 способа
533 включают использование, рассмотренной выше функции @code{components}:
535 1) Присваивание одного индексного выражения другому:
539 (%i2) components(g([],[i,j]),e([],[i])*p([],[j]))$
540 (%i3) ishow(g([],[i,j]))$
546 2) В виде матрицы компонент:
550 (%i6) components(g([i,j],[]),lg);
552 (%i7) ishow(g([i,j],[]))$
562 3) Путем определения функции. В примере ниже, тензор
563 @code{h} равен @code{kdelta} если @code{h} имеет одинаковое
564 количество ковариантных и контравариантных индексов, а индексы
565 производной отсутствуют. В любом другом случае, тензор @code{h}
566 равен тензору @code{g}:
570 (%i4) h(l1,l2,[l3]):=if length(l1)=length(l2) and length(l3)=0
571 then kdelta(l1,l2) else apply(g,append([l1,l2], l3))$
572 (%i5) ishow(h([i],[j]))$
576 (%i6) ishow(h([i,j],[k],l))$
583 4) Последний пример связан с использованием конструкций
589 (%o1) /share/tensor/itensor.lisp
590 (%i2) matchdeclare(l1,listp);
592 (%i3) defrule(r1,m(l1,[]),(i1:idummy(),
593 g([l1[1],l1[2]],[])*q([i1],[])*e([],[i1])))$
595 (%i4) defrule(r2,m([],l1),(i1:idummy(),
596 w([],[l1[1],l1[2]])*e([i1],[])*q([],[i1])))$
598 (%i5) ishow(m([i,n],[])*m([],[i,m]))$
602 (%i6) ishow(rename(applyb1(%,r1,r2)))$
610 @opencatbox{Категории:}
611 @category{Пакет itensor}
616 @deffn {Функция} remcomps (@var{tensor})
618 Удаляет из системы значения компонент тензора
619 @code{tensor}, присвоенных при помощи функции @code{components}.
621 @opencatbox{Категории:}
622 @category{Пакет itensor}
626 @c NEED LIST OF ARGUMENTS HERE
627 @deffn {Функция} showcomps (@var{tensor})
629 Печатает значение компонент тензора, которые были присвоены с
630 помощью @code{components}.
631 Данная функция особенно полезна в случае, когда компоненты
632 тензора были заданы с помощью матрицы, как в данном примере:
637 (%o1) /share/tensor/ctensor.mac
639 (%o2) /share/tensor/itensor.lisp
640 (%i3) lg:matrix([sqrt(r/(r-2*m)),0,0,0],[0,r,0,0],
641 [0,0,sin(theta)*r,0],[0,0,0,sqrt((r-2*m)/r)]);
643 [ sqrt(-------) 0 0 0 ]
648 [ 0 0 r sin(theta) 0 ]
651 [ 0 0 0 sqrt(-------) ]
653 (%i4) components(g([i,j],[]),lg);
655 (%i5) showcomps(g([i,j],[]));
657 [ sqrt(-------) 0 0 0 ]
662 i j [ 0 0 r sin(theta) 0 ]
665 [ 0 0 0 sqrt(-------) ]
671 Функция @code{showcomps} может также печатать компоненты тензоров
674 @opencatbox{Категории:}
675 @category{Пакет itensor}
680 @deffn {Функция} idummy ()
682 Увеличивает значение счетчика @code{icounter} немых индексов на 1 и возвращает
683 значение индекса в форме @code{%n}, где n это положительное целое число.
684 Применение @code{idummy} гарантирует, что немые индексы, встречающиеся в
685 текущем выражении? не будут конфликтовать с уже использованными
686 (см. пример в секции @code{indices}).
688 @opencatbox{Категории:}
689 @category{Пакет itensor}
694 @defvr {Управляющая переменная} idummyx
695 Значение по умолчанию: @code{%}
697 Данная переменная задает приставку (префикс) для генерируемых немых индексов
698 (см. пример в секции @code{indices}).
700 @opencatbox{Категории:}
701 @category{Пакет itensor}
705 @defvr {Управляющая переменная} icounter
706 Значение по умолчанию: @code{1}
708 Определяет численный суффикс для генерируемого
709 немого индекса. Приставка (префикс) определяется
710 переменной @code{idummyx}
712 @opencatbox{Категории:}
713 @category{Пакет itensor}
717 @deffn {Функция} kdelta (@var{l1}, @var{l2})
718 Обобщенный символ Кронекера, где @var{l1} и @var{l2} -- списки ковариантных и
719 контравариантных индексов соответственно. @code{kdelta([i],[j])} возвращает обычный
720 дельта-символ Кронекера. Команда @code{ev(@var{expr},kdelta)} вычисляет @var{expr}, заменяя
721 все конструкции вида @code{kdelta([],[])} (след @code{kdelta}) на размерность многообразия.
723 @code{itensor} также позволяет использование в @code{kdelta()} c двумя ковариантными или
724 двумя контравариантными индексами. Эта дает возможность задать единичную ко(нтра)-вариантную
725 матрицу. Данная конструкция предусмотрена только для целей программирования. Следует помнить,
726 что в @code{itensor} @code{kdelta([i,j],[])} не является разрешенным тензорным объектом.
727 Будьте готовы,что при операциях с @code{kdelta([i,j],[])} Maxima может
728 пожаловаться на неправильный индексный объект и отказаться от дальнейших вычислений.
730 @opencatbox{Категории:}
731 @category{Пакет itensor}
735 @deffn {Функция} kdels (@var{l1}, @var{l2})
737 Симметризованная версия обобщенного дельта-символа Кронекера. Введена для удобства вычислений.
738 Свертка выражения с этим тензором приводит к его симметризации. Примеры:
743 (%o1) /share/tensor/itensor.lisp
744 (%i2) kdelta([1,2],[2,1]);
746 (%i3) kdels([1,2],[2,1]);
748 (%i4) ishow(kdelta([a,b],[c,d]))$
750 (%t4) kdelta kdelta - kdelta kdelta
752 (%i4) ishow(kdels([a,b],[c,d]))$
754 (%t4) kdelta kdelta + kdelta kdelta
759 @opencatbox{Категории:}
760 @category{Пакет itensor}
764 @deffn {Функция} levi_civita (@var{l})
765 Перестановочный тензор Леви-Чивита, который дает 1 если список @var{l}
766 является четной перестановкой целых чисел, -1 для нечетной
767 перестановки, и 0 когда встречаются повторяющиеся индексы.
769 @opencatbox{Категории:}
770 @category{Пакет itensor}
775 @deffn {Функция} lc2kdt (@var{expr})
776 Приводит к упрощению выражений содержащих символы Леви-Чивита (произведения этих символов
777 заменяются на соответствующие дельта-символы Кронекера). Основная разница между действием
778 данной функции и непосредственным вычислением перестановочного тензора состоит в том,
779 что прямое вычисление тензора Леви-Чивита часто приводит к выражениям
780 содержащим дельта-символы с целочисленными значения индексов, что затрудняет
781 дальнейшие операции. Применение функции @code{lc2kdt} позволяет избежать этих проблем.
786 (%o1) /share/tensor/itensor.lisp
787 (%i2) expr:ishow('levi_civita([],[i,j])
788 *'levi_civita([k,l],[])*a([j],[k]))$
790 (%t2) levi_civita a levi_civita
792 (%i3) ishow(ev(expr,levi_civita))$
794 (%t3) kdelta a kdelta
796 (%i4) ishow(ev(%,kdelta))$
798 (%t4) (kdelta kdelta - kdelta kdelta ) a
802 (kdelta kdelta - kdelta kdelta )
804 (%i5) ishow(lc2kdt(expr))$
806 (%t5) a kdelta kdelta - a kdelta kdelta
808 (%i6) ishow(contract(expand(%)))$
815 Для использования @code{lc2kdt()} необходимо задать метрический тензор
816 (для случая когда, встречаются произведения перестановочных тензоров одинакового
817 ранга и типа). Если метрика не была задана заранее (с помощью
818 @code{imetric}), то можно столкнуться с ошибкой.
822 (%i7) expr:ishow('levi_civita([],[i,j])
823 *'levi_civita([],[k,l])*a([j,k],[]))$
825 (%t7) levi_civita levi_civita a
827 (%i8) ishow(lc2kdt(expr))$
828 Maxima encountered a Lisp error:
830 Error in $IMETRIC [or a callee]:
831 $IMETRIC [or a callee] requires less than two arguments.
833 Automatically continuing.
834 To reenable the Lisp debugger set *debugger-hook* to nil.
837 (%i10) ishow(lc2kdt(expr))$
838 %3 i k %4 j l %3 i l %4 j
839 (%t10) (g kdelta g kdelta - g kdelta g
844 (%i11) ishow(contract(expand(%)))$
850 @opencatbox{Категории:}
851 @category{Пакет itensor}
856 @deffn {Функция} lc_l
858 Правило упрощения выражений содержащих индексные символы Леви-Чивита
859 (@code{levi_civita}). Данное правило преобразования использует свойства антисимметрии
860 перестановочного тензора. Например:
865 (%o1) /share/tensor/itensor.lisp
866 (%i2) el1:ishow('levi_civita([i,j,k],[])*a([],[i])*a([],[j]))$
868 (%t2) a a levi_civita
870 (%i3) el2:ishow('levi_civita([],[i,j,k])*a([i])*a([j]))$
872 (%t3) levi_civita a a
874 (%i4) ishow(canform(contract(expand(applyb1(el1,lc_l,lc_u)))))$
876 (%i5) ishow(canform(contract(expand(applyb1(el2,lc_l,lc_u)))))$
881 @opencatbox{Категории:}
882 @category{Пакет itensor}
886 @deffn {Функция} lc_u
888 Правило упрощения выражений содержащих индексные символы Леви-Чивита
889 (@code{levi_civita}), аналогично @code{lc_l}, данное правило преобразования
890 использует свойства антисимметрии перестановочного тензора
891 (см. пример в секции @code{lc_l}).
893 @opencatbox{Категории:}
894 @category{Пакет itensor}
898 @deffn {Функция} canten (@var{expr})
899 Функция предназначена для упрощения тензорных выражений путем переименования
900 и перестановки немых индексов. Область применения @code{canten} ограничена. Данная функция
901 применима только для сумм тензорных произведений в которых отсутствуют индексы производной
902 и не встречаются символы Леви-Чивита. Ввиду этих ограничений, следует избегать
903 ее использования. Вместо нее рекомендуется применять @code{canform}.
905 @opencatbox{Категории:}
906 @category{Пакет itensor}
910 @deffn {Функция} concan (@var{expr})
912 Аналогична @code{canten} но дополнительно производит
915 @opencatbox{Категории:}
916 @category{Пакет itensor}
921 @subsection Симметрии тензоров
923 @defvr {Управляющая переменная} allsym
924 Значение по умолчанию: @code{false}
926 Если данной переменной присвоить @code{true}, тогда все индексные
927 объекты будут считаться симметричными
928 по всем ковариантным и контравариантным индексам. Если @code{allsym} равно
929 @code{false}, все тензора не имеют никаких свойств симметрии априори,
930 пока симметрии не будут объявлены. Индексы производной предполагаются симметричными,
931 до тех пор пока не объявлено, что @code{iframe_flag} равен @code{true}.
933 @opencatbox{Категории:}
934 @category{Пакет itensor}
939 @deffn {Функция} decsym (@var{tensor}, @var{m}, @var{n}, [@var{cov_1}, @var{cov_2}, ...], [@var{contr_1}, @var{contr_2}, ...])
941 Объявляет свойства симметрии тензора @var{tensor} по @var{m} ковариантному и
942 @var{n} контравариантным индексам, где @var{cov_i} и @var{contr_i} --
943 псевдофункции, выражающие соотношения перестановочных симметрий по ковариантным и
944 контравариантным индексам соответственно. Данные псевдофункции
945 записываются в форме @code{symoper(@var{index_1}, @var{index_2}, ...)}, где
946 переменная @code{symoper} принимает одно из следующих: @code{sym},
947 @code{anti} или @code{cyc}, которые означают соответственно, симметрию,
948 антисимметрию или цикличность индексов. Переменная
949 @var{index_i} принимает целочисленные значения и указывает на позицию
950 индекса в @var{tensor}, для которого объявляются свойства симметрии.
951 Определения вида @code{symoper(all)} также дозволены, означая, что все
952 индексы удовлетворяют выбранному свойству симметрии.
953 Например, рассмотрим тензорный объект @code{b} с 5-ю ковариантными
955 @code{decsym(b,5,3,[sym(1,2),anti(3,4)],[cyc(all)])} объявляет @code{b}
956 симметричным по первому и второму индексу, антисимметричным по 3 и 4
957 ковариантным индексам и циклическим по всем контравариантным индексам.
958 Список декларирующий симметрии может быть пустым. Функция @code{canform}
959 использует декларированные свойства симметрии для упрощения тензорных
960 выражений. Примеры даны ниже.
965 (%o1) /share/tensor/itensor.lisp
966 (%i2) expr:contract( expand( a([i1, j1, k1], [])
967 *kdels([i, j, k], [i1, j1, k1])))$
969 (%t3) a + a + a + a + a + a
970 k j i k i j j k i j i k i k j i j k
971 (%i4) decsym(a,3,0,[sym(all)],[]);
973 (%i5) ishow(canform(expr))$
978 (%i7) decsym(a,3,0,[anti(all)],[]);
980 (%i8) ishow(canform(expr))$
984 (%i10) decsym(a,3,0,[cyc(all)],[]);
986 (%i11) ishow(canform(expr))$
989 (%i12) dispsym(a,3,0);
990 (%o12) [[cyc, [[1, 2, 3]], []]]
994 @opencatbox{Категории:}
995 @category{Пакет itensor}
1000 @deffn {Функция} remsym (@var{tensor}, @var{m}, @var{n})
1002 Удаляет все свойства симметрии тензора @var{tensor}, имеющего @var{m}
1003 ковариантных и @var{n} контравариантных индексов.
1005 @opencatbox{Категории:}
1006 @category{Пакет itensor}
1011 @deffn {Функция} canform (@var{expr})
1012 @deffnx {Функция} canform (@var{expr}, @var{rename})
1013 Упрощает выражение @var{expr}, используя
1014 переименование немых индексов и сортировку всех индексов с учетом
1015 объявленных свойств симметрии. Если @code{allsym} равен @code{true},
1016 тогда все индексные выражения подразумеваются симметричными по всем
1017 индексам. В противном случае используется свойства , объявленные при помощи @code{decsym}.
1018 Немые индексы переименовываются таким же образом, как и при
1019 использовании @code{rename}.
1020 Следует иметь ввиду, что упрощение громоздких выражений может потребовать
1021 значительного количества вычислительного времени и ресурсов
1022 памяти. Иногда затраты на вычисления можно уменьшить если сначала
1023 переименовать индексы при помощи @code{rename}.
1024 См. примеры в пункте @code{decsym}. Заметим, что @code{canform} не
1025 всегда приводит выражение к простейшей форме.
1026 В тоже время @code{canform} всегда возвращает математически
1027 корректный результат.
1029 Если значение второго необязательного параметра @var{rename} равно @code{false},
1030 то переименование не производится.
1033 @opencatbox{Категории:}
1034 @category{Пакет itensor}
1038 @subsection Операции над индексами тензоров
1041 @deffn {Функция} diff (@var{expr}, @var{v_1}, [@var{n_1}, [@var{v_2}, @var{n_2}] ...])
1042 Стандартная функция дифференцирования Maxima, которая в пакете @code{itensor} имеет
1043 дополнительные свойства. Данная конструкция означает взятие
1044 производной выражения @var{expr} по переменной @var{v_1}, @var{n_1}
1045 раз, по @var{v_2}, @var{n_2}раз и т.д.
1046 В применении к тензорным объектам, функция дифференцирования
1047 модифицирована таким образом, что @code{v_i} может иметь целочисленные
1048 значения от 1 до @code{dim}. В этом случае дифференцирование выполняется
1049 по отношению к @code{v_i}-ому элементу списка @code{vect_coords}. Если
1050 @code{vect_coords} является атомом, тогда переменная
1051 индексированная именем @code{v_i} будет использована как переменная для
1052 дифференцирования. Это допускает использование массива имен координат или индексированных
1053 имен типа @code{x[1]}, @code{x[2]}, в качестве переменных
1056 @opencatbox{Категории:}
1057 @category{Пакет itensor}
1062 @deffn {Функция} idiff (@var{expr}, @var{v_1}, [@var{n_1}, [@var{v_2}, @var{n_2}] ...])
1063 Индексное дифференцирование. В отличие от функции @code{diff}, которая
1064 дифференцирует в отношении некоторой независимой переменной, @code{idiff} может
1065 быть использован при дифференцировании по координате. Для индексного
1066 объекта, такое дифференцирование добавляет @code{v_i} к индексам
1067 производной (он добавляется последовательно к ковариантным индексам
1068 после запятой). В дальнейшем индексы производной могут сортироваться
1069 если переменная @code{iframe_flag} не равна @code{true}.
1071 @code{idiff} можно использовать при дифференцировании детерминанта
1072 метрического тензора. Таким образом, если метрика @code{imetric}
1073 обозначена через @code{g}, тогда @code{idiff(determinant(g),k)} возвращает
1074 @code{2*determinant(g)*ichr2([%i,k],[%i])}, где немой индекс @code{%i}
1075 пробегает соответствующие значения.
1077 @opencatbox{Категории:}
1078 @category{Пакет itensor}
1083 @deffn {Функция} liediff (@var{v}, @var{tensor})
1085 Вычисляет производную Ли от тензорного выражения @var{tensor} в отношении
1086 векторного поля @var{v}. @var{tensor} может быть произвольным тензорным
1087 объектом, а @var{v} -- имя векторного поля (без индексов). Например:
1091 (%i1) load(itensor);
1092 (%o1) /share/tensor/itensor.lisp
1093 (%i2) ishow(liediff(v,a([i,j],[])*b([],[k],l)))$
1095 (%t2) b (v a + v a + v a )
1096 ,l i j,%2 ,j i %2 ,i %2 j
1099 + (v b - b v + v b ) a
1100 ,%1 l ,l ,%1 ,l ,%1 i j
1105 @opencatbox{Категории:}
1106 @category{Пакет itensor}
1112 @deffn {Функция} rediff (@var{ten})
1114 Вычисляет все команды @code{idiff} в выражении @var{ten}.
1116 @opencatbox{Категории:}
1117 @category{Пакет itensor}
1122 @deffn {Функция} undiff (@var{expr})
1124 Возвращает выражение эквивалентное @var{expr}, но в котором все
1125 производные индексных объектов заменяются на не вычисляемую форму
1126 функции @code{idiff} с такими аргументами, чтобы при дифференцировании
1127 получился бы соответствующий индексный объект. Это бывает полезно, когда
1128 желательно провести некоторые замены в продифференцированных индексных
1129 объектах. После этого дифференцирование выполняется при помощи
1130 @code{ev(@var{expr}, idiff)}.
1132 @opencatbox{Категории:}
1133 @category{Пакет itensor}
1138 @deffn {Функция} evundiff
1140 Эквивалентно применению @code{undiff}, затем @code{ev} и
1143 При помощи этой функции можно легко вычислять выражения,
1144 дифференциальную форму которых иначе
1145 невозможно вычислить. Например, следующее выражение приводит к ошибке:
1148 (%i1) load(itensor);
1149 (%o1) /share/tensor/itensor.lisp
1150 (%i2) icurvature([i,j,k],[l],m);
1151 Maxima encountered a Lisp error:
1153 Error in $ICURVATURE [or a callee]:
1154 $ICURVATURE [or a callee] requires less than three arguments.
1156 Automatically continuing.
1157 To reenable the Lisp debugger set *debugger-hook* to nil.
1160 Однако, если сначала ввести @code{icurvature} в не вычисляемой форме, а
1161 затем применить @code{evundiff}, то получим желаемый результат:
1164 (%i3) ishow('icurvature([i,j,k],[l],m))$
1168 (%i4) ishow(evundiff(%))$
1170 (%t4) - ichr2 - ichr2 ichr2 - ichr2 ichr2
1171 i k,j m %1 j i k,m %1 j,m i k
1174 + ichr2 + ichr2 ichr2 + ichr2 ichr2
1175 i j,k m %1 k i j,m %1 k,m i j
1178 ЗАМЕЧАНИЕ: В ранних версиях Maxima, операции производных в определениях
1179 символов Кристоффеля всегда должны были вводится в не вычисляемой
1180 форме. Сейчас это исправлено и надобность в процедуре @code{evundiff}
1181 в этом случае отпала. Например:
1186 (%i6) ishow(ichr2([i,j],[k],l))$
1189 j %3,i l i j,%3 l i %3,j l
1190 (%t6) -----------------------------------------
1195 ,l j %3,i i j,%3 i %3,j
1196 + -----------------------------------
1201 @opencatbox{Категории:}
1202 @category{Пакет itensor}
1207 @deffn {Функция} flush (@var{expr}, @var{tensor_1}, @var{tensor_2}, ...)
1208 Обнуляет в @var{expr} все объекты @var{tensor_i}, не имеющие индексов
1211 @opencatbox{Категории:}
1212 @category{Пакет itensor}
1217 @deffn {Функция} flushd (@var{expr}, @var{tensor_1}, @var{tensor_2}, ...)
1218 Обнуляет в @var{expr} все объекты @var{tensor_i}, имеющие индексы
1221 @opencatbox{Категории:}
1222 @category{Пакет itensor}
1226 @deffn {Функция} flushnd (@var{expr}, @var{tensor}, @var{n})
1227 Обнуляет в @var{expr} все объекты @var{tensor}, имеющие @var{n} и больше индексов
1228 производной. Например,
1232 (%i1) load(itensor);
1233 (%o1) /share/tensor/itensor.lisp
1234 (%i2) ishow(a([i],[J,r],k,r)+a([i],[j,r,s],k,r,s))$
1238 (%i3) ishow(flushnd(%,a,3))$
1244 @opencatbox{Категории:}
1245 @category{Пакет itensor}
1250 @deffn {Функция} coord (@var{tensor_1}, @var{tensor_2}, ...)
1252 Дает тензорам @var{tensor_i} свойства координатного дифференцирования,
1253 такие что производная контравариантного вектора, имя которого совпадает
1254 с одним из @var{tensor_i}, дает дельта-символ Кронекера. Например, если
1255 @code{coord(x)}, тогда вычисление @code{idiff(x([],[i]),j)} дает @code{kdelta([i],[j])}.
1256 @code{coord} это список всех индексных объектов имеющих это свойство.
1258 @opencatbox{Категории:}
1259 @category{Пакет itensor}
1263 @deffn {Функция} remcoord (@var{tensor_1}, @var{tensor_2}, ...)
1265 Удаляет свойства координатного дифференцирования для объектов @var{tensor_i}.
1266 @code{remcoord(all)} удаляет свойства координатного дифференцирования
1267 для всех индексных объектов.
1269 @opencatbox{Категории:}
1270 @category{Пакет itensor}
1275 @deffn {Функция} makebox (@var{expr})
1276 Служит для цели аналогичной @code{ishow}. В дополнение,
1277 все даламбертианы, встречающиеся в @var{expr} отображаются символом @code{[]}.
1278 Например, @code{[]p([m],[n])} представляет сокращение для
1279 @code{g([],[i,j])*p([m],[n],i,j)}.
1281 @opencatbox{Категории:}
1282 @category{Пакет itensor}
1286 @deffn {Функция} conmetderiv (@var{expr}, @var{tensor})
1287 Используется для упрощения выражений, содержащих
1288 частные производные ковариантных и контравариантных форм метрического
1290 Например, при помощи @code{conmetderiv} можно связать частные
1291 производные метрического тензора с символами Кристоффеля:
1295 (%i1) load(itensor);
1296 (%o1) /share/tensor/itensor.lisp
1297 (%i2) ishow(g([],[a,b],c))$
1301 (%i3) ishow(conmetderiv(%,g))$
1303 (%t3) - g ichr2 - g ichr2
1308 @opencatbox{Категории:}
1309 @category{Пакет itensor}
1314 @deffn {Функция} simpmetderiv (@var{expr})
1315 @deffnx {Функция} simpmetderiv (@var{expr} [, @var{stop}])
1317 Упрощает выражения, содержащие произведения производных метрического
1318 тензора. В частности @code{simpmetderiv} использует два тождества:
1323 g g + g g = (g g ) = (kdelta ) = 0
1324 ,d bc bc,d bc ,d c ,d
1347 которое следует из симметрии символов Кристоффеля.
1349 Функция @code{simpmetderiv} имеет один необязательный аргумент,
1350 который, если присутствует, вызывает прекращение работы функции
1351 сразу после первой успешной подстановки.
1352 Функция @code{simpmetderiv} использует глобальную опцию
1353 @var{flipflag}, которая определяет каким образом следует выбирать
1354 "канонический" порядок индексов произведения.
1356 В целом, данные возможности позволяют осуществлять упрощения,
1357 которые невозможно реализовать другими способами,
1358 что демонстрируется в следующем примере:
1362 (%i1) load(itensor);
1363 (%o1) /share/tensor/itensor.lisp
1366 (%i3) ishow(g([],[a,b])*g([],[b,c])*g([a,b],[],d)*g([b,c],[],e))$
1370 (%i4) ishow(canform(%))$
1372 errexp1 has improper indices
1373 -- an error. Quitting. To debug this try debugmode(true);
1374 (%i5) ishow(simpmetderiv(%))$
1378 (%i6) flipflag:not flipflag;
1380 (%i7) ishow(simpmetderiv(%th(2)))$
1384 (%i8) flipflag:not flipflag;
1386 (%i9) ishow(simpmetderiv(%th(2),stop))$
1390 (%i10) ishow(contract(%))$
1397 См. также @code{weyl.dem}, для примера совместного применения @code{simpmetderiv}
1398 и @code{conmetderiv} для упрощения тензора Вейля.
1400 @opencatbox{Категории:}
1401 @category{Пакет itensor}
1406 @deffn {Функция} flush1deriv (@var{expr}, @var{tensor})
1408 Обнуляет все производные первого порядка от @var{tensor} в @var{expr}.
1410 @opencatbox{Категории:}
1411 @category{Пакет itensor}
1416 @subsection Тензоры в искривленном пространстве
1419 @deffn {Функция} imetric (@var{g})
1420 @deffnx {Системная переменная} imetric
1422 Определяет имя метрического тензора, присваивая соответствующее значение
1423 переменной @code{imetric}, @code{imetric:@var{g}}. В дополнение к этому программа
1424 устанавливает соответствующие свойства свертки для данной метрики:
1425 @code{defcon(@var{g})}, @code{defcon(@var{g},@var{g},kdelta)}.
1426 По умолчанию переменная @code{imetric} не имеет значения.
1428 @opencatbox{Категории:}
1429 @category{Пакет itensor}
1434 @deffn {Функция} ichr1 ([@var{i}, @var{j}, @var{k}])
1435 Дает значение символа Кристоффеля первого рода, которое по определению равно:
1442 Перед тем как использовать явные выражения для символов Кристоффеля
1443 необходимо определить имя метрического тензора, присвоив соответствующее
1444 значение переменной @code{imetric}, см. пример ниже в разделе @code{covdiff}.
1446 @opencatbox{Категории:}
1447 @category{Пакет itensor}
1451 @deffn {Функция} ichr2 ([@var{i}, @var{j}],[@var{k}])
1452 Дает значение символа Кристоффеля 2-го рода, которые по определению равны:
1456 ichr2([i,j],[k]) = g (g + g - g )/2
1460 @opencatbox{Категории:}
1461 @category{Пакет itensor}
1466 @deffn {Функция} icurvature ([@var{i}, @var{j}, @var{k}], [@var{h}])
1467 Дает выражение для тензора кривизны Римана через символы Кристоффеля
1468 2-го рода (@code{ichr2}). Используется следующее определение:
1471 icurvature = - ichr2 - ichr2 ichr2 + ichr2
1472 i j k i k,j %1 j i k i j,k
1478 @opencatbox{Категории:}
1479 @category{Пакет itensor}
1484 @deffn {Функция} covdiff (@var{expr}, @var{v_1}, @var{v_2}, ...)
1485 Вычисляет ковариантную производную от @var{expr} по переменным
1486 @var{v_i} используя символы Кристоффеля
1487 2-го рода (@code{ichr2}). Для получения явных выражений ковариантной
1488 производной через компоненты метрики необходимо использовать
1489 @code{ev(@var{expr},ichr2)}, определив предварительно метрический тензор.
1493 (%i1) load(itensor);
1494 (%o1) /share/tensor/itensor.lisp
1495 (%i2) entertensor()$
1496 Enter tensor name: a;
1497 Enter a list of the covariant indices: [i,j];
1498 Enter a list of the contravariant indices: [k];
1499 Enter a list of the derivative indices: [];
1503 (%i3) ishow(covdiff(%,s))$
1505 (%t3) - a ichr2 - a ichr2 + a
1506 i %1 j s %1 j i s i j,s
1514 (%i5) ishow(ev(%t3,ichr2))$
1518 i %1 s %4,j j s,%4 j %4,s
1519 (%t5) - ------------------------------------------
1523 %1 j s %3,i i s,%3 i %3,s
1524 - ------------------------------------------
1528 i j s %2,%1 %1 s,%2 %1 %2,s k
1529 + ------------------------------------------- + a
1534 @opencatbox{Категории:}
1535 @category{Пакет itensor}
1540 @deffn {Функция} lorentz_gauge (@var{expr})
1541 Налагает условие Лоренцевой калибровки на все индексные объекты в @var{expr},
1542 приравнивая к нулю те, в которых индекс производной совпадает с
1543 одним из контравариантных индексов.
1545 @opencatbox{Категории:}
1546 @category{Пакет itensor}
1551 @deffn {Функция} igeodesic_coords (@var{expr}, @var{name})
1553 Позволяет пользователю обнулить не дифференцированные символы
1554 Кристоффеля и первые производные метрического тензора в @var{expr} (подразумевая
1555 "нормальные" координаты). Переменная @var{name} в
1556 функции @code{igeodesic_coords} может относится, или к имени метрики (если таковая
1557 присутствует в явном виде в @var{expr}), или к имени связности
1558 в качестве которых используются фиксированные имена @code{ichr1} и (или)
1559 @code{ichr2}. В следующем примере, при помощи
1560 @code{igeodesic_coords}), проверяется свойство цикличности
1565 (%i1) load(itensor);
1566 (%o1) /share/tensor/itensor.lisp
1567 (%i2) ishow(icurvature([r,s,t],[u]))$
1569 (%t2) - ichr2 - ichr2 ichr2 + ichr2
1570 r t,s %1 s r t r s,t
1575 (%i3) ishow(igeodesic_coords(%,ichr2))$
1579 (%i4) ishow(igeodesic_coords(icurvature([r,s,t],[u]),ichr2)+
1580 igeodesic_coords(icurvature([s,t,r],[u]),ichr2)+
1581 igeodesic_coords(icurvature([t,r,s],[u]),ichr2))$
1583 (%t4) - ichr2 + ichr2 + ichr2 - ichr2
1584 t s,r t r,s s t,r s r,t
1594 @opencatbox{Категории:}
1595 @category{Пакет itensor}
1599 @subsection Вычисления в подвижном базисе
1601 В Maxima существует возможность проводить вычисления с использованием
1602 подвижных базисов в качестве которых можно выбирать, либо
1603 ортонормированный базис типа тетрады либо произвольный базис.
1605 Для использования подвижного базиса переменной @code{iframe_flag}
1606 необходимо присвоить значение @code{true}. В этом случае символы
1607 Кристоффеля @code{ichr1} и @code{ichr2} заменяются более общими
1608 коэффициентами связности @code{icc1} и @code{icc2} соответственно.
1609 Выражения для @code{covdiff} и @code{icurvature} также заменяются более
1612 Базис определяется двумя тензорами: полем дуального базиса (@code{ifri}),
1613 и метрическим тензором @code{ifg}. Для ортонормированного базиса
1614 метрический тензор совпадает с единичной матрицей или Лоренцевой
1615 метрикой для пространства-времени Минковского. Дуальный базис
1616 определяется базисом векторов (единичных). Явный вид дуального базиса и
1617 его метрики не обязателен. По умолчанию все
1618 вычисления проводятся в общем виде без использования явных выражений для
1619 @code{ifri} и @code{ifg}.
1621 При @code{iframe_flag} равном @code{true}, во многих случаях для
1622 опускания и подъема индексов вместо стандартной метрики @code{imetric}
1623 используется метрика тетрады @code{ifg}.
1625 ВАЖНО: Присвоение @code{iframe_flag} значения @code{true} не отменяет
1626 свойства свертки обычной метрики, определенные ранее командами
1627 @code{defcon} или @code{imetric}. Если используется тетрадный
1628 формализм, то определение стандартной метрики лучше всего ввести с
1629 помощью присвоения соответствующего имени переменной
1630 @code{imetric}. Команду @code{imetric} лучше НЕ использовать.
1632 Maxima использует поле дуального базиса (@code{ifri})
1633 и метрический тензор @code{ifg} для определения структурных коэффициентов базиса (@code{ifc1}
1634 и @code{ifc2}), которые в дальнейшем используются для вычисления
1635 коэффициентов связности (@code{icc1}
1636 и @code{icc2}), как показано в следующем примере:
1640 (%i1) load(itensor);
1641 (%o1) /share/tensor/itensor.lisp
1642 (%i2) iframe_flag:true;
1644 (%i3) ishow(covdiff(v([],[i]),j))$
1648 (%i4) ishow(ev(%,icc2))$
1650 (%t4) v (ifc2 + ichr2 ) + v
1652 (%i5) ishow(ev(%,ifc2))$
1654 v ifg (ifb - ifb + ifb )
1655 j %2 %1 %2 %1 j %1 j %2 i
1656 (%t5) -------------------------------------------------- + v
1658 (%i6) ishow(ifb([a,b,c]))$
1660 (%t6) ifr ifr (ifri - ifri )
1665 Когда переменной @code{iframe_bracket_form} присвоено
1666 @code{false}, то используется альтернативный метод для вычисления
1667 коммутатора тетрады (@code{ifb}).
1671 (%i8) block([iframe_bracket_form:false],ishow(ifb([a,b,c])))$
1673 (%t8) (ifr ifr - ifr ifr ) ifri
1679 @deffn {Функция} iframes ()
1681 Поскольку в данной версии Maxima свойства свертки для @code{ifr} и
1682 @code{ifri}, а также (@code{ifb}) определены всегда, то
1683 данная функция не выполняет никаких действий.
1685 @opencatbox{Категории:}
1686 @category{Пакет itensor}
1691 @defvr {Переменная} ifb
1693 Скобка тетрады (коммутатор). Вклад метрического тензора тетрады в
1694 коэффициенты связности выражается через коммутатор тетрады.
1700 ifc1 = --------------------------------
1705 Сам по себе коммутатор вычисляется через компоненты тетрады и
1706 метрический тензор тетрады. В зависимости от значения
1707 @code{frame_bracket_form} вычисление скобки тетрады дает разный
1708 результат. При @code{frame_bracket_form} равном @code{true}
1714 ifb = ifr ifr (ifri - ifri - ifri itr )
1715 abc b c a d,e a e,d a f d e
1720 А при @code{itorsion_flag} равном @code{true}:
1724 ifb = (ifr ifr - ifr ifr ) ifri
1729 @opencatbox{Категории:}
1730 @category{Пакет itensor}
1735 @defvr {Переменная} icc1
1737 Коэффициенты связности первого рода. В @code{itensor}, определяется как:
1741 icc1 = ichr1 - ikt1 - inmc1
1746 В этом выражении, если @code{iframe_flag} равно @code{true}, символы Кристоффеля
1747 @code{ichr1} заменяются коэффициентами связности тетрады @code{ifc1}.
1748 Если @code{itorsion_flag} равно @code{false}, то @code{ikt1}
1749 опускается. @code{ikt1} опускается и в случае если используется базис
1750 тетрады, так как кручение уже вычислено, как часть скобки тетрады.
1751 Наконец, если @code{inonmet_flag} равен @code{false}, то
1752 @code{inmc1}, также опускается при вычислениях.
1754 @opencatbox{Категории:}
1755 @category{Пакет itensor}
1760 @defvr {Переменная} icc2
1762 Коэффициенты связности второго рода. В @code{itensor}, определяются как,
1767 icc2 = ichr2 - ikt2 - inmc2
1772 В этом выражении, если @code{iframe_flag} равно @code{true}, символы Кристоффеля
1773 @code{ichr2} заменяются коэффициентами связности тетрады @code{ifc2}.
1774 Если @code{itorsion_flag} равно @code{false}, то @code{ikt2}
1775 опускается. @code{ikt2} опускается и в случае, если используется базис
1776 тетрады, так как кручение уже вычислено, как часть скобки тетрады.
1777 Наконец, если @code{inonmet_flag} равен @code{false}, то
1778 @code{inmc2}, также опускается при вычислениях.
1780 @opencatbox{Категории:}
1781 @category{Пакет itensor}
1786 @defvr {Переменная} ifc1
1788 Структурные коэффициенты 1-го рода, известные, также, как коэффициенты
1789 вращения Риччи. Этот тензор выражает вклад метрики тетрады в
1790 коэффициенты связности 1-го рода. Определяется как:
1796 ifc1 = --------------------------------
1802 @opencatbox{Категории:}
1803 @category{Пакет itensor}
1808 @defvr {Переменная} ifc2
1810 Структурные коэффициенты 2-го рода. Получаются сверткой структурных
1811 коэффициентов 1-го рода и метрики тетрады:
1821 @opencatbox{Категории:}
1822 @category{Пакет itensor}
1827 @defvr {Переменная} ifr
1829 Базис тетрады. Произведение с дуальным базисом (@code{ifri}) дает
1832 @opencatbox{Категории:}
1833 @category{Пакет itensor}
1838 @defvr {Переменная} ifri
1840 Дуальный базис тетрады. Определяется набором векторов.
1841 Вместе с тензором тетрадной метрики @code{ifg} образует основу тетрадного
1842 формализма реализованного в @code{itensor}.
1844 @opencatbox{Категории:}
1845 @category{Пакет itensor}
1850 @defvr {Переменная} ifg
1852 Тензор тетрадной метрики. По умолчанию равен @code{kdelta}. Пользователь может
1853 определить свой, используя @code{components}.
1855 @opencatbox{Категории:}
1856 @category{Пакет itensor}
1861 @defvr {Переменная} ifgi
1863 Обратная тетрадная метрика. Свертка с @code{ifg} дает @code{kdelta}.
1865 @opencatbox{Категории:}
1866 @category{Пакет itensor}
1871 @defvr {Управляющая переменная} iframe_bracket_form
1872 Значение по умолчанию: @code{true}
1874 Определяет метод вычисления скобки тетрады @code{ifb}.
1876 @opencatbox{Категории:}
1877 @category{Пакет itensor}
1881 @subsection Кручение и неметричность
1883 Maxima умеет учитывать кручение и неметричность. Вклад кручения в
1884 коэффициенты связности вычисляется, если @code{itorsion_flag} равен
1885 @code{true}. Аналогично, компоненты неметричности будут учтены, если
1886 @code{inonmet_flag} равен @code{true}.
1889 @defvr {Переменная} inm
1891 Вектор неметричности. Конформная неметричность определяется через
1892 ковариантную производную метрического тензора, которая в обычном случае
1893 равна нулю. Если @code{inonmet_flag} равен @code{true}, то вычисление
1894 ковариантной производной метрики дает:
1903 @opencatbox{Категории:}
1904 @category{Пакет itensor}
1909 @defvr {Переменная} inmc1
1911 Ковариантная перестановка компонент вектора неметричности. Определяется путем:
1915 g inm - inm g - g inm
1917 inmc1 = ------------------------------
1922 В тетрадном формализме вместо @code{g} используется @code{ifg}.
1924 @opencatbox{Категории:}
1925 @category{Пакет itensor}
1930 @defvr {Переменная} inmc2
1932 Контравариантная перестановка компонент вектора
1933 неметричности. Применяется когда @code{inonmet_flag} равен @code{true}.
1940 -inm kdelta - kdelta inm + g inm g
1942 inmc2 = -------------------------------------------
1947 В тетрадном формализме вместо @code{g} используется @code{ifg}.
1949 @opencatbox{Категории:}
1950 @category{Пакет itensor}
1955 @defvr {Переменная} ikt1
1957 Ковариантная перестановка тензора кручения.
1958 Вычисляется посредством:
1963 -g itr - g itr - itr g
1965 ikt1 = ----------------------------------
1970 В тетрадном формализме вместо @code{g} используется @code{ifg}.
1972 @opencatbox{Категории:}
1973 @category{Пакет itensor}
1978 @defvr {Переменная} ikt2
1980 Контравариантная перестановка тензора кручения.
1981 Вычисляется посредством:
1991 В тетрадном формализме вместо @code{g} используется @code{ifg}.
1993 @opencatbox{Категории:}
1994 @category{Пакет itensor}
1999 @defvr {Переменная} itr
2001 Тензор кручения. Для метрики с кручением индексы ковариантной
2002 производной не коммутируют. Пример:
2006 (%i1) load(itensor);
2007 (%o1) /share/tensor/itensor.lisp
2010 (%i3) covdiff( covdiff( f( [], []), i), j)
2011 - covdiff( covdiff( f( [], []), j), i)$
2014 (%t4) f ichr2 - f ichr2
2018 (%i6) itorsion_flag:true;
2020 (%i7) covdiff( covdiff( f( [], []), i), j)
2021 - covdiff( covdiff( f( [], []), j), i)$
2024 (%t8) f icc2 - f icc2 - f + f
2025 ,%8 j i ,%6 i j ,j i ,i j
2026 (%i9) ishow(canform(%))$
2028 (%t9) f icc2 - f icc2
2030 (%i10) ishow(canform(ev(%,icc2)))$
2032 (%t10) f ikt2 - f ikt2
2034 (%i11) ishow(canform(ev(%,ikt2)))$
2036 (%t11) f g ikt1 - f g ikt1
2037 ,%2 i j %1 ,%2 j i %1
2038 (%i12) ishow(factor(canform(rename(expand(ev(%,ikt1))))))$
2042 (%t12) ------------------------------------
2044 (%i13) decsym(itr,2,1,[anti(all)],[]);
2046 (%i14) defcon(g,g,kdelta);
2048 (%i15) subst(g,nounify(g),%th(3))$
2049 (%i16) ishow(canform(contract(%)))$
2056 @opencatbox{Категории:}
2057 @category{Пакет itensor}
2061 @subsection Внешняя алгебра
2063 В @code{itensor} реализованы возможности для операций с полностью
2064 антисимметричными ковариантными тензорными объектами (внешние формы).
2065 Полностью антисимметричное тензорное поле ранга
2066 (0,L) соответствует внешней (дифференциальной) L-форме. Грассманова
2067 алгебра L-форм включает операции внешнего (косого) произведения.
2069 Операция внешнего произведения не имеет общепринятого определения.
2070 Некоторые авторы определяют внешнее произведение способом, который
2071 соответствует операции антисимметризации. Например,
2076 a /\ a = -----------
2080 В более общем случае, внешнее произведение p-формы и q-формы можно
2085 A /\ B = ------ D A B
2086 i1..ip j1..jq (p+q)! i1..ip j1..jq k1..kp l1..lq
2089 где @code{D} обозначает дельта-символ Кронекера.
2091 Другие авторы предпочитают "геометрическое" определение,
2092 соответствующее понятию элемента объема:
2099 В более общем случае имеем:
2103 A /\ B = ----- D A B
2104 i1..ip j1..jq p! q! i1..ip j1..jq k1..kp l1..lq
2107 С алгебраической точки зрения первое определение выглядит
2108 более естественным для @code{itensor}. С другой стороны, во многих приложения
2109 более принято следовать "геометрическому" определению. У пользователя
2110 есть выбор -- какое из двух определений использовать. При
2111 @code{igeowedge_flag} равном @code{false} (по умолчанию), используется
2112 антисимметризация. В противном случае применяется "геометрическое" определение.
2117 @fnindex Внешнее произведение
2120 Обозначает операцию внешнего произведения. Это бинарная операция.
2121 В качестве аргументов можно использовать выражения, включающие
2122 скаляры, ковариантные тензоры 1-го ранга или антисимметричные
2123 ковариантные тензоры ранга @code{l} (предварительно объявленные, как
2124 антисимметричные по всем ковариантным индексам).
2126 Результат внешнего произведения контролируется флагом
2127 @code{igeowedge_flag}. Например:
2130 (%i1) load(itensor);
2131 (%o1) /share/tensor/itensor.lisp
2132 (%i2) ishow(a([i])~b([j]))$
2137 (%i3) decsym(a,2,0,[anti(all)],[]);
2139 (%i4) ishow(a([i,j])~b([k]))$
2142 (%t4) ---------------------------
2144 (%i5) igeowedge_flag:true;
2146 (%i6) ishow(a([i])~b([j]))$
2149 (%i7) ishow(a([i,j])~b([k]))$
2150 (%t7) a b + b a - a b
2154 @opencatbox{Категории:}
2155 @category{Пакет itensor}
2156 @category{Операторы}
2163 @fnindex Свертка с вектором
2166 Бинарная операция, обозначающая "внутреннее" произведение -- свертку с
2167 контравариантным вектором. При этой операции
2168 результат не зависит от векторных индексов, участвующих в
2169 свертке. Поэтому вектор можно задать только именем.
2171 В пакете @code{itensor}, "внутренняя" свертка с вектором всегда выполняется по
2172 первому (в отношении алфавитного порядка) индексу. Это позволяет
2173 проводить более эффективные упрощения выражений, включающих
2174 "внутренние" свертки. Например:
2177 (%i1) load(itensor);
2178 (%o1) /share/tensor/itensor.lisp
2179 (%i2) decsym(a,2,0,[anti(all)],[]);
2181 (%i3) ishow(a([i,j],[])|v)$
2185 (%i4) ishow(a([j,i],[])|v)$
2191 Заметим, что "внутренняя" свертка определена только для полностью
2192 антисимметричных объектов. В противном случае результат вычисления будет неправильным.
2194 @opencatbox{Категории:}
2195 @category{Пакет itensor}
2196 @category{Операторы}
2200 @deffn {Функция} extdiff (@var{expr}, @var{ind})
2202 Внешнее дифференцирование @var{expr} по индексу @var{ind}.
2203 В @code{itensor} оператор внешней производной определен как внешнее
2204 произведение оператора производной и формы. Таким образом, результат
2205 вычисления, также зависит от значения флага @code{igeowedge_flag}.
2209 (%i1) load(itensor);
2210 (%o1) /share/tensor/itensor.lisp
2211 (%i2) ishow(extdiff(v([i]),j))$
2216 (%i3) decsym(a,2,0,[anti(all)],[]);
2218 (%i4) ishow(extdiff(a([i,j]),k))$
2221 (%t4) ------------------------
2223 (%i5) igeowedge_flag:true;
2225 (%i6) ishow(extdiff(v([i]),j))$
2228 (%i7) ishow(extdiff(a([i,j]),k))$
2233 @opencatbox{Категории:}
2234 @category{Пакет itensor}
2239 @deffn {Функция} hodge (@var{expr})
2241 Вычисляет форму дуальную @var{expr}. Например:
2245 (%i1) load(itensor);
2246 (%o1) /share/tensor/itensor.lisp
2253 (%i5) decsym(A,3,0,[anti(all)],[])$
2255 (%i6) ishow(A([i,j,k],[]))$
2258 (%i7) ishow(canform(hodge(%)))$
2262 (%t7) -----------------------------------------
2264 (%i8) ishow(canform(hodge(%)))$
2265 %1 %2 %3 %8 %4 %5 %6 %7
2266 (%t8) levi_civita levi_civita g
2269 %2 %107 %3 %108 %4 %8 %5 %6 %7
2274 (%i11) ishow(canform(contract(expand(%))))$
2280 @opencatbox{Категории:}
2281 @category{Пакет itensor}
2286 @defvr {Переменная} igeowedge_flag
2287 Значение по умолчанию: @code{false}
2289 Контролирует результат вычисления внешнего произведения или внешней
2290 производной. При @code{igeowedge_flag} равном @code{false} (по
2291 умолчанию), понятие внешней (дифференциальной) формы соответствует
2292 полностью антисимметричному ковариантному тензорному полю.
2293 В противном случае внешняя форма будет согласована с понятием элемента объема.
2295 @opencatbox{Категории:}
2296 @category{Пакет itensor}
2301 @subsection Экспорт в TeX
2303 В @code{itensor} имеется некоторая поддержка экспорта тензорных выражений в
2304 формат TeX. Поскольку на базовом уровне Maxima тензорные выражения
2305 представлены как вызов некоторых функций, то вызов команды,
2306 @code{tex()} не даст желаемого результата. Для экспорта тензорных
2307 выражений в TeX можно использовать команду @code{tentex}.
2309 @deffn {Функция} tentex (@var{expr})
2311 Команда экспорта тензорных
2312 выражений в TeX. Перед использованием необходимо загрузить необходимый
2313 подпакет, @code{load(tentex)}. Например:
2317 (%i1) load(itensor);
2318 (%o1) /share/tensor/itensor.lisp
2320 (%o2) /share/tensor/tentex.lisp
2323 (%i4) ishow(icurvature([j,k,l],[i]))$
2325 (%t4) ichr2 ichr2 - ichr2 ichr2 - ichr2
2326 j k m1 l j l m1 k j l,k
2332 $$\Gamma_@{j\,k@}^@{m_1@}\,\Gamma_@{l\,m_1@}^@{i@}-\Gamma_@{j\,l@}^@{m_1@}\,
2333 \Gamma_@{k\,m_1@}^@{i@}-\Gamma_@{j\,l,k@}^@{i@}+\Gamma_@{j\,k,l@}^@{i@}$$
2337 Заметим, что данном примере @code{idummyx} равен @code{m}, для того
2338 чтобы избежать символов % в TeX-овских выражениях.
2340 ЗАМЕЧАНИЕ: Текущая версия @code{tentex} является экспериментальной.
2342 @opencatbox{Категории:}
2343 @category{Пакет itensor}
2344 @category{Вывод в формате TeX}
2348 @subsection Взаимодействие с пакетом @code{ctensor}
2350 В пакет @code{itensor} заложены возможности для генерации кода Maxima
2351 для компонент тензорных выражений для последующего использования в
2352 @code{ctensor}. Эта задача выполняется вызовом команды @code{ic_convert()}.
2355 @deffn {Функция} ic_convert (@var{eqn})
2357 Конвертирует тензорное выражение @var{eqn} из формата @code{itensor} в
2358 компоненты для использования в @code{ctensor}. При этом суммирование по немым
2359 индексам выполняется в явном виде, используя соответствующие замены
2360 индексных объектов в массивы; индексы производной заменяются
2361 не вычисляемую форму @code{diff}; символы Кристоффеля @code{ichr1} и @code{ichr2}
2362 заменяются на @code{lcs} и @code{mcs}, соответственно и если флаг
2363 @code{metricconvert} равен @code{true}, тогда ковариантные
2364 (контравариантные) выражения для метрического тензора везде
2365 заменяется на @code{lg} (или @code{ug}). Кроме того, для суммирования по
2366 всем немым индексам вводится @code{do}. Полученное выражение можно
2367 вычислить (загрузив предварительно пакет @code{ctensor}), используя
2371 (%i1) load(itensor);
2372 (%o1) /share/tensor/itensor.lisp
2373 (%i2) eqn:ishow(t([i,j],[k])=f([],[])*g([l,m],[])*a([],[m],j)
2378 (%i3) ic_convert(eqn);
2379 (%o3) for i thru dim do (for j thru dim do (
2381 t : f sum(sum(diff(a , ct_coords ) b
2384 g , l, 1, dim), m, 1, dim)))
2388 (%i5) metricconvert:true;
2390 (%i6) ic_convert(eqn);
2391 (%o6) for i thru dim do (for j thru dim do (
2393 t : f sum(sum(diff(a , ct_coords ) b
2396 lg , l, 1, dim), m, 1, dim)))
2400 @opencatbox{Категории:}
2401 @category{Пакет itensor}
2402 @category{Пакет ctensor}
2406 @subsection Зарезервированные имена переменных
2408 Следующие имена переменных зарезервированы для использования
2409 в пакете @code{itensor}. Следует избегать их переопределения.
2414 ------------------------------------------
2415 indices2() Внутренняя версия indices()
2416 conti Список контравариантных индексов
2417 covi Список ковариантных индексов
2418 deri Список индексов производной
2419 name Возвращает имя индексного объекта
2429 @subsection Замечания разработчика
2431 Я (Viktor Toth) добавил поддержку тетрадного формализма,
2432 кручения и неметричности в @code{itensor}
2433 в ноябре, 2004. Эти возможности были реконструированы на основе описаний
2434 данных в руководстве коммерческой версии Macsyma, а также с
2435 использованием результатов исполнения демонстрационных файлов Macsyma.
2437 Данная функциональность должна рассматриваться как
2438 экспериментальная. Следует учесть, что доступная документация Macsyma содержала
2439 несколько очевидных ошибок, например, неправильные комбинации
2440 индексов. Кроме того, результаты демонстрационных расчетов
2441 показали, что функциональность тетрадного формализма в Macsyma
2442 далеко не полна. Моей цель состоит не в том, чтобы механически воспроизвести все
2443 возможности Macsyma, включая ошибки, а в том, чтобы в итоге получить
2444 математически корректную поддержку данных видов вычислений в @code{itensor}.
2445 Выполнение этой задачи займет некоторое время.