\usepackagecancel

Return to EinsteinPy や ctensor でアインシュタイン方程式を計算する

EinsteinPy と SymPy でアインシュタイン方程式を解いてシュバルツシルト解を求める

EinsteinPy を使って球対称な計量から真空のアインシュタイン方程式

G  νμ=0

を解き,シュバルツシルト解を求める。

 

ライブラリの import

In [1]:
from sympy.abc import *
from sympy import *
from einsteinpy.symbolic import *
init_printing()

球対称な計量

ランダウ・リフシッツ「場の古典論」の記述にそって(しかし,signature は (,+,+,+) にして),球対称な計量を以下のようにおく。(ギリシャ文字の λlambda ではなく,sympy.abc の中で lamda として定義されている。lambda は Python の予約語,変数として使用不可。)

ds2=eν(t,r)dt2+eλ(t,r)dr2+r2(dθ2+sin2θdϕ2)

In [2]:
# from sympy.abc import * すると使える
lamda
Out[2]:
λ
In [3]:
lamda = Function('lamda')(t, r)
nu = Function('nu')(t, r)

Metric = diag(-exp(nu), exp(lamda), r**2, r**2 * sin(theta)**2).tolist()
g = MetricTensor(Metric, [t, r, theta, phi])
g.tensor()
Out[3]:
[eν(t,r)0000eλ(t,r)0000r20000r2sin2(θ)]

アインシュタイン・テンソル

G  νμ=R  νμ12Rδ  νμ = ein とおく。(.change_config('ul') で上付下付に)

In [4]:
ein=EinsteinTensor.from_metric(g).change_config('ul')

λ は時間に依存しないこと

G  01

In [5]:
ein[1,0]
Out[5]:
eλ(t,r)tλ(t,r)r

G  01=0 より

λt=0,  λ(t,r)λ(r)

λ(r) として,あらためてアインシュタイン・テンソルを求めてみる。

In [6]:
lamda = Function('lamda')(r)
nu = Function('nu')(t, r)

Metric = diag(-exp(nu), exp(lamda), r**2, r**2 * sin(theta)**2).tolist()
g = MetricTensor(Metric, [t, r, theta, phi])
g.tensor()
Out[6]:
[eν(t,r)0000eλ(r)0000r20000r2sin2(θ)]
In [7]:
ein=EinsteinTensor.from_metric(g).change_config('ul')

G  00

In [8]:
ein[0,0]
Out[8]:
(rddrλ(r)eλ(r)+1)eλ(r)r2

G  11

In [9]:
ein[1,1]
Out[9]:
(rrν(t,r)eλ(r)+1)eλ(r)r2

G  22

In [10]:
ein[2,2]
Out[10]:
(rddrλ(r)rν(t,r)+r(rν(t,r))2+2r2r2ν(t,r)2ddrλ(r)+2rν(t,r))eλ(r)4r

G  33

In [11]:
ein[3,3]
Out[11]:
(rddrλ(r)rν(t,r)+r(rν(t,r))2+2r2r2ν(t,r)2ddrλ(r)+2rν(t,r))eλ(r)4r

G  22=G  33 であることを確認。G  22G  33 がゼロとなることを示す。

In [12]:
ein[2,2] - ein[3,3]
Out[12]:
0

ν=λ とおけること

In [13]:
simplify(ein[1,1]-ein[0,0])
Out[13]:
(ddrλ(r)+rν(t,r))eλ(r)r

G  11G  22=0 より,以下の式が得られる。

r(λ(r)+ν(t,r))=0

これから,

ν(t,r)=λ(r)+f(t)

となる。

  eν(t,r)dt2=eλ(r)+f(t)dt2=eλ(r)(ef(t)2dt)2

時間 t のみの任意関数 f(t) の自由度は,ef(t)2dtdt なる新しい時間座標の定義によって吸収できるので,一般性を失うことなく f(t)=0 すなわち

ν(t,r)λ(r)

とすることができる。

バーコフの定理

ここまでは,球対称真空解は metric が時間によらない,つまり静的であるということを示しているわけで,バーコフの定理の証明になっている。バーコフの定理のもう一つの帰結である漸近的平坦性については,以下で示すように解が eμ(r)=1rgr となることで reμ(r)1 となることからわかる。

ということで,あらためて以下のような計量テンソルに対して,アインシュタイン・テンソルを計算してみる。

In [14]:
lamda = Function('lamda')(r)

Metric = diag(-exp(-lamda), exp(lamda), r**2, r**2 * sin(theta)**2).tolist()
g = MetricTensor(Metric, [t, r, theta, phi])
g.tensor()
Out[14]:
[eλ(r)0000eλ(r)0000r20000r2sin2(θ)]
In [15]:
ein=EinsteinTensor.from_metric(g).change_config('ul')
In [16]:
ein[0,0]
Out[16]:
(rddrλ(r)eλ(r)+1)eλ(r)r2
In [17]:
eq = (ein[0,0] * r**2).expand()
eq 
Out[17]:
reλ(r)ddrλ(r)1+eλ(r)

微分方程式を解き,λ(r) を求める

微分方程式 rddrλ(r)eλ(r)+1=0 を SymPy の dsolve() を使って解く。

In [18]:
sol = dsolve(eq, lamda)
sol
Out[18]:
λ(r)+log(r)+log(eλ(r)1)=C1

もうちょっとのところなので,

eλf,λlogf

とおいて(.subs(lamda, -log(f)))解いてもらう。

In [19]:
print('元の式は')
display(sol)

print('f(r) で書き直すと,解くべき方程式は')
f = Function('f')(r)
eq2 = sol.subs(lamda, -log(f))
display(eq2)

print('f(r) について解いた解は')
sol2 = solve(eq2, f)
sol2
元の式は
λ(r)+log(r)+log(eλ(r)1)=C1
f(r) で書き直すと,解くべき方程式は
log(r)+log(1+1f(r))+log(f(r))=C1
f(r) について解いた解は
Out[19]:
[reC1r]
In [20]:
sol2[0].expand()
Out[20]:
1eC1r

積分定数 C1 はニュートン近似のときに,

g00=eλ(r)(1+2ϕc2)=(12GMrc2)

となることから,

eC1=2GMc2rg

となる。

最終的に

ds2=(1rgr)dt2+dr21rgr+r2(dθ2+sin2θdϕ2)