宇宙学计算 (astropy.cosmology#

介绍#

这个 astropy.cosmology 子程序包包含用于表示宇宙学的类和用于计算依赖于宇宙学模型的常用量的实用函数。这包括对应于测量的红移或对应于测量的角度间隔的横向间隔的距离、年龄和回看时间。

通过使用WMAP和普朗克卫星数据的分析,可以得到一些预加载的宇宙学。看见 包含的宇宙学实现

astropy.cosmology.units 扩展了 astropy.units 子包,添加和收集宇宙单位和等价物,如 \(h\) 用于跟踪哈勃常数的(无量纲)因子。

有关从文件中读取和写入宇宙的详细信息,请参见 宇宙学I/O与转换

有关构建自定义宇宙学类和接口的说明 astropy.cosmology 对于第三方程序包,请参阅 开发人员的宇宙学

入门#

宇宙量的计算使用一种 Cosmology 对象。

实例#

计算z=0时的哈勃常数(即。, H0 )在z=3时对应于一个弧分的横向真千帕秒数(kpc):

>>> from astropy.cosmology import WMAP9 as cosmo
>>> cosmo.H(0)  
<Quantity 69.32 km / (Mpc s)>
>>> cosmo.kpc_proper_per_arcmin(3)  
<Quantity 472.97709620405266 kpc / arcmin>

这里 WMAP 9年 是一个内置的物体,用九年的WMAP结果中的参数描述了宇宙学。还提供了其他几种内置宇宙学(请参见 Built-in Cosmologies )。宇宙学对象的可用方法列在 FLRW 班级。

所有这些方法也接受任意形状的红移数组作为输入:

>>> import numpy as np
>>> from astropy.cosmology import WMAP9 as cosmo
>>> cosmo.comoving_distance(np.array([0.5, 1.0, 1.5]))  
<Quantity [1916.06941724, 3363.07062107, 4451.7475201 ] Mpc>

你可以使用其中一个宇宙学类来创建你自己的类似FLRW的宇宙学:

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

注意其他宇宙学参数的存在(例如。, Neff ,即有效中微子种类的数量);这些值也可以在对构造函数的调用中显式指定。

宇宙学子包利用 units ,因此在许多情况下,会返回附加了单位的值。有关更多详细信息,请参考该子程序包的文档,但这里我们将简要介绍如何访问浮点或数组值:

>>> from astropy.cosmology import WMAP9 as cosmo
>>> H0 = cosmo.H(0)
>>> H0.value, H0.unit  
(69.32, Unit("km / (Mpc s)"))

使用 astropy.cosmology#

有关使用该包的更多详细信息在单独的页面上提供,如下所示。

大多数功能是由 FLRW 对象。这代表了一个均匀和各向同性的宇宙学(以Friedmann-Lemaitre-Robertson-Walker度规为特征,以解决爱因斯坦场方程的人的名字命名)。但是,您不能直接使用此类,因为您必须使用其子类之一来指定暗能量模型,例如 FlatLambdaCDM

实例#

您可以创建一个新的 FlatLambdaCDM 带有给出哈勃参数和Omega物质(都在z=0处)的参数的对象::

>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3)
>>> print(cosmo)
FlatLambdaCDM(H0=70.0 km / (Mpc s), Om0=0.3, Tcmb0=0.0 K,
              Neff=3.04, m_nu=None, Ob0=None)

也可以使用单位更明确地执行此操作,建议:

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

中描述的预定义宇宙学 Getting Started 节是以下的实例 FlatLambdaCDM ,并具有相同的方法。因此,我们可以通过以下公式找到到红移4的光度距离:

>>> cosmo.luminosity_distance(4)  
<Quantity 35842.353618623194 Mpc>

或者宇宙在z=0时的年龄:

>>> cosmo.age(0)  
<Quantity 13.461701658024014 Gyr>

它们还接受红移数组:

>>> import astropy.cosmology.units as cu
>>> cosmo.age([0.5, 1, 1.5] * cu.redshift)  
<Quantity [8.42128013, 5.74698021, 4.19645373] Gyr>

请参阅 FLRWFlatLambdaCDM 所有可用方法和属性的对象文档字符串。

除了平面宇宙之外,还支持非平面类型,例如 LambdaCDM 。还提供了具有已定义参数的各种标准宇宙学(请参见 Built-in Cosmologies ):

>>> from astropy.cosmology import WMAP7   # WMAP 7-year cosmology
>>> WMAP7.critical_density(0)  # critical density at z = 0  
<Quantity 9.31000324385361e-30 g / cm3>

您也可以看到密度参数如何随着红移而变化:

>>> import numpy as np
>>> from astropy.cosmology import WMAP7   # WMAP 7-year cosmology
>>> WMAP7.Om(np.array([0, 1.0, 2.0]))  
array([0.272     , 0.74898522, 0.90905234])
>>> WMAP7.Ode(np.array([0., 1.0, 2.0]))  
array([0.72791572, 0.2505506 , 0.0901026 ])

