テンソルでミンコフスキー空間を視覚化しよう
このワークシートはMath by Codeの一部です。
前回は計量テンソルと基底と変換行列、ヤコビアンの関係、添え字の上下について学んだ。
今回は、計量テンソルを使って空間のようすをつかんでみよう。
そして、特殊相対性理論のミンコフスキー空間を視覚化してみよう。
1.計量テンソルの効果
<計量テンソル>
計量テンソルについて振り返ってみよう。
微小ベクトルのサイズ、微小距離ds(線素)を2乗は、
ds2=(dxmem)(dxnen)=(dxmdxn) em・en=(dxmdxn) gmn
つまり、ds2=(dxmdxn) gmn
これを反変ベクトルdxmと反変ベクトルdxnで計量テンソルgmnをはさんでスカラー量にしたといえる。
Amgmn=An
これは、共変の計量テンソルをかけると、ベクトルの成分が反変から共変に変わるといえる。
反変ベクトルはメモリの情報で、共変の計量テンソルはメモリから物理量に翻訳するデータです。
だから、反変ベクトルの成分が共変ベクトルつまりどんな物理量に相当するかをもとめています。
Amgmn=An
これは、反変の計量テンソルをかけると、ベクトルの成分が共変から反変に変わるといえる。
物理量である共変ベクトルに反変の計量テンソルをかけると、反変ベクトル、メモリ情報になります。
ベクトルの長さの2乗は共変成分と反変成分の積か同じ上下の成分の積に共変テンソルをかけたものです。
L2 = Ai Ai = gij Ai Aj
<計量テンソルで場のゆがむ?>
正規直交系の計量テンソルはgij=diag(1,1)でした。
メモリデータである反変ベクトルAj=[1,1]、全成分が1という平坦なデータに、計量テンソル gijを通すと、
空間の場所に関係なく重みが1のままの共変ベクトル Ai=[1,1]に変換される。
計量テンソルを空間の場のデータとしてみると、正規直交系は平坦であることがわかります。
また、L2=[1,1]・[1,1]=1+1=2で一定です。場のゆがみはありません。
一方で、極座標系の計量テンソルは、
x = r * cos(t)
y = r * sin(t)から
gij=JT J=[[1,0][0,r2]]でした。
メモリデータである反変ベクトルAj=[1,1]、全成分が1という平坦なデータに、計量テンソル gijを通すと、
空間の場所(r)に応じた重みがついた共変ベクトル Aiに[1,r2]変換される。
つまり、計量テンソルを空間の場のデータとしてみると、場のゆがみがでます。
また、L2=[1,1]・[1,r2]=1+r2で,場が中心から離れるほどゆがみが大きいことがわかります。
ただし、場のゆがみとはいいましたが、ものさしが曲がっているので、空間がゆがんで表れているだけともいえます。ゆがんだ網目を伸ばせばきれいな正規直交座標にもどせます。
課題:座標系を極座標にしたときの場のゆがみを視覚化してみましょう。
pythonはテンソル計算ができますが、添え字の上下の記述には対応していません。
あくまでも、つぶす軸の意味づけで区別しましょう。
メッシュデータを場のテンソルとして用意します。
その数列R(半径)、T(角度)のパラメータに連動して、
反変ベクトル(AU)、共変計量テンソル(gdij)を作りましょう。
その積、共変ベクトル(AD)を求めることで、L2はAUとADの内積で求められます。
python
[IN]
#=================================================
import matplotlib.pyplot as plt
import numpy as np
# テーマ:AD[1]=r^2の視覚化とADとAUの内積
# 添字の設定と空間の準備
# i: mu, j: nu, k: radius(R), l: theta(T)
# 上付きはu, 下付きはdのあとに添字をかく
# 2軸のパラメータのメッシュのテンソルを用意する。
k = np.linspace(0.1, 10, 10)
l = np.linspace(0, 2*np.pi, 10)
R, T = np.meshgrid(k, l, indexing='ij')
# メッシュテンソル場のどこも[[1,0],[0,r^2]]になる計量テンソル gdij (2, 2, 10, 10)の作成
gdij = np.zeros((2, 2, 10, 10))
gdij[0, 0, :, :] = 1.0
gdij[1, 1, :, :] = R**2
# 反変ベクトル AU=Auj (2, 10, 10) メッシュテンソル場のどこでも[1,1]にする。
AU = np.ones((2, 10, 10))
# --- 添字の上げ下げ: AD = A_i = g_ij * A^j ---
AD = np.einsum('ijkl,jkl->ikl', gdij, AU)
print("gdij.shape=",gdij.shape,"AU.shape=",AU.shape,"AD.shape=",AD.shape)
# 共変ベクトルADは、理論上: AD0 = g_00 * AU0 = 1 * 1 = 1、AD1 = g_11 * AU1 = r^2 * 1 = r^2
print("AD[0] ( 1.0?):", np.allclose(AD[0], 1.0))
print("AD[1] ( R^2?):", np.allclose(AD[1], R**2))
def drawSize2D(P):
fig, ax = plt.subplots(1, 1, figsize=(7, 7), subplot_kw={'projection': '3d'})
i_size, k_size = P.shape[0], P.shape[1]
#テンソルの内容をその位置にかく
for iv in range(i_size):
for kv in range(k_size):
height = P[iv,kv]
ax.quiver(iv, kv, 0,0,0,height, length=0.1, color='red', linewidth=1)
ax.set_xlim([0, 10]);ax.set_ylim([0, 10]);ax.set_zlim([0, 10])
ax.set_xlabel('ij');ax.set_ylabel('k');ax.set_zlabel('l')
plt.show()
# ADのi軸を高さに置換すると、i軸のベクトルは[0]で1.0、[1]でR**2になる。
# L2 = A_i * A^j (全空間での長さの2乗を計算)
L2 = np.einsum('ikl, ikl -> kl', AD, AU)
drawSize2D(L2)
print(L2)
#================================================
gdij.shape= (2, 2, 10, 10) AU.shape= (2, 10, 10) AD.shape= (2, 10, 10)
AD[0] ( 1.0?): True
AD[1] ( R^2?): True
[[ 1.01 1.01 1.01 1.01 1.01 1.01 1.01 1.01 1.01 1.01]
[ 2.44 2.44 2.44 2.44 2.44 2.44 2.44 2.44 2.44 2.44]
[ 6.29 6.29 6.29 6.29 6.29 6.29 6.29 6.29 6.29 6.29]
[ 12.56 12.56 12.56 12.56 12.56 12.56 12.56 12.56 12.56 12.56]
[ 21.25 21.25 21.25 21.25 21.25 21.25 21.25 21.25 21.25 21.25]
[ 32.36 32.36 32.36 32.36 32.36 32.36 32.36 32.36 32.36 32.36]
[ 45.89 45.89 45.89 45.89 45.89 45.89 45.89 45.89 45.89 45.89]
[ 61.84 61.84 61.84 61.84 61.84 61.84 61.84 61.84 61.84 61.84]
[ 80.21 80.21 80.21 80.21 80.21 80.21 80.21 80.21 80.21 80.21]
[101. 101. 101. 101. 101. 101. 101. 101. 101. 101. ]]

