Опубликован: 27.12.2010 | Доступ: свободный | Студентов: 813 / 130 | Оценка: 5.00 / 5.00 | Длительность: 18:38:00
ISBN: 978-5-9556-0117-5
Специальности: Математик
Лекция 8:

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

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Отметим, что сама команда замены координат имеет вид

changeBas[<номер исходного базиса>,<номер целевого базиса>]

После ее успешного выполнения значения компонент тензоров возвращаются в целевом базисе. Если же выполнить замену не удалось, что бывает, если матрицы (функции) перехода не заданы и не могут быть вычислены внутри программы, то выдается сообщение, предлагающее задать необходимые матрицы (функции).

Дифференциальные формы: их разложение по базису, внешнее умножение и дифференцирование. В настоящий момент в пакете реализован ряд возможностей для работы с дифференциальными формами. Как уже упоминалось выше, можно задать кососимметрический тензор или тензорное поле типа (0,q) с помощью команд makeSkew, makeSkewTab или makeSkewField:

In[118] := resetTensors ;
\\
           makeBasisDif[x, 5] ; 
\\
           makeSkew[\xi , 3 ] ; 
\\
           makeSkew[\zeta , 2 ] ;

Дифференциальную форму можно разложить по базису. Дифференциальные формы также можно перемножить внешним образом (как описанные выше кососимметрические тензоры):

In[121] := toBasisSkew[\xi ]
\\
           toBasisSkew[\xi  ^ \zeta ]
Out[121]=\begin{matrix}\\\xi\\123\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}3\\dx\\\end{matrix}+\begin{matrix}\\\xi\\124\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}4\\dx\\\end{matrix}+\begin{matrix}\\\xi\\125\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\\

\qquad \qquad \begin{matrix}\\\xi\\134\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}4\\dx\\\end{matrix}+\begin{matrix}\\\xi\\135\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\begin{matrix}\\\xi\\145\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}4\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\\

\qquad\qquad \begin{matrix}\\\xi\\234\end{matrix}\begin{matrix}2\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}4\\dx\\\end{matrix}+\begin{matrix}\\\xi\\235\end{matrix}\begin{matrix}2\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\begin{matrix}\\\xi\\245\end{matrix}\begin{matrix}2\\dx\\\end{matrix}\wedge\begin{matrix}4\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\begin{matrix}\\\xi\\345\end{matrix}\begin{matrix}3\\dx\\\end{matrix}\wedge\begin{matrix}4\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}\\
Out[122]=\\
\left(\begin{matrix}&\\\zeta&\xi\\45&123\end{matrix}-\begin{matrix}&\\\zeta&\xi\\35&124\end{matrix}+\begin{matrix}&\\\zeta&\xi\\34&125\end{matrix}+\begin{matrix}&\\\zeta&\xi\\25&134\end{matrix}-\begin{matrix}&\\\zeta&\xi\\24&135\end{matrix}+\begin{matrix}&\\\zeta&\xi\\23&145\end{matrix}-\begin{matrix}&\\\zeta&\xi\\15&234\end{matrix}+\begin{matrix}&\\\zeta&\xi\\14&235\end{matrix}-\begin{matrix}&\\\zeta&\xi\\13&245\end{matrix}+\begin{matrix}&\\\zeta&\xi\\12&345\end{matrix}\right)\\

\qquad \begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}4\\dx\\\end{matrix}\wedge\begin{matrix}5\\dx\\\end{matrix}

Можно задать форму с коэффициентами-функциями:

In[123] := resetTensors ;
\\
           makeBasisDif[x, 3] ; 
\\
           makeSkewField[\omega , 1 ] ; 
\\
           toBasisSkew[\omega ]
Out[126]=\begin{matrix}1\\dx\\\end{matrix}\begin{matrix}\\\omega\\1\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\\&&\end{matrix}\right]+\begin{matrix}2\\dx\\\end{matrix}\begin{matrix}\\\omega\\2\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\\&&\end{matrix}\right]+\begin{matrix}3\\dx\\\end{matrix}\begin{matrix}\\\omega\\3\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\\&&\end{matrix}\right]

От такой формы можно взять внешний дифференциал, который, как и положено, будет дифференциальной формой:

In[127] := toBasisSkew [d [\omega ] ]
Out[127]=\begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}3\\dx\\\end{matrix}
\left(\begin{matrix}\\-\omega ^{(0,0,0)}\\2\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]+\begin{matrix}\\\omega ^{(0,1,0)}\\3\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]\right)+

