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)$ の立ち上がりを揃えたグラフの例

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

$\Omega_{\Lambda} = 0, \Omega_{\rm m} > 1$ すなわち $k > 0$ の場合

$\Omega_{\rm m} \rightarrow \Omega$ として

\begin{eqnarray}
a_1(u, \Omega) = \frac{a}{a_0}
&=& \frac{\Omega}{2 (\Omega -1)}
\left(1 -\cos\left(\sqrt{\Omega-1} u\right)\right)\\
t_1(u, \Omega) = H_0 t &=& \frac{\Omega}{2 (\Omega -1) }
\left(u -\frac{\sin\left(\sqrt{\Omega-1} u\right)}{\sqrt{\Omega-1}}\right)
\end{eqnarray}

となりそうだが,$|u| \ll 1$ での振るまいが後述の $\Omega_{\rm m} = 1$ の場合のように($\Omega$ の値によらずに)

\begin{eqnarray}
a_1 &\simeq& \frac{u^2}{4} \\
t_1 &\simeq& \frac{u^3}{12}
\end{eqnarray}

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

\begin{eqnarray}
a_1(u, \Omega) \equiv \frac{a}{a_0} \times \Omega^{-1}
&=& \frac{1}{2 (\Omega -1)}
\left(1 -\cos\left(\sqrt{\Omega-1} u\right)\right)\\
t_1(u, \Omega) \equiv H_0 t \times \Omega^{-1}&=& \frac{1}{2 (\Omega -1) }
\left(u -\frac{\sin\left(\sqrt{\Omega-1} u\right)}{\sqrt{\Omega-1}}\right)
\end{eqnarray}

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))

$\Omega_{\Lambda} = 0, \Omega_{\rm m} < 1$ すなわち $k < 0$ の場合

同様に

\begin{eqnarray}
a_2(u, \Omega) \equiv \frac{a}{a_0}\times \Omega^{-1}
&=& \frac{1}{2 (1-\Omega)}
\left(\cosh\left(\sqrt{1-\Omega} u\right) -1\right)
\\
t_2(u, \Omega) \equiv H_0 t \times \Omega^{-1}&=& \frac{1}{2 (1 -\Omega) }
\left(\frac{\sinh\left(\sqrt{1-\Omega} u\right)}{\sqrt{1-\Omega}}- u\right)
\end{eqnarray}

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)

$\Omega_{\Lambda} = 0, \Omega_{\rm m} = 1$ すなわち $k = 0$ の場合

\begin{eqnarray}
a_3(u) \equiv \lim_{\Omega\rightarrow 1} a_1(u, \Omega) &=& \frac{u^2}{4} \\
t_3(u) \equiv \lim_{\Omega\rightarrow 1} t_1(u, \Omega) &=& \frac{u^3}{12}
\end{eqnarray}

In [5]:
Eq(Limit('a1(u, Omega)', Omega, 1), 
   limit(a1(u, Omega), Omega, 1))
Out[5]:
$\displaystyle \lim_{\Omega \to 1^+} a_{1}{\left(u,\Omega \right)} = \frac{u^{2}}{4}$
In [6]:
Eq(Limit('t1(u, Omega)', Omega, 1), 
   limit(t1(u, Omega), Omega, 1))
Out[6]:
$\displaystyle \lim_{\Omega \to 1^+} t_{1}{\left(u,\Omega \right)} = \frac{u^{3}}{12}$
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 = t_0$ で $a(t_0)$ と $H_0 = \frac{\dot{a}}{a}|_{t_0}$ を揃えたグラフの例

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

$\Omega_{\Lambda} = 0, \Omega_{\rm m} > 1$ すなわち $k > 0$ の場合

\begin{eqnarray}
\frac{a}{a_0} \equiv x
&=& \frac{\Omega_{\rm m}}{2 (\Omega_{\rm m} -1)}
\left(1 -\cos\left(\sqrt{k} \eta\right)\right)
\\
H_0 t &=& \frac{\Omega_{\rm m}}{2 (\Omega_{\rm m} -1)^{\frac{3}{2}} }
\left(\sqrt{k} \eta -\sin\left(\sqrt{k} \eta\right)\right)
\end{eqnarray}