请注意,这些加起来并不完全等于1,尽管 WMAP 7年 假设宇宙是平坦的,因为包括了光子和中微子。另请注意,密度参数是无单位的,因此也不是 Quantity 物体。

通过传递关键字参数,可以在类实例化时指定红移0处的重子物质密度 Ob0 ::

>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3, Ob0=0.05)
>>> print(cosmo)
FlatLambdaCDM(H0=70.0 km / (Mpc s), Om0=0.3, Tcmb0=0.0 K,
              Neff=3.04, m_nu=None, Ob0=0.05)

在这种情况下,“仅暗物质密度”在红移0处可用作类属性 Odm0 利用这些方法可以计算出暗物质和重子物质密度的红移演化 OdmOb 分别是。如果 Ob0 在类实例化时未指定,它默认为 None 任何依赖于它被指定的方法都将引发一个 ValueError

>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3)
>>> cosmo.Odm(1)
Traceback (most recent call last):
...
ValueError: Baryonic density not set for this cosmology, unclear
meaning of dark matter density

宇宙学实例有一个可选的 name 可用于描述宇宙学的属性:

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

这也是暗能量不同模型的一个例子:一个具有恒定暗能量状态方程的平坦宇宙,但不一定是宇宙常数。此外,还支持各种额外的暗能量模型(参见 Specifying a dark energy model

重要的一点是,每个实例的宇宙学参数都是不变的--也就是说,如果你想改变,比如说, Om ,您需要创建一个新的类实例。为了使这更方便,一个 clone() 提供了操作,允许您复制更改了指定值的副本。请注意,您不能通过此操作更改宇宙学的类型(例如,从平面到非平面)。

使用 clone 操作:

>>> from astropy.cosmology import WMAP9
>>> newcosmo = WMAP9.clone(name='WMAP9 modified', Om0=0.3141)
>>> WMAP9.H0, newcosmo.H0  # some values unchanged  
(<Quantity 69.32 km / (Mpc s)>, <Quantity 69.32 km / (Mpc s)>)
>>> WMAP9.Om0, newcosmo.Om0  # some changed  
(0.2865, 0.3141)
>>> WMAP9.Ode0, newcosmo.Ode0  # Indirectly changed since this is flat  
(0.7134130719051658, 0.6858130719051657)

在给定的宇宙学量值下求红移#

如果你知道一个宇宙量,并且你想知道它对应的红移,你可以用 z_at_value()

例子#

使用 z_at_value

>>> import astropy.units as u
>>> from astropy.cosmology import Planck13, z_at_value
>>> z_at_value(Planck13.age, 2 * u.Gyr)  
<Quantity 3.19812061 redshift>

对于某些量,可以有不止一个红移满足一个值。在这种情况下,您可以使用 zminzmax 关键字以限制搜索范围或设置 bracket 在所需的域中对其进行初始化。请参阅 z_at_value() 文档字符串,以获取更详细的用法示例。

内建宇宙学#

通过使用WMAP和普朗克卫星数据的分析,可以得到许多预加载的宇宙。例如:

>>> from astropy.cosmology import Planck13  # Planck 2013
>>> Planck13.lookback_time(2)  # lookback time in Gyr at z=2  
<Quantity 10.51184138 Gyr>

有关预定义宇宙的完整列表,请参阅 包含的宇宙学实现

指定暗能量模型#

与标准一起 FlatLambdaCDM 模型,提供了一些附加的暗能量模型。 FlatLambdaCDMLambdaCDM 假设暗能量是一个宇宙学常数,应该是最常用的情况;前者假设宇宙是平的,后者允许空间曲率。 FlatwCDMwCDM 假设一个恒定的暗能量状态方程被参数化为 \(w_{0}\) 。给出了变暗能量状态方程的两种形式:简单的一阶线性展开 \(w(z) = w_{0} + w_{z} z\) 通过 w0wzCDM ,以及通用的CPL表格 w0waCDM\(w(z) = w_{0} + w_{a} (1 - a) = w_{0} + w_{a} z / (1 + z)\) 和它的泛化,以包括轴心红移 wpwaCDM\(w(z) = w_{p} + w_{a} (a_{p} - a)\)

用户可以通过子类化来指定他们自己的状态方程 FLRW 。有关示例,请参阅提供的子类。坚持子类化是明智的 FLRW 而不是它的一个子类,因为它们中的一些使用内部优化,而这些内部优化也需要传播到任何子类。希望使用类似技巧(可以使距离计算更快)的用户应该参考宇宙学模块的源代码以了解详细信息。

光子和中微子#

宇宙学课程(CAN)包括光子和中微子对能量密度的贡献。默认情况下,后者被认为是无质量的。控制这些物种的属性的三个参数是所有宇宙类的初始化式的自变量,它们是 Tcmb0 (z=0时宇宙微波背景的温度), Neff (中微子物种的有效数量),以及 m_nu (中微子物种的剩余质量)。 Tcmb0m_nu 应以单位数量表示。这三种器件的标准缺省值分别为-0K、3.04和0 EV。)的原因是 Neff 不是3主要与电子-正电子湮没导致的中微子能谱中的一个小碰撞有关,但也受到弱相互作用物理的影响。)将CMB温度设置为0会同时消除中微子和光子的影响。除非用户明确请求,否则这是确保排除这些组件的默认设置。

