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

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

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

Аналогично выглядят команды альтернирования и симметрирования:

In[58]:=val\left[\begin{matrix}\\B\\alt\end{matrix}\right]//MatrixForm\\
Out[58]=\begin{pmatrix}
0&\frac12\left(\begin{matrix}\\B\\12\end{matrix}-\begin{matrix}\\B\\21\end{matrix}\right)&\frac12\left(\begin{matrix}\\B\\13\end{matrix}-\begin{matrix}\\B\\31\end{matrix}\right)\\
\frac12\left(-\begin{matrix}\\B\\12\end{matrix}+\begin{matrix}\\B\\21\end{matrix}\right)&0&\frac12\left(\begin{matrix}\\B\\23\end{matrix}-\begin{matrix}\\B\\32\end{matrix}\right)\\
\frac12\left(-\begin{matrix}\\B\\13\end{matrix}+\begin{matrix}\\B\\31\end{matrix}\right)&\frac12\left(-\begin{matrix}\\B\\23\end{matrix}+\begin{matrix}\\B\\32\end{matrix}\right)&0
\end{pmatrix}\\
In[59]:=val\left[\begin{matrix}\\B\\sym\end{matrix}\right]//MatrixForm\\
Out[59]=\begin{pmatrix}
\begin{matrix}\\B\\11\end{matrix}&\frac12\left(\begin{matrix}\\B\\12\end{matrix}+\begin{matrix}\\B\\21\end{matrix}\right)&\frac13\left(\begin{matrix}\\B\\13\end{matrix}+\begin{matrix}\\B\\31\end{matrix}\right)\\
\frac12\left(\begin{matrix}\\B\\12\end{matrix}+\begin{matrix}\\B\\21\end{matrix}\right)&\begin{matrix}\\B\\22\end{matrix}&\frac12\left(\begin{matrix}\\B\\23\end{matrix}+\begin{matrix}\\B\\32\end{matrix}\right)\\
\frac12\left(\begin{matrix}\\B\\13\end{matrix}+\begin{matrix}\\B\\31\end{matrix}\right)&\frac12\left(\begin{matrix}\\B\\23\end{matrix}+\begin{matrix}\\B\\32\end{matrix}\right)&\begin{matrix}\\B\\33\end{matrix}
\end{pmatrix}

Также часто удобно вывести конкретную компоненту тензора. Это делается с помощью явного указания списков соответствующих индексов:

In[60]:=\begin{matrix}
\{2\}\\
\xi \otimes W \otimes \xi\\
\{1,3\}
\end{matrix}\\
Out[60]=b\begin{matrix}
&\\
\xi&\xi\\
1&3
\end{matrix}

Аналогично, имеется возможность породить сразу симметричный или кососимметричный тензор типа (0,q). Для этого используются команды makeSymm, makeSkew, makeSymmTab, makeSkewTab. Для симметричных и ко сосимметричных тензоров определены операции симметричного произведения \circ ( SmallCircle, Esc sc Esc ) и, соответственно, кососимметричного произведения \wedge ( Wedge, Esc ^ Esc ). Пакет относит к симметричным (кососимметричным) тензорам или тензоры, созданные перечисленными четырьмя операциями, или полученные в результате симметрирования или альтернирования тензоров типа (0,q) :

In[61] := makeSkew [v, 2]; makeSkewTab [ \zeta , \{ a, b, c\} ] 
\\
          val[v] 
\\
          val[\zeta ]
\\
          val[\zeta ^v]
