\usepackagecancel

Return to 宇宙論パラメータと宇宙年齢

補足:SymPy と SPB でスケール因子のグラフを描く

導出については,以下のページ:

必要なモジュールの import

In [1]:
from sympy import *
# 1文字変数の Symbol の宣言が省略できる
from sympy.abc import *
# 円周率
from sympy import pi
# SymPy Plotting Backends (SPB)
from spb import *

# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']
In [2]:
# グラフを描くためではなくデフォルト設定のため
import matplotlib.pyplot as plt

config = {
    'axes.labelsize': 'x-large',
    'mathtext.fontset': 'cm'
}
plt.rcParams.update(config)

t=0 からの a(t) の立ち上がりを揃えたグラフの例

異なる Ωm の場合のスケール因子の時間変化のグラフを,t=0 でのスケール因子 a(t) の傾きを揃えて描く場合。同じようにビッグバンで始まった宇宙の膨張が,Ωm の値によってその後の膨張の仕方に違いがあらわれ,ある場合には途中で膨張が止まって収縮に転じたり,ある場合には永久に膨張が続いたりするんだなぁ… ということを理解するのに適切なグラフ。

ΩΛ=0,Ωm>1 すなわち k>0 の場合

ΩmΩ として

a1(u,Ω)=aa0=Ω2(Ω1)(1cos(Ω1u))t1(u,Ω)=H0t=Ω2(Ω1)(usin(Ω1u)Ω1)

となりそうだが,|u|1 での振るまいが後述の Ωm=1 の場合のように(Ω の値によらずに)

a1u24t1u312

となるためには,以下のように縦横等倍で縮尺を変えてやればよい。

a1(u,Ω)aa0×Ω1=12(Ω1)(1cos(Ω1u))t1(u,Ω)H0t×Ω1=12(Ω1)(usin(Ω1u)Ω1)

In [3]:
var('Omega')
def a1(u, Omega):
    return 1/(2*(Omega-1))*(1-cos(sqrt(Omega-1)*u))
def t1(u, Omega):
    return 1/(2*(Omega-1))*(u-sin(sqrt(Omega-1)*u)/sqrt(Omega-1))

ΩΛ=0,Ωm<1 すなわち k<0 の場合

同様に

a2(u,Ω)aa0×Ω1=12(1Ω)(cosh(1Ωu)1)t2(u,Ω)H0t×Ω1=12(1Ω)(sinh(1Ωu)1Ωu)

In [4]:
def a2(u, Omega):
    return 1/(2*(1-Omega))*(cosh(sqrt(1-Omega)*u)-1)
def t2(u, Omega):
    return 1/(2*(1-Omega))*(sinh(sqrt(1-Omega)*u)/sqrt(1-Omega)-u)

ΩΛ=0,Ωm=1 すなわち k=0 の場合

a3(u)limΩ1a1(u,Ω)=u24t3(u)limΩ1t1(u,Ω)=u312

In [5]:
Eq(Limit('a1(u, Omega)', Omega, 1), 
   limit(a1(u, Omega), Omega, 1))
Out[5]:
limΩ1+a1(u,Ω)=u24
In [6]:
Eq(Limit('t1(u, Omega)', Omega, 1), 
   limit(t1(u, Omega), Omega, 1))
Out[6]:
limΩ1+t1(u,Ω)=u312
In [7]:
def a3(u):
    return u**2/4
def t3(u):
    return u**3/12
In [8]:
Omega1 = 1.1
Omega2 = 0.9
# 0 <= u <= u1 まで 
u1 = 2*pi/sqrt(Omega1 -1)
trange = t1(u1, Omega1)*1.02

p = plot_parametric(
    (t2(u, Omega2), a2(u, Omega2), (u, 0, u1), {'color':'blue'}), 
    (t3(u        ), a3(u        ), (u, 0, u1), {'color':'black'}), 
    (t1(u, Omega1), a1(u, Omega1), (u, 0, u1), {'color':'red'}), 
    xlim = (0, trange), ylim = (0, 42), 
    use_cm = False, legend = False, show=False)

ax = p.ax

# 座標軸の目盛を非表示に
ax.axes.xaxis.set_ticks([0]);
ax.axes.yaxis.set_ticks([0]);

# 数式フォント設定
ax.set_title(r"$\Omega_{\Lambda}=0$ の場合のスケール因子の時間発展")
ax.set_xlabel(r"$t$")
ax.set_ylabel(r"$a(t)$")