Massive neutrinos are treated using the approach described in the WMAP seven-year cosmology paper (Komatsu et al. 2011, ApJS, 192, 18, section 3.3). This is not the simple \(\Omega_{\nu 0} h^2 = \sum_i m_{\nu\, i} / 93.04\,\mathrm{eV}\) approximation. Also note that the values of \(\Omega_{\nu}(z)\) include both the kinetic energy and the rest mass energy components, and that the 普朗克2013 and 普朗克2015 cosmologies include a single species of neutrinos with non-zero mass (which is not included in \(\Omega_{m0}\)).

添加大量中微子会对性能产生重大影响。特别是距离测量和回望时间的计算比无质量中微子情况慢3到4倍。因此,如果你需要在这样一个宇宙学中计算许多距离,并且性能是至关重要的,在网格上计算它们并使用插值是特别有用的。

实例#

光子和中微子对总质量能量密度的贡献可以作为红移的函数:

>>> from astropy.cosmology import WMAP7   # WMAP 7-year cosmology
>>> WMAP7.Ogamma0, WMAP7.Onu0  # Current epoch values  
(4.985694972799396e-05, 3.442154948307989e-05)
>>> z = np.array([0, 1.0, 2.0])
>>> WMAP7.Ogamma(z), WMAP7.Onu(z)  
(array([4.98603986e-05, 2.74593395e-04, 4.99915942e-04]),
 array([3.44239306e-05, 1.89580995e-04, 3.45145089e-04]))

如果要从计算中排除光子和中微子,可以设置 Tcmb0 设置为0(也是默认值)::

>>> 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, cos.Onu0
(0.0, 0.0)

通过设置,可以包含光子,但排除中微子的任何贡献 Tcmb0 非零(2.725K是我们宇宙的标准值),但是 Neff 到0::

>>> from astropy.cosmology import FlatLambdaCDM
>>> cos = FlatLambdaCDM(70.4, 0.272, Tcmb0=2.725, Neff=0)
>>> cos.Ogamma(np.array([0, 1, 2]))  # Photons are still present  
array([4.98603986e-05, 2.74642208e-04, 5.00086413e-04])
>>> cos.Onu(np.array([0, 1, 2]))  # But not neutrinos  
array([0., 0., 0.])

我们假设中微子的数量是 Neff ,默认情况下为 Neff=3 . 因此,如果需要非零的中微子质量,那么应该提供三个质量。但是,如果只提供一个值,则假定所有物种具有相同的质量。 Neff 假定在每个物种之间平均分配。

>>> from astropy.cosmology import FlatLambdaCDM
>>> import astropy.units as u
>>> H0 = 70.4 * u.km / u.s / u.Mpc
>>> m_nu = 0 * u.eV
>>> cosmo = FlatLambdaCDM(H0, 0.272, Tcmb0=2.725, m_nu=m_nu)
>>> cosmo.has_massive_nu
False
>>> cosmo.m_nu  
<Quantity [0., 0., 0.] eV>
>>> m_nu = [0.0, 0.05, 0.10] * u.eV
>>> cosmo = FlatLambdaCDM(H0, 0.272, Tcmb0=2.725, m_nu=m_nu)
>>> cosmo.has_massive_nu
True
>>> cosmo.m_nu  
<Quantity [0.  , 0.05, 0.1 ] eV>
>>> cosmo.Onu(np.array([0, 1.0, 15.0]))  
array([0.00327011, 0.00896845, 0.01257946])
>>> cosmo.Onu(1) * cosmo.critical_density(1)  
<Quantity 2.444380380370406e-31 g / cm3>

虽然使用了这些示例 FlatLambdaCDM ,上述例子也适用于所有其他的宇宙学课程。

也见#

效度和信度范围#

这个子包中的代码是针对几个广泛使用的在线宇宙学计算器进行测试的,并且已经被用于在参考论文中执行许多计算。您可以检查在模块中定期测试代码的红移范围 astropy.cosmology.tests.test_cosmology . 如果您发现任何错误,请通过 opening an issue at the GitHub repository 你说什么?

一个更困难的问题是代码预计返回有效结果的红移范围。这必然取决于模型,但一般来说,对于比物质-辐射相等的纪元大几倍以上的红移,你不应该期望数值结果表现良好(因此,对于典型模型,不高于z=5-6000,但对于某些模型,较低的红移可能表现不佳)。特别是,您应该注意来自 scipy.integrate 关于积分不收敛的包(每节课可能只发布一次)。

内建宇宙学使用的参数列在各自的论文。它们只提供有限的精度范围,因此不应期望导出的数量匹配超出该精度。例如,普朗克2013年和2015年的结果只提供了4位数的哈勃常数。因此,尽管论文中引用了5位数字,但不应期望他们与普朗克团队引用的年龄相匹配。

参考/API#