Тензоры: опыт создания пользовательского пакета программ
Аналогично выглядят команды альтернирования и симметрирования:
![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}](/sites/default/files/tex_cache/0e7cb7696ab1dc6c2879e43cc5e89396.png)
Также часто удобно вывести конкретную компоненту тензора. Это делается с помощью явного указания списков соответствующих индексов:
![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}](/sites/default/files/tex_cache/bb275642e41d1c3c8a13f713c47854b9.png)
Аналогично, имеется возможность породить сразу симметричный или кососимметричный тензор типа (0,q). Для этого используются команды makeSymm, makeSkew, makeSymmTab, makeSkewTab. Для симметричных и ко сосимметричных тензоров определены операции симметричного произведения ( SmallCircle, Esc sc Esc ) и, соответственно, кососимметричного произведения
( Wedge, Esc ^ Esc ). Пакет относит к симметричным (кососимметричным) тензорам или тензоры, созданные перечисленными четырьмя операциями, или полученные в результате симметрирования или альтернирования тензоров типа (0,q) :
![In[61] := makeSkew [v, 2]; makeSkewTab [ \zeta , \{ a, b, c\} ]
\\
val[v]
\\
val[\zeta ]
\\
val[\zeta ^v]](/sites/default/files/tex_cache/e415d3f45d1b4563c39b204f860a08fc.png)
![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\}](/sites/default/files/tex_cache/09a812d6e7a8e8d773f70103615d05d9.png)
![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\}](/sites/default/files/tex_cache/29427ff49ca7c1e56c71d9985aa36c5f.png)
Отметим, что при создании (косо)симметричного тензора по таблице значений соответствующая функция не проверяет (косо)симметричность таблицы, а просто использует только часть данных, доопределяя значения по симметрии:
![In[65] : = makeSymm[B, 2]; makeSymm[U, 1]
\\
val[B]
\\
val[U]
\\
val[B \deg u]](/sites/default/files/tex_cache/2c0b1af39f729771c117d2591f854a73.png)
![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}](/sites/default/files/tex_cache/49486bfa465789e7d8d388f00b5103b2.png)
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}](/sites/default/files/tex_cache/77f9ab86fc9cde91dc66b463c97fe8e6.png)
Запись тензора в тензорном базисе, вычисление значения тензора на наборе ковекторов и векторов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}](/sites/default/files/tex_cache/268739920bb93babae0afd3dc5a66f10.png)
Для (косо)симметричных тензоров можно воспользоваться базисом в пространстве (косо)симметричных тензоров:
![In[74]:=toBasis[\zeta ^ v]](/sites/default/files/tex_cache/678c7e76bcb1c28b069a5c2bd96e6b7a.png)
![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)](/sites/default/files/tex_cache/ac16ad95b075e59947247e1f4beb154e.png)
![In[75]:=toBasisSkew[\zeta ^ v]](/sites/default/files/tex_cache/6aafbb1b928144edccea5a483ea1ee68.png)
![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}](/sites/default/files/tex_cache/1b0ef764c6824f96235c409ba1190e11.png)
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\}](/sites/default/files/tex_cache/1162e551b2857f0ac68944cafc852c95.png)
Предусмотрен также набор обратных операций, вычисляющих список компонент тензора, заданного в виде линейной комбинации базисных. Это функции 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}](/sites/default/files/tex_cache/fbaf37c3174a0c4ddd030ec457d855f3.png)
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&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]](/sites/default/files/tex_cache/05396cab3918c3976a45fca8ee1b4751.png)
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\}](/sites/default/files/tex_cache/83f30e6aae29cceee989af8cc577afb1.png)
Напомним, что тензор типа (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\} ]]](/sites/default/files/tex_cache/ec98f5bf1334f41a2f4610fbc6980049.png)
![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\}](/sites/default/files/tex_cache/18d6fa69fecebde5b9df9431828dfa96.png)
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}]](/sites/default/files/tex_cache/e698119c638b2170c54b41f8f9043ff5.png)
При этом, как видно из примера, имеется возможность подставлять сразу компоненты тензора. Если количество или вид аргументов не соответствует типу, выдается сообщение об ошибке или функция просто не выполняется:
![In[90]: = арр1у[Т, \zeta , W\otimes W, W]
\\
Несоответствие \ тензора \ и \ его \ аргументов
\\
Out[90] = $Aborted
\\
In[91]:= apply[T, \zeta , W]
\\
Out[91] = apply [T, \zeta , W]](/sites/default/files/tex_cache/5e9926ae823e7d3b2e00aa311a1ee4c7.png)
Перезапуск. Чтобы отменить все созданные базисы, координаты и пр. следует выполнить команду 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\}](/sites/default/files/tex_cache/090ab2154f5b277d11a99f2681011e3f.png)
Пакет 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 \ перезапущен. \ Результаты \ вычислений \ аннулированы.](/sites/default/files/tex_cache/7b1f89e33718674e681be9d398c1c907.png)
![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\}](/sites/default/files/tex_cache/cafcf3cee47f14c3deb553dc88435f60.png)
Замена координат или базиса, пересчет компонент, граф замен. Если мы хотим сделать замену координат, то следует создать новые координаты или новый базис с помощью команд 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}](/sites/default/files/tex_cache/78991fec6c5fdd5db425cec1b2ac1ff9.png)
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