2.ローレンツ変換の計量テンソルはどうゆがんで見えるか
前に同時性も観測者によるものか?で求めたように、
系Sから系S’へのローレンツ変換の式は
T' = aT-v/c^2 aX
X’ =-vaT +aX
でした。
光速 c = 1,
速度 v =v/c=beta とするとき、
a = 1/sqrt(1-beta**2)=gammaとし、
va=beta*gamma=alphaとおけます。
すると、座標変換式は
tt = gamma * t - alpha * x
xx = -alpha * t + gamma * x
と簡単になりますね。
tt、xxは座標だから、反変ベクトルです。
座標の基底自体がどうなったのかを表示すために
alphaの符号を反転させて、共変ベクトルにします。
tt = gamma * t + alpha * x
xx = alpha * t + gamma * x
beta=0.6のとき、
gamma=1/sqrt(1-beta**2)=1/0.8=5/4=1.25
alpha= 0.6*1.25=3/5*5/4=3/4=0.75
となるので、この値で極座標系の場のゆがみのように、
ミンコフスキー空間のゆがみがどう見えるかを視覚化できます。
特殊相対性理論では、不変量は s2 = x2 - (ct)2です。
これでは、ユークリッド空間の距離d2=x2+(y)2と形があいません。
時間を虚軸Y(ict), 空間を1次元の実数軸X(x)、標準基底ベクトルをe1,e2={1,0},{0,1}とし、
y=ictとおくと、位置ベクトルx={x, y}の原点Oからの
ミンコフスキー距離d=sqrt(x2+y2)=sqrt(x2-(ct)2)を距離と決めることができる。
なんと、形式的にはミンコフスキー距離はユークリッド距離と同じにかける。
代入すると、2次元平面の双曲線を表す。そして、時間と空間の対等性が見えてくる。
これが、前の同時性も観測者によるものか?でやったことでした。
しかし、虚数時間をつかってまで、ユークリッド計量I=diag(1,1)にあわせる必要はないでしょう。
ミンコフスキー計量はdaig(-1,1)にすることで、虚数時間を不要にできます。
そして、この計量で、ローレンツ変換のヤコビアンから、変換後の計量を求めればよいです。
なんと、もとのdaig(-1,1)のままです。
また、ヤコビアンの行列式の絶対値も1だから、時空の全体の大きさ(体積)が変わらないでのす。
課題:座標系をミンコフスキー空間にしたときの場のゆがみを視覚化してみましょう。
ローレンツ変換された系は斜交座標系です。
斜交座標系の計量テンソルを求め、反変ベクトルを[1,1]の平坦なメモリして、共変ベクトルがどうなるか、L2がどうなるかを、上で使った極座標のテンソル場のゆがみの表示のように求められます。
python
[IN]
#=================================================
from sympy import symbols, sin, cos, Matrix, simplify, diag,sqrt,det,lambdify
import numpy as np
# 変数と変換式の定義
c=1 # speed of light
beta = 0.6 # velocity
gamma = 1/sqrt(1-0.6**2)
alpha = gamma*beta
print("gamma=",gamma,"alpha=", alpha)
x, t = symbols('x t')
gxt = np.diag([-1.0, 1.0])
def metricTensor(coords,vars,title):
J = coords.jacobian(vars) # ヤコビ行列 J
g = simplify(J.T *gxt*J) # 計量テンソルg
print(title)
display(g)
return g
# 座標変換式
tt = gamma * t + alpha * x
xx = alpha * t + gamma * x
coords = Matrix([tt, xx])
vars = [t, x]
G = metricTensor(coords,vars,"ミンコフスキーの計量テンソル g:")
J=sqrt(abs(det(G)))
print("ヤコビアンは",J)
func_t = lambdify((t, x), tt, 'numpy')
func_x = lambdify((t, x), xx, 'numpy')
t_vals = np.linspace(0, 2, 11) # 11本の線
x_vals = np.linspace(0, 2, 11)
fine_samples = np.linspace(0, 2, 100) # 線を滑らかにするためのサンプリング
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 左側: ユークリッド空間
for val in t_vals:
ax1.plot(fine_samples, np.full_like(fine_samples, val), 'gray', lw=0.5) # v=const
for val in x_vals:
ax1.plot(np.full_like(fine_samples, val), fine_samples, 'gray', lw=0.5) # u=const
ax1.set_title("orthogonal")
ax1.set_aspect('equal')
ax1.quiver(0,0,0,1, color='blue',linewidth=1,angles='xy', scale_units='xy', scale=1)
ax1.quiver(0,0,1,0, color='blue',linewidth=1,angles='xy', scale_units='xy', scale=1)
# 右側:ミンコフスキー空間
for tv in t_vals:
# vを配列に変換して渡す
t_arr = np.full_like(fine_samples, tv)
curr_t = func_t(fine_samples, t_arr)
curr_x = func_x(fine_samples, t_arr)
ax2.plot(curr_t, curr_x, 'blue', lw=1)
for xv in x_vals:
# uを配列に変換して渡す
x_arr = np.full_like(fine_samples, xv)
curr_t = func_t(x_arr, fine_samples)
curr_x = func_x(x_arr, fine_samples)
ax2.plot(curr_t, curr_x, 'red', lw=1)
m00,m01=coords.subs({t:0,x:1})
m10,m11=coords.subs({t:1,x:0})
ax2.quiver(0,0,float(m00),float(m01), color='blue',linewidth=1,angles='xy', scale_units='xy', scale=1)
ax2.quiver(0,0,float(m10),float(m11), color='blue',linewidth=1,angles='xy', scale_units='xy', scale=1)
ax2.set_title("minkovski(t, x)")
ax2.set_aspect('equal')
plt.show()
# 座標系部分の計算は不要(上げ下げだけだし、Gは座標に依存しない定数だから)
# 計量テンソル gdij (2, 2)
gdij = G
# 反変ベクトル Auj (2) の例
AU = np.ones((2))
AD = np.einsum('ij,j->i', gdij, AU)
print("AU=",AU)
print("AD=",AD)
# ADのi軸のベクトルは[0]で-1.0、[1]で1になる。
# L2 = A_i * A^j (全空間での長さの2乗を計算)
L2 = np.einsum('i, j -> ', AD, AU)
print(L2)
#====================================
[OUT]
gamma= 1.25000000000000 alpha= 0.750000000000000
ミンコフスキーの計量テンソル g: [[-1.0, 0],[0, 1.0]]
ヤコビアンは 1.00000000000000
AU= [1. 1.]
AD= [-1.00000000000000 1.00000000000000]
0

