使用熵执行宇宙学计算


介绍

此页面是Astropy的"宇宙计算"页面的日语翻译,但是我在某些地方添加了一些安排。
我们将向您展示如何使用Astropy模块执行宇宙学计算。

安装

由于它已在PyPI上注册,因此

1
pip install astropy

如果已安装Anaconda,请使用

安装

1
conda install -c astropy sphinx-astropy

您可以使用

进行安装(对于Anaconda,可能已经安装了)。

第一次天体宇宙学

哈勃常数

通过执行以下操作,可以找到从WMAP9yr估计的redshift z = 0处的哈勃常数。

1
2
3
>>> from astropy.cosmology import WMAP9
>>> WMAP9.H(0)
<Quantity 69.32 km / (Mpc s)>

正确的长度

z = 3时1毫秒angular的适当长度以kpc单位计算。

1
2
>>> WMAP9.kpc_proper_per_arcmin(3)
<Quantity 472.97709236 kpc / arcmin>

移动距离

通过传递诸如

列表的序列,您可以立即找到移动距离。以下内容可找到直到z = 0、1,...,9的共移动距离。

1
2
3
4
>>> WMAP9.comoving_distance(range(10))
<Quantity [   0.        , 3363.0706321 , 5291.73040581, 6503.90188771,
           7344.44470431, 7968.80246409, 8455.45279875, 8848.30522052,
           9173.9669946 , 9449.58596714] Mpc>

Flat Lambda CDM模型和中微子物种的有效数量

您可以找到平面Λ-CDM模型中的中微子物种的有效数量。在此,指定哈勃常数H0,物质的密度参数Om0和CMB温度Tcmb0。

1
2
3
4
>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3, Tcmb0=2.725)
>>> cosmo.Neff
3.04

另外,如果此时打印cosmo变量,则

1
2
>>> print cosmo
FlatLambdaCDM(H0=70 km / (Mpc s), Om0=0.3, Tcmb0=2.725 K, Neff=3.04, m_nu=[0. 0. 0.] eV, Ob0=None)

您可以看到它是一个名为

的对象。

.unit方法

1
2
3
4
>>> from astropy.cosmology import WMAP9
>>> H0 = WMAP9.H(0)
>>> H0.value, H0.unit
(69.32, Unit("km / (Mpc s)"))

使用

,可以以WMAP 9yr及其单位显示哈勃常数的值。

让我们使用astropy.cosmology

导入astropy.units为u

1
2
3
>>> from astropy.cosmology import FlatLambdaCDM
>>> import astropy.units as u
>>> cosmo = FlatLambdaCDM(H0=70 * u.km / u.s / u.Mpc, Tcmb0=2.725 * u.K, Om0=0.3)

astropy.cosmology文档建议如上所述指定单位,例如

u.km, u.s, u.Mpc, u.K

光度距离

发光距离可以如下计算。以下是到z = 4的距离。

1
2
>>> cosmo.luminosity_distance(4)
<Quantity 35842.353288 Mpc>

宇宙时代

您可以找到宇宙的年龄,如下所示。以下是在z = 0处找到宇宙年龄的示例。

1
2
>>> cosmo.age(0)
<Quantity 13.46170148 Gyr>

也可以通过传递类似于列表的序列并使用.value方法来获得列表形式的宇宙年龄,如下所示。

1
2
3
>>> cosmo.age(range(10)).value
array([13.46170148,  5.74698037,  3.22268178,  2.10909267,  1.51293349,
        1.15196553,  0.91440079,  0.74841291,  0.62710773,  0.53530494])

FLRW

FLRW类描述了均匀的各向同性宇宙学(Friedmann-Lemaitre-Robertson-Walker宇宙学)。例如,可以计算FlatLambdaCDM,LambdaCDM,wCDM等。

根据WMAP 7yr观测值

计算宇宙学参数

astropy.cosmology具有各种宇宙学参数。以下是从WMAP 7yr结果计算z = 0时的临界密度的方法。

1
2
3
>>> from astropy.cosmology import WMAP7
>>> WMAP7.critical_density(0)
<Quantity 9.30966846e-30 g / cm3>