これから
\begin{eqnarray}
\cos\sqrt{k} \eta &=& 1 – \frac{2 (\Omega_{\rm m} -1)}{\Omega_{\rm m}}x\\
\sqrt{k} \eta &=& \cos^{-1} \left(1 – \frac{2 (\Omega_{\rm m} -1)}{\Omega_{\rm m}}x \right)
\end{eqnarray}

$\Omega_{\rm m} \rightarrow \Omega$ として

\begin{eqnarray}
\therefore\ \ T_1(x, \Omega) &\equiv& H_0 t = \frac{\Omega}{2 (\Omega -1)^{\frac{3}{2}} }
\left(\sqrt{k} \eta -\sin \sqrt{k} \eta \right) \\
&=& \frac{\Omega}{2 (\Omega -1)^{\frac{3}{2}} }
\left(\cos^{-1} \left(1 – \frac{2 (\Omega -1)}{\Omega} x \right)
– \sqrt{1 – \left(1 – \frac{2 (\Omega -1)}{\Omega} x \right)^2} \right)
\end{eqnarray}

として,$H_0 t$ を $x$ で表す。

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)))

$\Omega_{\Lambda} = 0, \Omega_{\rm m} < 1$ すなわち $k < 0$ の場合

\begin{eqnarray}
\frac{a}{a_0} \equiv x
&=&\frac{\Omega_{\rm m}}{2 (1-\Omega_{\rm m} )}
\left(\cosh \sqrt{k} \eta -1\right)a
\end{eqnarray}

これから
\begin{eqnarray}
\cosh\sqrt{k} \eta &=& 1 + \frac{2 (1-\Omega_{\rm m})}{\Omega_{\rm m}}x \\
\sqrt{k} \eta &=& \cosh^{-1} \left(1 + \frac{2 (1-\Omega_{\rm m})}{\Omega_{\rm m}}x\right)
\end{eqnarray}

$\Omega_{\rm m} \rightarrow \Omega$ として

\begin{eqnarray}
\therefore\ \
T_2(x, \Omega) &\equiv& H_0 t = \frac{\Omega}{2 (1-\Omega)^{\frac{3}{2}} }
\left(\sinh \sqrt{k} \eta – \sqrt{k} \eta \right) \\
&=& \frac{\Omega}{2 (1-\Omega)^{\frac{3}{2}} }
\left(
\sqrt{\left(1 + \frac{2 (1-\Omega)}{\Omega}x \right)^2 – 1} –
\cosh^{-1} \left(1 + \frac{2 (1-\Omega)}{\Omega}x\right) \right)
\end{eqnarray}

として,$H_0 t$ を $x$ で表す。

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)))

$\Omega_{\Lambda} = 0, \Omega_{\rm m} = 1$ すなわち $k = 0$ の場合

\begin{eqnarray}
\frac{a}{a_0} = x &=& \left(\frac{3}{2}H_0 t \right)^{\frac{2}{3}}
\end{eqnarray}$$\therefore\ \ T_3(x) \equiv H_0 t = \frac{2}{3} x^{\frac{3}{2}}$$

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, \ \Omega_{\Lambda} > 0$ の場合の追加

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

\begin{eqnarray}
\frac{a}{a_0} = x &=&
\left\{\sqrt{\frac{\Omega_{\rm m}}{1-\Omega_{\rm m}}}
\sinh\left(\frac{3\sqrt{1-\Omega_{\rm m}}}{2} H_0 t\right)\right\}^{\frac{2}{3}} \end{eqnarray}

より $\Omega_{\rm m} \rightarrow \Omega$ として

$$T_4(x, \Omega) \equiv H_0 t = \frac{2}{3\sqrt{1-\Omega}}
\sinh^{-1} \left( \sqrt{\frac{1-\Omega}{\Omega}} x^{\frac{3}{2}}\right)$$

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 = t_0$ で $a(t_0)$ と $H_0 = \frac{\dot{a}}{a}|_{t_0}$ を揃えたグラフの例

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");