# 曲線の近くにラベルと数式フォント設定
ax.text(60, 38, r"$\Omega_{\rm{m}} < 1\ \ (k < 0)$", 
        {'color':'blue', 'size':'x-large'})
ax.text(60, 18, r"$\Omega_{\rm{m}} = 1\ \ (k = 0)$", 
        {'color':'black', 'size':'x-large'})
ax.text(60, 10.5, r"$\Omega_{\rm{m}} > 1\ \ (k > 0)$", 
        {'color':'red', 'size':'x-large'});

t=t0a(t0)H0=a˙a|t0 を揃えたグラフの例

異なる Ωm の場合のスケール因子の時間変化のグラフを,現在時刻 t=t0 でのスケール因子 a(t) の傾きを揃えて描く場合。現在時刻でのスケール因子の傾きを表すハッブル定数 H0 の値が同じでも,時間を遡るとやがて a(t) がゼロになる時刻すなわち宇宙年齢が異なるのだなぁ… ということを理解するのに便利なグラフ。

ΩΛ=0,Ωm>1 すなわち k>0 の場合

aa0x=Ωm2(Ωm1)(1cos(kη))H0t=Ωm2(Ωm1)32(kηsin(kη))

これから
coskη=12(Ωm1)Ωmxkη=cos1(12(Ωm1)Ωmx)

ΩmΩ として

  T1(x,Ω)H0t=Ω2(Ω1)32(kηsinkη)=Ω2(Ω1)32(cos1(12(Ω1)Ωx)1(12(Ω1)Ωx)2)

として,H0tx で表す。

In [9]:
def T1(x, Omega):
    return (Omega/(2*(Omega-1)*sqrt(Omega-1)) * 
            (acos(1 - 2*(Omega-1)/Omega * x) 
             - sqrt(1-(1-2*(Omega-1)/Omega * x)**2)))

ΩΛ=0,Ωm<1 すなわち k<0 の場合

aa0x=Ωm2(1Ωm)(coshkη1)a

これから
coshkη=1+2(1Ωm)Ωmxkη=cosh1(1+2(1Ωm)Ωmx)

ΩmΩ として

  T2(x,Ω)H0t=Ω2(1Ω)32(sinhkηkη)=Ω2(1Ω)32((1+2(1Ω)Ωx)21cosh1(1+2(1Ω)Ωx))

として,H0tx で表す。

In [10]:
def T2(x, Omega):
    return (Omega/(2*(1-Omega)*sqrt(1-Omega)) * 
            (sqrt((1+2*(1-Omega)/Omega * x)**2 -1) 
             -acosh(1 + 2*(1-Omega)/Omega * x)))

ΩΛ=0,Ωm=1 すなわち k=0 の場合

aa0=x=(32H0t)23  T3(x)H0t=23x32

In [11]:
def T3(x):
    return 2/3 * x*sqrt(x)
In [12]:
Omega1 = 2
Omega2 = 0.1

p=plot_parametric(
    (T2(x, Omega2)-T2(1, Omega2), x, (x, 0, 3), 
     r"$\Omega_{\rm m} < 1\ \ (k < 0)$", {'color':'blue'}), 
    (T3(x        )-T3(1        ), x, (x, 0, 3), 
     r"$\Omega_{\rm m} = 1\ \ (k = 0)$", {'color':'black'}), 
    (T1(x, Omega1)-T1(1, Omega1), x, (x, 0, 3), 
     r"$\Omega_{\rm m} > 1\ \ (k > 0)$", {'color':'red'}), 
    xlim = (-1, 1.6), ylim = (0, 3), 
    use_cm = False, legend = True, show=False)

ax = p.ax
# グリッドを dotted で
ax.grid(which="major", linestyle = 'dotted')

# 数式フォント設定
ax.set_title(r"$\Omega_{\Lambda}=0$ の場合のスケール因子の時間発展")
ax.set_xlabel(r"$H_0 (t -t_0)$")
ax.set_ylabel(r"$a(t)/a_0$")
ax.legend(prop={"size":"large"})

# 現在 t=t0 
ax.axhline(1, color='black', dashes=(3, 3), linewidth=0.6)
ax.axvline(0, color='black', dashes=(3, 3), linewidth=0.6)

# 副目盛も表示
ax.minorticks_on()
# 副目盛には grid をつけない
ax.grid(False, which="minor");

k=0, ΩΛ>0 の場合の追加

宇宙定数がある場合のスケール因子の時間変化についても追加しておく。