\qquad \begin{matrix}1\\dx\\\end{matrix}\wedge \begin{matrix}2\\dx\\\end{matrix}
\left(\begin{matrix}\\-\omega ^{(0,1,0)}\\1\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]+\begin{matrix}\\\omega ^{(1,0,0)}\\2\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]\right)+\\

\qquad \begin{matrix}1\\dx\\\end{matrix}\wedge \begin{matrix}3\\dx\\\end{matrix}
\left(\begin{matrix}\\-\omega ^{(0,0,1)}\\1\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]+\begin{matrix}\\\omega ^{(1,0,0)}\\3\end{matrix}\left[\begin{matrix}1&2&3\\x,&x,&x\end{matrix}\right]\right)

Можно задать форму непосредственно, как вот такую форму P:

In[128]:=makeDasisDif[x,5];\\
\begin{matrix}
&&&&P=Cos\left[\begin{matrix}1\\x\\\end{matrix}\right]\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}2\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}+Sin\left[\begin{matrix}3\\x\\\end{matrix}\right]\begin{matrix}2\\dx\\\end{matrix}\wedge\begin{matrix}4\\dx\\\end{matrix}+\begin{matrix}4\\x\\\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge \begin{matrix}2\\dx\\\end{matrix}\wedge \begin{matrix}5\\dx\\\end{matrix}+\begin{matrix}5^2\\x\\\end{matrix}\begin{matrix}1\\dx\\\end{matrix}\wedge\begin{matrix}3\\dx\\\end{matrix}\wedge \begin{matrix}4\\dx\\\end{matrix} \end{matrix};

От нее тоже можно взять внешний дифференциал:

In[130]:=d[P]
Out[130]=Cos\left[\begin{matrix}3\\x\\\end{matrix}\right]\begin{matrix}1\\dx\\\end{matrix} \wedge \begin{matrix}2\\dx\\\end{matrix} \wedge \begin{matrix}3\\dx\\\end{matrix} \wedge \begin{matrix}4\\dx\\\end{matrix}+\begin{matrix}1\\dx\\\end{matrix} \wedge \begin{matrix}2\\dx\\\end{matrix} \wedge \begin{matrix}4\\dx\\\end{matrix} \wedge \begin{matrix}5\\dx\\\end{matrix}-2 \begin{matrix}5\\x\\\end{matrix}\begin{matrix}1\\dx\\\end{matrix} \wedge \begin{matrix}3\\dx\\\end{matrix}\wedge\begin{matrix}4\\dx\\\end{matrix}\wedge\begin{matrix}5\\dx\\\end{matrix}

однако ни P, ни d[P], в этом случае не являются тензорами:

In[131] := tensor [P] 
           skew[P]
           tensor[d[P] ] 
           tensorBas[P] 
           skewBas[P] 
           tensorBas[d[P]] 
           skewBas[d[P]]