In[62]:=\left\{\left\{\begin{matrix}
&&\\
0,&v,&v\\
&12&13
\end{matrix}\right\}, \left\{\begin{matrix}
&&\\
-v,&0,&v\\
12&&23
\end{matrix}\right\}, \left\{\begin{matrix}
&&\\
-v,&-v,&0\\
13&23&
\end{matrix}\right\}\right \}\\
Out[63]\{a,b,c\}
Out[64]:=\left\{\left\{
\{0,0,0\}, \left\{\begin{matrix}
0,&0,&c\begin{matrix}\\v\\12\end{matrix}-b\begin{matrix}\\v\\13\end{matrix}+a\begin{matrix}\\v\\23\end{matrix}\end{matrix}\right\},\left\{\begin{matrix}
0,&-c\begin{matrix}\\v\\12\end{matrix}+b\begin{matrix}\\v\\13\end{matrix}-a\begin{matrix}\\v\\23\end{matrix},&0\end{matrix}\right\} \right\},\\

\left\{\left\{\begin{matrix}
0,&0,&-c\begin{matrix}\\v\\12\end{matrix}+b\begin{matrix}\\v\\13\end{matrix}-a\begin{matrix}\\v\\23\end{matrix}\end{matrix}\right\}, \{0,0,0\}, \left\{\begin{matrix}
c\begin{matrix}\\v\\12\end{matrix}-b\begin{matrix}\\v\\13\end{matrix}+a\begin{matrix}\\v\\23\end{matrix},&0,&0 \end{matrix}\right\}\right\}\\

\left\{\left\{\begin{matrix}
0,&c\begin{matrix}\\v\\12\end{matrix}-b\begin{matrix}\\v\\13\end{matrix}+a\begin{matrix}\\v\\23\end{matrix},&0\end{matrix}\right\}, \left\{\begin{matrix}
-c\begin{matrix}\\v\\12\end{matrix}+b\begin{matrix}\\v\\13\end{matrix}-a\begin{matrix}\\v\\23\end{matrix},&0,&0\end{matrix}\right\},\{0,0,0\}\} \right\}

Отметим, что при создании (косо)симметричного тензора по таблице значений соответствующая функция не проверяет (косо)симметричность таблицы, а просто использует только часть данных, доопределяя значения по симметрии:

In[65] : = makeSymm[B, 2]; makeSymm[U, 1] 
\\
           val[B] 
\\
           val[U] 
\\
           val[B \deg  u]
Out[66]=\left\{\left\{\begin{matrix}B,&B,&B\\
11&12&12
\end{matrix}\right\},\left\{\begin{matrix}B,&B,&B\\
12&22&23
\end{matrix} \right\},\left\{\begin{matrix}
B,&B,&B\\
13&23&33
\end{matrix} \right\}\right\}\\
out[67]=\left\{\begin{matrix}
U,&U,&U\\
1&2&3
\end{matrix}\right\}\\

Out[68]=\left\{\left\{\begin{matrix}&\\B&U\\11&1\end{matrix}, \frac12\left(\begin{matrix}&&\\2&B&U\\&12&1\end{matrix}+\begin{matrix}&\\B&U\\11&2\end{matrix}\right),\frac13\left(\begin{matrix}&&\\2&B&U\\&13&1\end{matrix}+\begin{matrix}&\\B&U\\11&3\end{matrix}\right)\right\},\\

\qquad \qquad \left\{\frac13\left(\begin{matrix}&&\\2&B&U\\&12&1\end{matrix}+\begin{matrix}&\\B&U\\11&2\end{matrix}\right), \frac13\left(\begin{matrix}&&\\&B&U\\&22&1\end{matrix}+2\begin{matrix}&\\B&U\\12&2\end{matrix}\right),
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right) \right\},\\

\qquad \qquad \left\{
\frac13\left(\begin{matrix}&&\\2&B&U\\&13&1\end{matrix}+\begin{matrix}&\\B&U\\11&3\end{matrix}\right),
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\33&1\end{matrix}+\begin{matrix}&\\B&U\\13&3\end{matrix}\right)\} \right\},

\qquad \left\{ \left\{
\frac13\left(\begin{matrix}&&\\2&B&U\\&12&1\end{matrix}+\begin{matrix}&\\B&U\\11&2\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\22&1\end{matrix}+\begin{matrix}&\\B&U\\12&2\end{matrix}\right),
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right) \right\},\\