aa0=x={Ωm1Ωmsinh(31Ωm2H0t)}23

より ΩmΩ として

T4(x,Ω)H0t=231Ωsinh1(1ΩΩx32)

In [13]:
def T4(x, Omega):
    return 2/(3*sqrt(1-Omega)) * asinh(sqrt((1-Omega)/Omega) * x*sqrt(x))

また,t=0 からの a(t) の立ち上がりを揃えたグラフにするには,以下のように定義すればよいであろう。

In [14]:
def a4(u, Omega):
    return (sqrt(1/(1-Omega))*sinh(3*sqrt(1-Omega)*u**3/12/2))**(2/3)
def t4(u, Omega):
    return u**3/12

t=0 からの a(t) の立ち上がりを揃えたグラフの例

In [15]:
Omega1 = 1.1
Omega2 = 0.7
# 0 <= u <= u1 まで 
u1 = 2*pi/sqrt(Omega1 -1)
trange = t1(u1, Omega1)*1.1

p = plot_parametric(
    (t4(u, 0.999), a4(u, 0.999), (u, 0, u1), {'color':'purple'}), 
    (t2(u, Omega2), a2(u, Omega2), (u, 0, u1), {'color':'blue'}), 
    (t3(u        ), a3(u        ), (u, 0, u1), {'color':'black'}), 
    (t1(u, Omega1), a1(u, Omega1), (u, 0, u1), {'color':'red'}), 
    xlim = (0, trange),  ylim = (0, 120), 
    use_cm = False, legend = False, show=False)

ax = p.ax

# 座標軸の目盛を非表示に
ax.axes.xaxis.set_ticks([0]);
ax.axes.yaxis.set_ticks([0]);

# 数式フォント設定
ax.set_title(r"スケール因子の時間発展")
ax.set_xlabel(r"$t$")
ax.set_ylabel(r"$a(t)$")

# 曲線の近くにラベルと数式フォント設定
ax.text(80, 75, r"$k=0, \Omega_{\Lambda} >0$", 
        {'color':'purple', 'size':'large'})
ax.text(80, 62, r"$k<0, \Omega_{\Lambda} =0$", 
        {'color':'blue', 'size':'large'})
ax.text(80, 30, r"$k=0, \Omega_{\Lambda} =0$", 
        {'color':'black', 'size':'large'})
ax.text(80, 9, r"$k>0, \Omega_{\Lambda} =0$", 
        {'color':'red', 'size':'large'});

t=t0a(t0)H0=a˙a|t0 を揃えたグラフの例

In [16]:
Omega1 = 2
Omega2 = 0.3

p=plot_parametric(
    (T4(x, Omega2)-T4(1, Omega2), x, (x, 0, 4), 
     r"$\Omega_{\rm m} =%.1f, \ \Omega_{\Lambda} =%.1f$" % (Omega2, 1-Omega2), 
     {'color':'purple'}), 
    (T2(x, Omega2)-T2(1, Omega2), x, (x, 0, 3), 
     r"$\Omega_{\rm m} =%.1f, \ \Omega_{\Lambda} =%.1f$" % (Omega2, 0), 
     {'color':'blue'}), 
    (T3(x        )-T3(1        ), x, (x, 0, 3), 
     r"$\Omega_{\rm m} =%.1f, \ \Omega_{\Lambda} =%.1f$" % (1, 0), 
     {'color':'black'}), 
    (T1(x, Omega1)-T1(1, Omega1), x, (x, 0, 2), 
     r"$\Omega_{\rm m} =%.1f, \ \Omega_{\Lambda} =%.1f$" % (Omega1, 0), 
     {'color':'red'}), 
    xlim = (-1, 1.6), ylim = (0, 4), 
    use_cm = False, legend = True, show=False)

ax = p.ax
# グリッドを dotted で
ax.grid(which="major", linestyle = 'dotted')

# 現在 t=t0 
ax.axhline(1, color='black', dashes=(3, 3), linewidth=0.6)
ax.axvline(0, color='black', dashes=(3, 3), linewidth=0.6)

# 数式フォント設定
ax.set_title("スケール因子の時間発展")
ax.set_xlabel(r"$H_0 (t - t_0)$")
ax.set_ylabel(r"$a(t)/a_0$")
ax.legend(prop={"size": "large"})

# 副目盛も表示
ax.minorticks_on()
# 副目盛には grid をつけない
ax.grid(False, which="minor");