Out[131] = False
Out[132] = False
Out[133] = False
Out[134l = True
Out[135] = True
Out[136] = True
Out[137] = True

Превратить их в тензорное поле можно так:

In[138]:=makeSkewTab[dP, toListSkew [d[P] ] ] 
         tensor[dP] 
            dP
         {1,2,3,4}
Out[139] = True
Out[140]=Cos\left[\begin{matrix}3\\x\\\end{matrix}\right]

Риманова метрика, риманова и аффинная связности. В пакете предусмотрена возможность объявить рассматриваемое многообразие (в текущей версии, напомним, многообразие состоит из одной карты) римановым. При этом задается или

  • абстрактная метрика g и обратный тензор ig (команда makeRiemann ), или
  • метрика с конкретной матрицей (команда makeRiemannTab[<матрица>] ).

В обоих случаях для метрики и обратного тензора зарезервированы символы g и ig :

In[141] := resetTensors ;
           makeBasisDif[{х, у}]; 
           makeRiemann;

       Пакет Tensors перезапущен. Результаты вычислений аннулированы.

            Созданы метрические тензоры д типа (0,2) и ig типа (2,0)

In[144] :=Row [ {val [g] //MatrixForm, val[ig] //MatrixForm} , 
          Spacer[10]]
Out[144]=\begin{pmatrix}
g&g\\
11&12\\
g&g\\
12&22
\end{pmatrix}\begin{pmatrix}
11&12\\
ig&ig\\
12&22\\
ig&ig
\end{pmatrix}

Отметим, что оба построенных тензора по определению симметричны. Аналогично:

In[145] := resetTensors ;
           makeBasisDif[{х, у}] ;
\begin{matrix}
&&&makeRiemannTab \left[ \begin{pmatrix}1&0\\0&1\end{pmatrix}\right];
\end{matrix}
val[g] //MatrixForm

     Пакет Tensors перезапущен. Результаты вычислений аннулированы.

            Создан метрический тензор g типа
                 (0,2) и обратный к нему тензор ig типа (2,0)
Out[148]=\begin{pmatrix}1&0\\
0&1
\end{pmatrix}

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

In[149]:=makeBasisDif [\{ r, \varphi \}  , \{ r Cos[\varphi ], r Sin[\varphi ]\} ]; 
\\
         val[g] //MatrixForm
Out[150]=\begin{pmatrix}
1&0\\
0&r^2
\end{pmatrix}

Если задана метрика, то можно вычислить символы Кристоффеля соответствующей симметричной римановой связности, что делается с помощью команды makeCrRiemann . Для символов Кристоффеля зарезервирована буква ? (большая греческая буква гамма, Esc G Esc ). При этом с символами Кристоффеля во многом можно обращатьсякак с тензорами типа (1,2), а именно, можно посмотреть конкретную компоненту, можно вычислять их значение в текущих координатах с помощью все той же функции val :

In[151] := resetTensors ;
           makeBasisDif[{х, у, z}];
\begin{matrix}
&&&makeRiemannTab \left[ \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}\right];
\end{pmatrix}
makeCrRiemann 
            val[Г]

   Пакет Tensors перезапущен. Результаты вычислений аннулированы.

         Создан метрический тензор g типа
                 (0,2) и обратный к нему тензор ig типа (2,0)

Out[155]={{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, 
          {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, 
          {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}}

Мы вычислили символы Кристоффеля евклидовой связности, которые, разумеется, равны нулю. Пересчитаем их теперь, скажем, в цилиндрических координатах:

In[156] := makeBasisDif [ \{ r, \varphi , z\} , \{ r Cos[\varphi ], r Sin[\varphi ] , z\} ]; 
\\
           val[Г]
\\

\\
Out[157]=\{ \{ \{ 0, 0, 0\} , \{ 0, -r, 0\} , \{ 0, 0, 0\} \} ,
\\
          \{ \{ 0, 1/r, 0\} , \{ 1/r, 0, 0\} , \{ 0, 0, 0\} \} ,
\\
          \{ \{ 0, 0, 0\} , \{ 0, 0, 0\} , \{ 0, 0, 0\} \} \}

Или вот конкретная компонента:

In[158]:=\begin{matrix}\{1\}\\Г\\\{2,2\}\end{matrix}\\
Out[158] = - r

Кроме того, предусмотрена возможность задавать абстрактную аффинную связность. При этом соответствующие функции

makeCrAffine[]

и

makeCrAffineTab[<таблица значений>>]

можно использовать как без явного указания имени связности (в этом случае ей присваивается имя Г), так и с указанием этого имени в виде последнего аргумента:

In[159] =makeCrAf f ine [ ] ; 
         val[r]
Out[160]=\left\{\left\{\left\{\begin{matrix}1&1&1\\Г,&Г,&Г\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}1&1&1\\Г,&Г,&Г\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}1&1&1\\Г,&Г,&Г\\ 31&32&33\end{matrix}\right\}\right\},\\
\left\{\left\{\begin{matrix}2&2&2\\Г,&Г,&Г\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}2&2&2\\Г,&Г,&Г\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}2&2&2\\Г,&Г,&Г\\ 31&32&33\end{matrix}\right\}\right\},\\
\left\{\left\{\begin{matrix}3&3&3\\Г,&Г,&Г\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}3&3&3\\Г,&Г,&Г\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}3&3&3\\Г,&Г,&Г\\ 31&32&33\end{matrix}\right\}\right\}\right\},
In[161] :=makeCrAf fine [AA] ; 
          val[AA]
