Posted at

NumPyで共変テンソル・反変テンソルの変換

テンソル代数の共変・反変の変換をNumPyでやる方法のメモ。

NumPyでテンソル代数(共変・反変)の続き。

問題は、テンソル解析(田代嘉宏・著) p163 問題1 参照。

基底$Σ${$e_1,e_2,e_3$},$Σ'${$e'_1,e'_2,e'_3$}の双対基底の変換式は前回と同じです。

e_1 = e_1' + 2e_2' + 3e_3' \\

e_2 = 2e_1' - e_2' +2e_3' \\
e_3 = -4e_1' + 2e_2' - 5e_3'

基底の変換行列Aは双対基底の変換式より

A =

\begin{pmatrix}
1 & 2 & -4\\
2 & -1 & 2\\
3 & 2 & -5
\end{pmatrix}

Aの逆行列は

A^{-1} =

\begin{pmatrix}
0.2 && 0.4 && 0 \\
3.2 && 1.4 && -2 \\
1.4 && 0.8 && -1
\end{pmatrix}

NumPyで書くと以下の通り。

import numpy as np

A = np.array([[1,2,-4],[2,-1,2],[3,2,-5]])
print(A)

#出力
#[[ 1 2 -4]
#[ 2 -1 2]
#[ 3 2 -5]]

A_1 = np.linalg.inv(A).round(decimals=1)
print(A_1)

#出力
#[[ 0.2 0.4 0. ]
#[ 3.2 1.4 -2. ]
#[ 1.4 0.8 -1. ]]


共変テンソルの変換

以下の共変テンソル

T =

\begin{pmatrix}
2 && 1 && -4 \\
1 && 0 && 2 \\
1 && -3 && 1
\end{pmatrix}

を変換します。

共変テンソルの変換式は以下の通り。

T_{ab} = \bar{{}^t\!A^a\,_i} \; T_{ij} \; \bar{A^j\,_b}

$\bar{A^i\,_a}$は$A^a\,_i$の逆行列を表します。

前回と同様、.dot()を使います。

T = np.array([[2,1,-4],[1,0,2],[1,-3,1]]) #共変テンソル

T_ab = A_1.T.dot(T.dot(A_1)).round()
print(T_ab)

#出力
#[[-2. 2. 1.]
#[-3. 0. 2.]
#[ 2. -1. -1.]]


反変テンソルの変換

以下の反変テンソル

H =

\begin{pmatrix}
3 && 2 && 1 \\
2 && -1 && 3 \\
1 && 3 && 1
\end{pmatrix}

を変換します。

反変テンソルの変換式は以下の通り。

H^{ab} = A^a\,_i \; H^{ij} \; {}^t\!A^j\,_b

H = np.array([[3,2,1],[2,-1,3],[1,3,1]]) #反変テンソル

H_ab = A.dot(H.dot(A.T))
print(H_ab)

#出力
#[[-33 24 -30]
#[ 24 3 35]
#[-30 35 -18]]


混合テンソルの変換

以下の混合テンソル

P =

\begin{pmatrix}
3 && 1 && 3 \\
-5 && 3 && 1 \\
-4 && 2 && 1
\end{pmatrix}

を変換します。

反変テンソルの変換式は以下の通り。

P^a\,_b = A^a\,_i \; P^i\,_j \; \bar{A^j\,_b}

P = np.array([[3,1,3],[-5,3,1],[-4,2,1]]) #混合テンソル

P_ab = A.dot(P.dot(A_1)).round()
print(P_ab)

#出力
#[[ 0. 3. 1.]
#[ 20. 11. -13.]
#[ 9. 11. -4.]]