<L2=0の意味>
数学でみると、AU = [1, 1] と A_D = [-1, 1]の内積がL2=1×(-1)+1×1=0になるということです。
物理的には、どうでしょう。
c=1としているので、傾き1の線はx=ctという直線上の点です。
AU=[1,1] はt=1、x=1のだから、x=ctという光の通る線上の点ですね。
つまり、この45度線という光線は、「時間の経過も距離もない特異な領域」だということです。
L2=0はこの光線上では保存されます。不変量になります。
光速一定が、グラフ上で長さがない点の集まり、「光の軌跡(光円錐ライトコーン)」という形で証明されています。
光の軌跡の長さ(世界間隔)は常に 0 です。Nullです。
では、この光線以外の点はどうなるでしょう。
AU = [1.5, 1.0](時間の方が長い)なら、AD = [-1.5, 1.0]にすればL2は-1.25とマイナスになり(時間的)、
原点Oから上が未来の円錐の内側、原点から下が過去の円錐の内側です。
光速のラインよりはスピードが遅い時空なので、時間的に到達可能な領域という意味です。
このコーンの中を移動した軌道を世界線といいます。現象の因果関係が成り立ちます。
一方で、コーンの外部はどうでしょう。
AU = [1.0, 1.5](空間の方が長い)にすればL2はプラスになります(空間的)。
上下のコーンの外側であっても、原点Oから時間軸の正の側が未来、負の側が過去になりますが、
光速のラインを超えないと到達できないので、「他所」と呼ばれます。
光速を超えるという、不可能なことができないとその時空点、存在はするが到達できないという意味で
空間的という名前がつきます。
課題:ライトコーンのイメージをかいてみよう。
空間軸はx軸だけだと、イメージがわきにくい。だから、xy軸にして、時間とともに移動ができる、
移動した跡、世界線がかける場所を作りたい。
そして、z軸の名前を時間軸tにしよう。