今回は Python(SymPy)を活用する具体例として、4次元時空のReissner-Nordstrom(ライスナー=ノルドシュトロム)解が、電場が存在する場合のアインシュタイン方程式の解になっていることをPython(SymPy)を使って確認してみたいと思います。電場が存在しない場合には、前の記事
でみたように、宇宙定数がゼロの場合にはSchwarzschild(シュワルツシルト)解が、宇宙定数がゼロでない場合にはde Sitter-Schwarzschild(ド・ジッター=シュワルツシルト)解が、静的で球対称な場合のアインシュタイン方程式の真空解として求められました。今回はこれらを少し拡張したものになります。
ド・ジッター解
計算の詳細については、上でリンクを貼った過去の記事を参照してください。
宇宙定数 を含み、物質場の存在しない場合のEinstein方程式は
です。その解は
で与えられます。ただし、これらの成分は座標系
に関するものです。確認しておくと
%reset import sympy as sp sp.var('t, r, theta, phi, psi, a, Lambda') xi = sp.Matrix([ [t],[r],[theta],[phi] ]) D = len(xi) f = 1 - a/r - (Lambda/3)*r**2 g = sp.Matrix([ [-f, 0, 0, 0], [0, 1/f, 0, 0], [0, 0, r**2, 0], [0, 0, 0, r**2*sp.sin(theta)**2] ]) ginv = g.inv() def Gamma(k,i,j): gm = 0 for n in range(D): gm = gm + sp.Rational(1,2)*ginv[k,n]*(g[n,i].diff(xi[j])\ +g[n,j].diff(xi[i])-g[i,j].diff(xi[n])) return gm def R(i,j,k,l): rm = Gamma(i,l,j).diff(xi[k]) - Gamma(i,k,j).diff(xi[l]) for n in range(D): rm = rm + Gamma(n,l,j)*Gamma(i,k,n) - Gamma(n,k,j)*Gamma(i,l,n) return rm def Ricc(j,k): ric = 0 for n in range(D): ric = ric + R(n,j,n,k) return ric RiccMat = sp.Matrix([ [Ricc(0,0), Ricc(0,1), Ricc(0,2), Ricc(0,3)], [Ricc(1,0), Ricc(1,1), Ricc(1,2), Ricc(1,3)], [Ricc(2,0), Ricc(2,1), Ricc(2,2), Ricc(2,3)], [Ricc(3,0), Ricc(3,1), Ricc(3,2), Ricc(3,3)] ]) R = sp.simplify((ginv*RiccMat).trace()) GMat = sp.simplify(RiccMat - sp.Rational(1,2)*g*R) EMat = sp.simplify(GMat + Lambda*g) EMat
より、確かにアインシュタイン方程式の解になっていることがわかります。
電磁場テンソル
ここでは電磁場がゲージポテンシャルから得られることやベクトル解析の知識は既知としています。詳しく知りたい方は、例えば次のような電磁気学の教科書を参照してください。
ひとまず直交座標系 で考えることにします。電磁場 はゲージポテンシャル (ただし )から次のようにして計算されます:
を行列のようにして表示すると
であり、電場と磁場が
で与えられることから
であることがわかります。実はこの量 はテンソル場で、曲がった座標系 に移るには変換則
を適用すればよいことが知られています。極座標系 をとった場合、具体的には
という関係から、この座標系での電磁場テンソルを求めることができます。例えば第2式の両辺を で偏微分して
です。同様にして
がわかります。さて、原点付近に局在する電荷 が遠方に作る電磁場は
で与えられます(クーロンの法則)。電場の各成分は
です。上で述べた変換則から、極座標系において
がわかります。少し紛らわしいですが、極座標系において電磁場テンソルはこのとき
となります。
電磁場のエネルギー・運動量テンソル
上で導入した電磁場テンソル を使うと、エネルギー・運動量テンソル が
で与えられます。ただし
です。これがどのような量であるかを見るために、平坦な時空の直交座標系での表式を求めてみましょう。このとき電磁場テンソルは
また、時空の計量は
です。以上の情報から
%reset import sympy as sp sp.var('Ex, Ey, Ez, Bx, By, Bz') F = sp.Matrix([ [0, -Ex, -Ey, -Ez], [Ex, 0, Bz, -By], [Ey, -Bz, 0, Bx], [Ez, By, -Bx, 0] ]) eta = sp.Matrix([ [-1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]) einv = eta.inv() Finv = einv*F*einv T = -sp.Rational(1,4)*((F*Finv).trace())*eta + F*einv*F T
より、エネルギー・運動量テンソル の各成分が以下のように求まります。
ただし
で、それぞれエネルギー密度、ポインティング・ベクトル、マクスウェルの応力テンソル
として知られている量です。
ライスナー=ノルドシュトロム解
ではいよいよ本題のライスナー=ノルドシュトロム解(以下RN解)に取り組みます。RN解は、電場に由来するエネルギー・運動量テンソル が存在する場合のアインシュタイン方程式
で与えられる場合について考えます。これまでの問題設定(Schwarzschild解、de Sitter-Schwarzschild解)と同様に、静的で球対称な場合であることに変わりはないので、計量の形として
を仮定します。ただし、これらの成分は座標系
に関するものです。このとき、アインシュタイン方程式のエネルギー・運動量テンソルの項を左辺に移項して
を計算してみましょう。
%reset import sympy as sp sp.var('t, r, theta, phi, psi, Lambda, Q') xi = sp.Matrix([ [t],[r],[theta],[phi] ]) D = len(xi) f = sp.Function('f')(r) g = sp.Matrix([ [-f, 0, 0, 0], [0, 1/f, 0, 0], [0, 0, r**2, 0], [0, 0, 0, r**2*sp.sin(theta)**2] ]) ginv = g.inv() def Gamma(k,i,j): gm = 0 for n in range(D): gm = gm + sp.Rational(1,2)*ginv[k,n]*(g[n,i].diff(xi[j])\ +g[n,j].diff(xi[i])-g[i,j].diff(xi[n])) return gm def R(i,j,k,l): rm = Gamma(i,l,j).diff(xi[k]) - Gamma(i,k,j).diff(xi[l]) for n in range(D): rm = rm + Gamma(n,l,j)*Gamma(i,k,n) - Gamma(n,k,j)*Gamma(i,l,n) return rm def Ricc(j,k): ric = 0 for n in range(D): ric = ric + R(n,j,n,k) return ric RiccMat = sp.Matrix([ [Ricc(0,0), Ricc(0,1), Ricc(0,2), Ricc(0,3)], [Ricc(1,0), Ricc(1,1), Ricc(1,2), Ricc(1,3)], [Ricc(2,0), Ricc(2,1), Ricc(2,2), Ricc(2,3)], [Ricc(3,0), Ricc(3,1), Ricc(3,2), Ricc(3,3)] ]) R = sp.simplify((ginv*RiccMat).trace()) GMat = sp.simplify(RiccMat - sp.Rational(1,2)*g*R) # 電磁場テンソル F = sp.Matrix([ [0, -Q/r**2, 0, 0], [Q/r**2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ]) Finv = ginv*F*ginv # エネルギー・運動量テンソル T = -sp.Rational(1,4)*((F*Finv).trace())*g + F*ginv*F EMat = sp.simplify(GMat + Lambda*g + 2*T) EMat
より、未知関数 について、以下が満たされれば解になることがわかります。
ここで第2式は第1式を仮定すると自然に満たされるので、第1式だけ考えればよいことになります。よって1階の常微分方程式
を得ます。微分方程式の解の関数形として
を考えてみましょう。
%reset import sympy as sp sp.var('r, Lambda, Q, a, b, c') f = 1 - a/r - b*r**2 - c/(r**2) sp.simplify( f.diff(r)-(1-f)/r+Lambda*r+Q**2/(r**3) )
より
がわかります。よって を定数として
によって定まる計量はアインシュタイン方程式の解であり、これがRN解です。
キーワード:Python、SymPy、Riemann幾何、一般相対論、RN解