\qquad \qquad \left\{
\frac13\left(\begin{matrix}&\\B&U\\22&1\end{matrix}+\begin{matrix}&\\B&U\\12&2\end{matrix}\right), \begin{matrix}&\\B&U\\22&2\end{matrix}, 
\frac13\left(2\begin{matrix}&\\B&U\\23&2\end{matrix}+\begin{matrix}&\\B&U\\22&3\end{matrix}\right) \right\},\\

\qquad \qquad \left\{
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right),
\frac13\left(2\begin{matrix}&\\B&U\\23&2\end{matrix}+\begin{matrix}&\\B&U\\22&3\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\33&2\end{matrix}+2\begin{matrix}&\\B&U\\22&3\end{matrix}\right) \right\},\\

\qquad \left\{\left\{
\frac13\left(2\begin{matrix}&\\B&U\\13&1\end{matrix}+2\begin{matrix}&\\B&U\\11&3\end{matrix}\right) \right\},
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\33&1\end{matrix}+2\begin{matrix}&\\B&U\\13&3\end{matrix}\right)\right\},\\

\qquad \qquad \left\{
\frac16\left(\begin{matrix}&&\\2&B&U\\&23&1\end{matrix}+2\begin{matrix}&\\B&U\\13&2\end{matrix}+2\begin{matrix}&\\B&U\\12&3\end{matrix}\right),
\frac13\left(2\begin{matrix}&\\B&U\\23&2\end{matrix}+\begin{matrix}&\\B&U\\22&3\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\33&2\end{matrix}+2\begin{matrix}&\\B&U\\23&3\end{matrix}\right) \right\},

\qquad \qquad \left\{
\frac13\left(\begin{matrix}&\\B&U\\33&1\end{matrix}+2\begin{matrix}&\\B&U\\13&3\end{matrix}\right),
\frac13\left(\begin{matrix}&\\B&U\\33&2\end{matrix}+2\begin{matrix}&\\B&U\\23&3\end{matrix}\right),
\begin{matrix}&\\B&U\\33&3\end{matrix}\} \} \right\}\\

