テンソル代数の共変・反変の変換を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.]]