Out[162]=\left\{\left\{\left\{\begin{matrix}1&1&1\\АА,&АА,&АА\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}1&1&1\\АА,&АА,&АА\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}1&1&1\\АА,&АА,&АА\\ 31&32&33\end{matrix}\right\}\right\},\\
\left\{\left\{\begin{matrix}2&2&2\\АА,&АА,&АА\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}2&2&2\\АА,&АА,&АА\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}2&2&2\\АА,&АА,&АА\\ 31&32&33\end{matrix}\right\}\right\},\\
\left\{\left\{\begin{matrix}3&3&3\\АА,&АА,&АА\\11&12&13\end{matrix}\right\},\left\{\begin{matrix}3&3&3\\АА,&АА,&АА\\21&22&23\end{matrix}\right\},\left\{\begin{matrix}3&3&3\\АА,&АА,&АА\\ 31&32&33\end{matrix}\right\}\right\}\right\},
In[163]:=makeCrAffineTab[val[AA]];\\
\begin{matrix}
&&&&\begin{matrix}\{1\}\\Г\\\{3,2\}\end{matrix}
\end{matrix}\\
Out[164]=\begin{matrix}1\\AA\\32\end{matrix}\\
In[165]:=makeCrAffineTab[val[AA], BB];\\
\begin{matrix}
&&&&\begin{matrix}\{3\}\\BB\\\{2,1\}\end{matrix}
\end{matrix}\\
Out[166]=\begin{matrix}3\\AA\\21\end{matrix}

Наконец, имеется возможность задавать метрику как тензорное поле. В этом случае компоненты метрики суть абстрактные функции от координат. Аналогичная возможность предусмотрена и для абстрактной аффинной связности. Соответствующие функции - это makeRiemannField , которая создает поля g и ig , makeCrAffineField[], которая создает связность Г , и makeCrAffineField[<имя связности>] , которая создает связность с заданным именем:

In[167] := resetTensors ;
           makeBasisDif[x, 2] ; 
           makeRiemannField; 
           makeCrRiemann;
\begin{matrix}
&&&&\begin{matrix}
                      \{1\}\\
                       Г\\
                    \{1,2\}\end{matrix}
\end{matrix}
Пакет Tensors перезапущен. Результаты вычислений аннулированы.

              Созданы метрические тензорные
                поля д типа (0,2) и ig типа (2,0)
Out[171]=\frac12 \begin{matrix}11\\ig\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\g\\11\end{matrix}^{(0,1)}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]+\frac12\begin{matrix}12\\ig\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\g\\22\end{matrix}^{(1,0)}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\end{matrix}

Как работает пакет (краткое описание основных идей)

В этом разделе мы кратко опишем основные идеи и технические приемы, положенные в основу написания пакета. Сами тексты программ находятся в файле tensors.m. Этот файл тоже можно открыть в Mathematica (откройте). Возникнет специальным образом оформленное окно работы с пакетными файлами. Как и любой пакет, наш начинается оператором BeginPackage["Tensors'", {"Combinatorica'","GraphUtilities'"}], где первый аргумент - это имя пакета, а второй - список используемых пакетов, и заканчивается оператором EndPackage[].

В нашем пакете всего две клетки, первая состоит из команд вида <имя функции>::usage="текст описания.", служащих для описания пользовательских функций. Именно этот текст появляется на экране при выполнении команды ?<имя функции> . Если имеется несколько одноименных функций, то будут выведены все описания. Наконец, по команде ??<имя функции> на экран выводится весь код, задающий функцию:

In[172] := ? makeBasis

In[173] := ?? makeTensor

makeTensor [Т , р Integer, q Integer] : =
\begin{matrix}
&&\left(val[T]=Array\left[\begin{matrix}
StringJoin@@ToString/@\{##1\}[[Range[p] ]]\\
ToString[T]\\
StringJoin@@ToString/@\{##1\}[[Range[p+1, p+q] ]]
\end{matrix} &,
\end{matrix}
ConstantArray[nn[basis[curBas]], p + q] ;
        tensor[T] = True; type[T] = {p, q}; inBasis[T] = curBas; 
        If[TrueQ[symm[T]], (symm[T]) = . ] ; 
        If[TrueQ[skew[T] ] , (skew[T]) =.];
        If[p=0&&q <= l, symm[T] = True; skew[T] = True] ;)

Полный список функций пакета можно увидеть, если кликнуть в кнопку Functions в окне работы с файлом пакета.

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Олег Корсак
Олег Корсак
Латвия, Рига
Александр Дронов
Александр Дронов
Россия, Воронеж, Воронежский государственный технический университет, 1995