In[69]:=makeSkewTab[aa,\begin{pmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{pmatrix}];\\

\qquad makeSymmTab[bb,\begin{pmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{pmatrix}];\\

\qquad
val[aa]//MatrixForm\\
Out[70]=\begin{pmatrix}
0&a_{12}&a_{13}\\
-a_{12}&0&a_{23}\\
-a_{13}&-a_{23}&0
\end{pmatrix}
In[71]:=vall[bb]//MatrixForm
Out[71]=\begin{pmatrix}
a_{11}&a_{12}&a_{13}\\
a_{12}&a_{22}&a_{23}\\
a_{13}&a_{23}&a_{33}
\end{pmatrix}

Запись тензора в тензорном базисе, вычисление значения тензора на наборе ковекторов и векторов0. Имеется возможность записать созданный тензор в базисе пространства тензоров данного типа:

In[72] : = makeTensor [T, 1, 2]; 
           toBasis[T]
Out[73]=\begin{matrix}
1&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&11
\end{matrix}+
\begin{matrix}
1&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&11
\end{matrix}+\begin{matrix}
1&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&11
\end{matrix}+\begin{matrix}
1&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&12
\end{matrix}+\begin{matrix}
1&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&12
\end{matrix}+\begin{matrix}
1&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&12
\end{matrix}+\\

\qquad \begin{matrix}
1&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&13
\end{matrix}+\begin{matrix}
1&&3&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&13
\end{matrix}+\begin{matrix}
1&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&13
\end{matrix}+\begin{matrix}
2&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&21
\end{matrix}+\begin{matrix}
2&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&21
\end{matrix}+\\

\qquad \begin{matrix}
2&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&21
\end{matrix}+\begin{matrix}
2&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&22
\end{matrix}+\begin{matrix}
2&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&22
\end{matrix}+\begin{matrix}
2&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&22
\end{matrix}+\begin{matrix}
2&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&23
\end{matrix}+\\

\qquad \begin{matrix}
2&&3&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&23
\end{matrix}+\begin{matrix}
2&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&3&23
\end{matrix}+\begin{matrix}
3&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&31
\end{matrix}+\begin{matrix}
3&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&31
\end{matrix}+\begin{matrix}
3&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&31
\end{matrix}+\\

\qquad \begin{matrix}
3&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&32
\end{matrix}+\begin{matrix}
3&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&32
\end{matrix}+\begin{matrix}
3&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&32
\end{matrix}+\begin{matrix}
3&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&33
\end{matrix}+\begin{matrix}
3&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&2&33
\end{matrix}+\begin{matrix}
3&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&33
\end{matrix}

Для (косо)симметричных тензоров можно воспользоваться базисом в пространстве (косо)симметричных тензоров:

In[74]:=toBasis[\zeta  ^ v]
Out{74]=\begin{matrix}
1&&3&&2\\
e&\otimes&e&\otimes&e\\
&&&&
\end{matrix} \left(\begin{matrix}
&\\
-c&v\\
&12
\end{matrix}+\begin{matrix}
&\\
b&v\\
&13
\end{matrix}-\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)+\begin{matrix}
2&&1&&3\\
e&\otimes&e&\otimes&e\\
&&&&
\end{matrix} \left(\begin{matrix}
&\\
-c&v\\
&12
\end{matrix}+\begin{matrix}
&\\
b&v\\
&13
\end{matrix}-\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)+\\

\qquad \qquad \begin{matrix}
3&&2&&1\\
e&\otimes&e&\otimes&e\\
&&&&
\end{matrix} \left(\begin{matrix}
&\\
-c&v\\
&12
\end{matrix}+\begin{matrix}
&\\
b&v\\
&13
\end{matrix}-\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)+\begin{matrix}
1&&2&&3\\
e&\otimes&e&\otimes&e\\
&&&&
\end{matrix} \left(\begin{matrix}
&\\
c&v\\
&12
\end{matrix}-\begin{matrix}
&\\
b&v\\
&13
\end{matrix}+\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)+\\

\qquad \qquad \begin{matrix}
&&&&\\
e&\otimes&e&\otimes&e\\
2&&3&&1
\end{matrix} \left(\begin{matrix}
&\\
c&v\\
&12
\end{matrix}-\begin{matrix}
&\\
b&v\\
&13
\end{matrix}+\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)+\begin{matrix}
3&&1&&2\\
e&\otimes&e&\otimes&e\\
&&&&
\end{matrix} \left(\begin{matrix}
&\\
-c&v\\
&12
\end{matrix}+\begin{matrix}
&\\
b&v\\
&13
\end{matrix}-\begin{matrix}
&\\
a&v\\
&23
\end{matrix}\right)
In[75]:=toBasisSkew[\zeta  ^ v]
Out[75]=\left(c\begin{matrix}\\v\\12\end{matrix}-b\begin{matrix}\\v\\13\end{matrix}+a\begin{matrix}\\v\\23\end{matrix}\right)\begin{matrix}1\\e\\\end{matrix} \wedge \begin{matrix}2\\e\\\end{matrix} \wedge \begin{matrix}3\\e\\\end{matrix}
In[76]:=val[B]
Out[76]=\left\{\left\{\begin{matrix}B,&B,&B\\11&12&13 \end{matrix}\right\}, \left\{\begin{matrix}B,&B,&B\\12&22&23 \end{matrix} \right\}, \left\{\begin{matrix}B,&B,&B\\ 13&23&33\end{matrix}\right\}\right\}

Предусмотрен также набор обратных операций, вычисляющих список компонент тензора, заданного в виде линейной комбинации базисных. Это функции toList, toListSkew, toListSymm:

Out[77]:=toBasisSymp\left[\begin{matrix}B\\sym \end{matrix}\right]\\
Out[77]=\begin{matrix}1\\e\\\end{matrix}\circ \begin{matrix}1\\e\\\end{matrix}\begin{matrix}\\B\\12\end{matrix}+2\begin{matrix}1\\e\\\end{matrix}\circ \begin{matrix}2\\e\\\end{matrix}\begin{matrix}\\B\\12\end{matrix}+2\begin{matrix}1\\e\\\end{matrix}\circ
\begin{matrix}3\\e\\\end{matrix}\begin{matrix}\\B\\13\end{matrix}+\begin{matrix}2\\e\\\end{matrix}\circ \begin{matrix}2\\e\\\end{matrix}\begin{matrix}\\B\\22\end{matrix}+2\begin{matrix}2\\e\\\end{matrix}\circ
\begin{matrix}3\\e\\\end{matrix}\begin{matrix}\\B\\23\end{matrix}+\begin{matrix}3\\e\\\end{matrix}\circ 
\begin{matrix}3\\e\\\end{matrix}\begin{matrix}\\B\\33\end{matrix}
In[78]:=toBasis[T]
Out[78]=\begin{matrix}
1&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&11
\end{matrix}+
\begin{matrix}
1&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&11
\end{matrix}+\begin{matrix}
1&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&11
\end{matrix}+\begin{matrix}
1&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&12
\end{matrix}+\begin{matrix}
1&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&12
\end{matrix}+\begin{matrix}
1&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&12
\end{matrix}+\\

\qquad \begin{matrix}
1&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&13
\end{matrix}+\begin{matrix}
1&&3&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&13
\end{matrix}+\begin{matrix}
1&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&13
\end{matrix}+\begin{matrix}
2&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&21
\end{matrix}+\begin{matrix}
2&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&21
\end{matrix}+\\

\qquad \begin{matrix}
2&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&21
\end{matrix}+\begin{matrix}
2&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&22
\end{matrix}+\begin{matrix}
2&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&22
\end{matrix}+\begin{matrix}
2&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&22
\end{matrix}+\begin{matrix}
2&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&23
\end{matrix}+\\

\qquad \begin{matrix}
2&&3&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&23
\end{matrix}+\begin{matrix}
2&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&3&23
\end{matrix}+\begin{matrix}
3&&1&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&31
\end{matrix}+\begin{matrix}
3&&1&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&31
\end{matrix}+\begin{matrix}
3&&1&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&31
\end{matrix}+\\

\qquad \begin{matrix}
3&&2&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&32
\end{matrix}+\begin{matrix}
3&&2&&&2\\
e&\otimes&e&\otimes&e&T\\
&&&&2&32
\end{matrix}+\begin{matrix}
3&&2&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&32
\end{matrix}+\begin{matrix}
3&&3&&&1\\
e&\otimes&e&\otimes&e&T\\
&&&&1&33
\end{matrix}+\begin{matrix}
3&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&2&33
\end{matrix}+\begin{matrix}
3&&3&&&3\\
e&\otimes&e&\otimes&e&T\\
&&&&3&33
\end{matrix}\\

In[79]:=toList\left[\begin{matrix}1&&&\\e&\otimes&e&2\\&&1&\end{matrix}+\begin{matrix}1&&&"2"\\e&\otimes&amp;e&"T"\\&&2&"1"\end{matrix}\right]\\
Out[79]\left\{\{2,0,0\},\left\{\begin{matrix}2\\T\\1\end{matrix},0,0\right\},\{0,0,0\}\right\}\\
In[80]:=makeTensor[BB,0,2]\\

\qquad basis[5](*\mbox{взяли другой базис}*)\\

\qquad toBasisSkew \left[\begin{matrix}\\BB\\alt\end{matrix} \right]
Out[81]=basis[5]
Out[82]=\frac12 \left(\begin{matrix}\\BB\\12\end{matrix}-\begin{matrix}\\BB\\21\end{matrix}\right)\begin{matrix}1\\e\\\end{matrix}\wedge \begin{matrix}2\\e\\\end{matrix}+\frac12\left(\begin{matrix}\\BB\\13\end{matrix}-\begin{matrix}\\BB\\31\end{matrix}\right)\begin{matrix}1\\e\\\end{matrix}\wedge\begin{matrix}3\\e\\\end{matrix}+\frac12\left(\begin{matrix}\\BB\\23\end{matrix}-\begin{matrix}\\BB\\32\end{matrix}\right)\begin{matrix}2\\e\\\end{matrix}\wedge\begin{matrix}3\\e\\\end{matrix}\\
In[83]:=toListSkew[toDasisSkew\left[\begin{matrix}\\BB\\alt\end{matrix}\right]\right]\\
Out[83]=\left\{\left\{0,\frac12\left(\begin{matrix}\\BB\\12\end{matrix}-\begin{matrix}\\BB\\21\end{matrix}\right), \frac12 \left(\begin{matrix}\\BB\\13\end{matrix}-\begin{matrix}\\BB\\31\end{matrix}\right)\right\},\\

\qquad \qquad \left\{\frac12 \left(\begin{matrix}\\-BB\\12\end{matrix}+\begin{matrix}\\BB\\21\end{matrix}\right), 0, \frac12\left(\begin{matrix}\\BB\\23\end{matrix}-\begin{matrix}\\BB\\32\end{matrix}\right)\right\},\left\{\frac12\left(\begin{matrix}\\-BB\\13\end{matrix}+\begin{matrix}\\BB\\31\end{matrix}\right), \frac12 \left(\begin{matrix}\\-BB\\23\end{matrix}+\begin{matrix}\\BB\\32\end{matrix}\right),0\}\right\}

Напомним, что тензор типа (p,q) можно представлять себе как полилинейное отображение, заданное на прямом произведении p экземпляров двойственного пространства и q экземпляров самого пространства. Чтобы вычислить значение такого отображения, в пакете имеется функция apply :

In[84] : = basis [1] 
\\
           val[T] 
\\
           val[\zeta ]
\\
           makeTensor[W, 1,0] 
\\
           val[W] 
\\
           toBasis [apply[T, \zeta , W, \{ 1, 0, 0\} ]]
Out[84]=\left\{\begin{matrix}1&2&3&&&\\e,&e,&e,&e,&e,&e,\\&&&1&2&3\end{matrix}\right\}\\
out[85]=\left\{\left\{\left\{\begin{matrix}1&1&1\\T,&T,&T\\11&12&13\end{matrix}\right\},{\left\{\begin{matrix}1&1&1\\T,&T,&T\\21&22&23\end{matrix}\right\},{\left\{\begin{matrix}1&1&1\\T,&T,&T\\31&32&33\end{matrix}\right\}\right\},\\

\qquad \qquad \left\{{\left\{\begin{matrix}2&2&2\\T,&T,&T\\11&12&13\end{matrix}\right\},{\left\{\begin{matrix}2&2&2\\T,&T,&T\\21&22&23\end{matrix}\right\},{\left\{\begin{matrix}2&2&2\\T,&T,&T\\31&32&33\end{matrix}\right\}\right\},

\qquad \qquad \left\{{\left\{\begin{matrix}3&3&3\\T,&T,&T\\11&12&13\end{matrix}\right\},{\left\{\begin{matrix}3&3&3\\T,&T,&T\\21&22&23\end{matrix}\right\},{\left\{\begin{matrix}3&3&3\\T,&T,&T\\31&32&33\end{matrix}\right\}\}\right\}
In[86]:={a,b,c}
Out[88]=\left\{\begin{matrix}1&2&3\\W,&W,&W\end{matrix}\right\}\\
Out[89]=toBasios[

\qquad \begin{matrix}&1&1\\a&T&W\\&11&\end{matrix}+\begin{matrix}&2&1\\b&T&W\\&11&\end{matrix}+\begin{matrix}&3&1\\c&T&W\\&11&\end{matrix}+\begin{matrix}&1&2\\a&T&W\\&21&\end{matrix}+\begin{matrix}&2&2\\b&T&W\\&21&\end{matrix}+\begin{matrix}&3&2\\c&T&W\\&21&\end{matrix}+\begin{matrix}&1&3\\a&T&W\\&31&\end{matrix}+\begin{matrix}&2&3\\b&T&W\\&31&\end{matrix}+\begin{matrix}&3&3\\c&T&W\\&31&\end{matrix}]

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

In[90]: = арр1у[Т, \zeta , W\otimes W, W]
\\
          Несоответствие \ тензора \ и \ его \ аргументов 
\\
Out[90] = $Aborted 
\\
In[91]:= apply[T, \zeta , W]
\\
Out[91] = apply [T, \zeta , W]

Перезапуск. Чтобы отменить все созданные базисы, координаты и пр. следует выполнить команду resetTensors:

In[92] =basis [curBas] 
        resetTensors 
        basis[curBas]
Out[92]=\left\{\begin{matrix}1&2&3&&&\\e,&e,&e,&e,&e,&e,\\&&&1&2&3\end{matrix}\right\}
Пакет Tensors перезапущен. Результаты вычислений аннулированы. 
Out[94] = basis [0]

Особенности работы с локальными координатами и тензорными полями. Если вы задали локальные координаты и соответствующий базис (команда makeBasisDif ), то появляется возможность задавать тензорные поля, компоненты которых суть абстрактные функции от координат. Соответствующий набор функций - это makeTensorField, makeSkewField и makeSymmField . Результат их работы - соответствующее тензорное поле, к которому можно применять обычные тензорные операции:

In[95] := resetTensors ;
\\
          makeBasisDif[x, 2] ;
\\
          makeTensorField[v, 1, 0] ; makeTensorField[\xi , 0, 1] ;
\\
          val [\xi  \otimes  v]
\\

\\
       Пакет \ Tensors \ перезапущен. \ Результаты \ вычислений \ аннулированы.
ut[98]=\left\{\left\{\begin{matrix}1\\v,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\\xi\\1,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right],\begin{matrix}1\\v,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\\xi\\2,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right],\right\}\\

\qquad \qquad {\left\{\begin{matrix}2\\v,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\\xi\\1,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right],\begin{matrix}2\\v,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\begin{matrix}\\\xi\\2,\\\end{matrix}\left[\begin{matrix}1&2\\x,&x\\\end{matrix}\right]\right\}

Замена координат или базиса, пересчет компонент, граф замен. Если мы хотим сделать замену координат, то следует создать новые координаты или новый базис с помощью команд makeBasisDif и makeBasis , указав явно связь нового базиса (координат) с каким-нибудь уже заданным (по умолчанию - с текущим) базисом (координатами). В линейно-алгебраическом случае это делается с помощью задания матрицы перехода (столбцы которой - суть компоненты векторов нового базиса в старом), а в случае локальных координат следует задавать функции перехода, выражающие текущие координаты через новые (см. примеры ниже). Кроме того, в качестве четвертого аргумента функции makeBasisDif можно задать функции, задающие обратное отображение и выражающие новые координаты через текущие. Проверка взаимной обратности остается на совести пользователя. Если переход задан, то новые координаты становятся текущими и значения всех тензоров автоматически в них пересчитывают.

Приведем соответствующие примеры. Чтобы удобнее было контролировать вычисления, пакет создает ориентированный граф graphBas замен координат (базисов). Вершины этого графа - системы координат. Две вершины соединены стрелкой, если соответствующая замена координат задана явно. Этот граф удобно вывести динамически. В приведенной ниже программе предусмотрен переход к координатам, выбранным мышкой. А именно, чтобы сделать замену, нужно кликнуть в соответствующую вершину графа:

In[99] :=
      (*Создаем евклидовы координаты на плоскости*) 
     resetTensors; 
     makeBasisDif[{х, у}]; 
      (*Задаем в них постоянную билинейную форму и произвольный вектор*)
\begin{matrix}
&&makeTensorTab \left{ G, \begin{matrix}1&0\\0&4\end{matrix},0,2\right]
\end{matrix}
makeTensorTab[W, {а, b} , 1, 0] ;
         (*Задаем полярные координаты. При этом Записываем функции 
           перехода от них к текущим координатам, 
         т.е. функции х[r, ϕ] и у[r, ϕ]. При этом текущими координатами
            становятся полярные *) 
        makeBasisDif [ {r, ϕ , {r Cos [ϕ] , r Sin [ϕ] } ] ;
In[104] :=
       (*Программа, динамически выводящая граф замен*) 
     DynamicModule[{}, 
        Dynamic[Deploy[GraphPlot[graphBas, DirectedEdges -> True,
             VertexRenderingFunction -> 
                ({White, EdgeForm[Black], EventHandler[Disk[#, .15], 
                     { "MouseDown" : > (changeBas [curBas , #2] ) } ] , 
                  If [#2 == curBas, Red, Black],
                  EventHandler[Style[Text[Column[{coor[#2] , #2} , Center] , #l] , 
                       FontSize -> Scaled [0.03] ] , 
                     {"MouseDown" :> (changeBas[curBas, #2])}]} &), 
              ImageSize -> {300, 350}] ] ], 
        Initialization :-> Needs ["Tensors" , NotebookDirectory [] <> "tensors .m"] ]

In[105] := Dynamic [ {val [W] , apply[G, W, W] } // Simplify]
Out[105]= {val [W] , apply [G, W, W] }
In[106]:=(* Задаем еще одни координаты (u,v) . Функции перехода 
                можно задать к любым имеющимся координатам, 
             указав явно их номер. В следующем примере мы задаем
              функции перехода к декартовым координатам, 
             т.е. функции x[u,v] и y[u,v]*) 
             makeBasisDif [{u, v} , 1, {и^2 - v^2, 2 u v} ] ; 
              (*A здесь - функции перехода к полярным координатам
                  r[p,q] и ϕ [p,q]*) 
             makeBasisDif [{p, q} , 2, {р1/3 , q\3}];

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

In[108] := (*3адаем переход от 4х координат к полярным (вторым)*) 
             makeTransDif[4, 2, {r3, 3ϕ}]; 
          (*И еще переходы*)
             makeTransDif [3, 2, {Sqrt [r] Cos [ϕ / 2] , Sqrt [r] Sin [ϕ / 2] } ] ; 
             makeTransDif[2, 1, {Sqrt[х^2+у^2] , ArcTan[y/ x] } ] ;

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

Получающиеся выражения не всегда легко упрощаются. Это объективно связано с тем, что функции перехода определены не всюду. В пакете предусмотрена возможность добавлять предположения о значениях тех или иных переменных в список предположений $Assumptions, которым Mathematica пользуется при упрощениях, или убирать их оттуда. Соответствующие команды - это addAssumptions и clearAssumptions . Отметим, что предположение о вещественности заводимых координат делается автоматически.

In[111] := $Assumptions
           addAs sumptions [p>0, 0<q<π, r>0, -π / 2 < ϕ < π / 2] ;
           $As sumptions
           clearAssumptions [0 < q < π] ;
           $Assumptions
           addAs sumptions [p > 0, 0 < q < π / 6, u2-v2>0, u v > o] ;
           $As sumptions
Out[111] =
        (x | y) º Reals && (r | ϕ) º Reals && (u | v) º Reals && (p | q) º Reals
Out[113]= (p | q) º Reals && (r | ϕ) º Reals && (u | v) º Reals &&
               (x | у) º Reals && p > 0 && r > 0 && 0 < q < π && - π/2 < ϕ < π/2
Out[115]= (p | q) º Reals && (r | ϕ) º Reals && (u | v) º Reals && 
               (x | y) º Reals && p > 0 & & r > 0 && - π/2 < ϕ < π/2
Out[117] =
       (p | q) º Reals && (r | ϕ) º Reals && (u | v) º Reals && (x | у) º Reals && 
      p > 0 && r > 0 && uv > 0 && u2-v2 > 0 && 0 < q < π/6 && -π/2 < ϕ < π/2
< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Олег Корсак
Олег Корсак
Латвия, Рига
Александр Дронов
Александр Дронов
Россия, Воронеж, Воронежский государственный технический университет, 1995