下面,计算材料密度参数和暗能量密度参数。

1
2
>>> WMAP7.Om([0, 1, 2])
array([0.272     , 0.74898523, 0.90905237])
1
2
>>> WMAP7.Ode([0, 1, 2])
array([0.72791572, 0.25055061, 0.0901026 ])

WMAP 7yr考虑了光子和中微子,因此将它们加在一起不会得到1。

重子密度计

如下所示,也可以将重子密度参数Ob0设置为z = 0。

1
2
3
>>> from astropy.cosmology import FlatLambdaCDM
>>> FlatLambdaCDM(H0=70, Om0=0.3, Ob0=0.05)
FlatLambdaCDM(H0=70 km / (Mpc s), Om0=0.3, Tcmb0=0 K, Neff=3.04, m_nu=None, Ob0=0.05)

在这种情况下,我们只能从此类获得z = 0处的暗物质密度参数。如果要查看每个红移的变化,则需要使用暗物质密度参数Odm和重子密度参数Ob。如果未指定z = 0时的重子密度参数Ob0,则Odm函数将返回ValueError,如下所示:

1
2
3
4
5
6
7
8
>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3)
>>> cosmo.Odm(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda3/lib/python3.7/site-packages/astropy/cosmology/core.py", line 574, in Odm
    raise ValueError("Baryonic density not set for this cosmology, "
ValueError: Baryonic density not set for this cosmology, unclear meaning of dark matter density

名称变量

宇宙学实例具有一个名称变量,您可以在其中编写宇宙学模型。

1
2
3
4
>>> from astropy.cosmology import FlatwCDM
>>> cosmo = FlatwCDM(name='SNLS3+WMAP7', H0=71.58, Om0=0.262, w0=-1.016)
>>> cosmo
FlatwCDM(name="SNLS3+WMAP7", H0=71.6 km / (Mpc s), Om0=0.262, w0=-1.02, Tcmb0=0 K, Neff=3.04, m_nu=None, Ob0=None)

支持暗能量模型

上方name变量部分中介绍的脚本是暗能量模型计算的示例。还支持其他不同的暗能量模型。有关详细信息,请参见指定暗能量模型。

宇宙学参数更改

宇宙学参数是不可变的(变量)。例如,假设您只想更改WMAP 9yr结果中z = 0处的材料密度参数Om0。在这种情况下,使用clone方法创建新实例很方便。尝试

1
2
>>> from astropy.cosmology import WMAP9
>>> newcosmo = WMAP9.clone(name='WMAP9 modified', Om0=0.3141)

让我们以

的形式创建一个newcosmo实例,并检查原始WMAP9和newcosmo中的Hubble参数,材料密度参数和暗能量密度参数。

1
2
3
4
5
6
7
8
9
10
11
12
>>> WMAP9.H0
<Quantity 69.32 km / (Mpc s)>
>>> newcosmo.H0
<Quantity 69.32 km / (Mpc s)>
>>> WMAP9.Om0
0.2865
>>> newcosmo.Om0
0.3141
>>> WMAP9.Ode0
0.7134130719051658
>>> newcosmo.Ode0
0.6858130719051657

z_at_value

通过使用宇宙模型的.age方法并将年龄作为

z_at_value中的参数,您可以计算该年龄的红移。以下示例在将Planck 2013指定为宇宙学模型时计算2 Gyr宇宙的红移。

1
2
3
>>> from astropy.cosmology import Planck13, z_at_value
>>> z_at_value(Planck13.age, 2*u.Gyr)
3.198120965652982

尝试显示Planck13.age。

1
2
>>> Planck13.age
<bound method FLRW.age of FlatLambdaCDM(name="Planck13", H0=67.8 km / (Mpc s), Om0=0.307, Tcmb0=2.725 K, Neff=3.05, m_nu=[0.   0.   0.06] eV, Ob0=0.0483)>

宇宙模型已纳入

内置在

astropy.cosmology中的宇宙模型可以在cosmology.parameters.available找到。它们总结在下表中。

<表格>

名称

来源

H0

Om

Flat


<身体>

WMAP5

小松等,2009

70.2

0.277


WMAP7

小松等,2011

70.4

0.272


WMAP9

Hinshaw et al。2013

69.3

0.287


Planck13

Planck Collab 2013,论文XVI

67.8

0.307


Planck15

Planck Collab 2015,Papaer XIII

67.7

0.307




模型的详细信息可以在.__doc__中找到。

1
2
3
>>> from astropy.cosmology import WMAP7
>>> WMAP7.__doc__
'WMAP7 instance of FlatLambdaCDM cosmology\n\n(from Komatsu et al. 2011, ApJS, 192, 18, doi: 10.1088/0067-0049/192/2/18. Table 1 (WMAP + BAO + H0 ML).)'

暗能量模型

参见

链接

光子和中微子

宇宙学类可以计算光子的能量密度和中微子的能量密度。默认假设为无质量。

这些计算可以通过将CMB温度T_cmb0设置为

z = 0,有效中微子数量Neff和各种中微子质量m_nu来执行。

以下是通过WMAP 7yr获得的在z = 0时的光子密度参数Ogamma0和中微子密度参数Onu0

1
2
3
4
5
>>> from astropy.cosmology import WMAP7
>>> WMAP7.Ogamma0
4.985868989189756e-05
>>> WMAP7.Onu0
3.442275090310745e-05

通过将序列传递给

OgammaOnu,还可以一次获得多个红移中的光子密度参数和中微子密度参数。

1
2
3
4
5
6
7
>>> WMAP7.Ogamma(range(10))
array([4.98586899e-05, 2.74583989e-04, 4.99898824e-04, 7.02950869e-04,
       8.95950291e-04, 1.08437305e-03, 1.27046001e-03, 1.45521852e-03,
       1.63914762e-03, 1.82251551e-03])
>>> z = [0, 1, 2]
>>> WMAP7.Onu(z)
array([3.44227509e-05, 1.89574501e-04, 3.45133270e-04])

如果要从宇宙学模型中排除光子和中微子,可以使用Tcmb0=0进行。

1
2
3
4
5
6
7
>>> from astropy.cosmology import FlatLambdaCDM
>>> import astropy.units as u
>>> cos = FlatLambdaCDM(70.4*u.km/u.s/u.Mpc, 0.272, Tcmb0=0.0*u.K)
>>> cos.Ogamma0
0.0
>>> cos.Onu0
0.0

如果要构建仅忽略中微子的模型,请使用Neff=0

1
2
3
4
5
6
>>> cos = FlatLambdaCDM(70.4, 0.272, Tcmb0=2.725, Neff=0)
>>> z = [0, 1, 2]
>>> cos.Ogamma(z)
array([4.98586899e-05, 2.74632798e-04, 5.00069284e-04])
>>> cos.Onu(z)
array([0., 0., 0.])

假设

Neff中的有效中微子数,有必要将每个中微子质量作为输入。如果仅设置一个值,则所有类型的中微子质量都将是相同的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> from astropy.cosmology import FlatLambdaCDM
>>> import astropy.units as u
>>> H0 = 70.4 * u.km / u.s / u.Mpc
>>> m_nu = 0 * u.eV
>>> cos = FlatLambdaCDM(H0, 0.272, Tcmb0=2.725, m_nu=m_nu)
>>> cos.has_massive_nu
False
>>> cos.m_nu
<Quantity [0., 0., 0.] eV>
>>> m_nu = [0.0, 0.05, 0.1] * u.eV
>>> cos = FlatLambdaCDM(H0, 0.272, Tcmb0=2.725, m_nu=m_nu)
>>> cos.has_massive_nu
True
>>> cos.m_nu
<Quantity [0.  , 0.05, 0.1 ] eV>
>>> z = [0, 1, 15]
>>> cos.Onu(z)
array([0.00327   , 0.00896814, 0.01257904])
>>> cos.Onu(1) * cos.critical_density(1)
<Quantity 2.44437837e-31 g / cm3>

并非全部,但本文到此结束。