宇宙学计算 (astropy.cosmology

介绍

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

入门

宇宙量是用a的方法计算的 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>

这里WMAP9是一个内置的物体,它用九年WMAP结果中的参数来描述宇宙学。其他几个内置的宇宙也可用(参见 Built-in Cosmologies ). 宇宙学对象的可用方法列在 FLRW 班级。如果使用的是IPython,还可以使用tab completion来打印可用方法的列表。为此,在导入如上示例中的宇宙学之后,输入 cosmo. 在IPython提示下,然后按tab键。

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

>>> from astropy.cosmology import WMAP9 as cosmo
>>> cosmo.comoving_distance([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)
>>> 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)

注意其他宇宙学参数的存在(例如。, 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 对象。这代表了一个均匀和各向同性的宇宙学(以弗里德曼-莱迈特-罗伯逊-沃克度量为特征,以解决爱因斯坦场方程的人的名字命名)。但是,您不能直接使用这个类,因为您必须使用它的一个子类来指定暗能量模型,例如 FlatLambdaCDM .

实例

你可以创建一个新的 FlatLambdaCDM 对象,参数给出哈勃参数和ω物质(均为z=0):

>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3)
>>> cosmo
FlatLambdaCDM(H0=70 km / (Mpc s), Om0=0.3, Tcmb0=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)

但是,大多数接受单位的参数 (H0Tcmb0 )有默认单位,所以不必使用单位量(中微子质量除外,如果你想要大质量的中微子,你必须提供一个单位)。

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

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

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

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

它们还接受红移数组:

>>> cosmo.age([0.5, 1, 1.5]).value  
array([8.42128013, 5.74698021, 4.19645373])

FLRWFlatLambdaCDM 所有可用方法和属性的对象docstring。

除了平坦的宇宙,还支持非平坦的变体,例如 LambdaCDM. A variety of standard cosmologies with the parameters already defined are also available (see 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>

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

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

请注意,尽管WMAP7假设宇宙是平的,但这些并不完全等同于一个,因为光子和中微子也包括在内。还要注意密度参数是无单位的,因此不是 Quantity 物体。

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

>>> from astropy.cosmology import FlatLambdaCDM
>>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3, Ob0=0.05)
>>> cosmo
FlatLambdaCDM(H0=70 km / (Mpc s), Om0=0.3, Tcmb0=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)
>>> 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)

这也是暗能量不同模型的一个例子:一个具有恒定暗能量状态方程的平坦宇宙,但不一定是宇宙常数。此外,还支持各种额外的暗能量模型(参见 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)  
3.1981226843560968

对于某些量,可以有多个红移满足一个值。在这种情况下,您可以使用 zminzmax 限制搜索范围的关键字。见 z_at_value docstring以获取更详细的用法示例。

内建宇宙学

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

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

预定义宇宙的完整列表由 cosmology.parameters.available 总结如下:

名字

来源

H0型

平的

WMAP5型

小松等人。2009

70.2

0.277

是的

WMAP7型

小松等人。2011

70.4

0.272

是的

WMAP9型

Hinshaw等人。2013

69.3

0.287

是的

普朗克13

普朗克合作2013,论文16

67.8

0.307

是的

普朗克15

普朗克合作2015,论文十三

67.7

0.307

是的

普朗克18

普朗克合作2018,论文六

67.7

0.310

是的

注解

与普朗克2015年的论文不同,普朗克2018年的论文在 Om0 但是Planck18对象将它们包含在 m_nu 而是为了保持一致性。因此 Om0 普朗克18的数值与普朗克2018年的论文略有不同,但代表了相同的宇宙学模型。

目前,所有都是 FlatLambdaCDM . 每个对象的docstring中提供了关于每一组参数的确切来源的详细信息:

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

指定暗能量模型

与标准一起 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 . 有关示例,请参见提供的子类。建议(但不是必需的)新子类的构造函数的所有参数都可用作属性,因为 clone 方法假定是这种情况。坚持子类化也是明智的 FLRW 而不是它的一个子类,因为它们中的一些使用内部优化,也需要传播到任何子类。希望使用类似技巧(这可以使距离计算更快)的用户应该参考宇宙学模块源代码以获取详细信息。

光子和中微子

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

使用WMAP七年宇宙学论文(Komatsu et al。2011年,ApJS,192,18,第3.3节)。这不是简单的 \(\Omega_{{\nu 0}} h^2 = \sum_i m_{{\nu\, i}} / 93.04\,\mathrm{{eV}}\) 近似值。还要注意的是 \(\Omega_{{\nu}}(z)\) 包括动能和剩余的质量能成分,而且普朗克13和普朗克15宇宙包括一种质量不为零的中微子(不包括在 \(\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 = [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([0, 1, 2])  # Photons are still present  
array([4.98603986e-05, 2.74642208e-04, 5.00086413e-04])
>>> cos.Onu([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([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 里面 astropy

如果您正在为 astropy 核心或附属软件包,通常假设默认宇宙学是有用的,这样就不必每次调用函数或方法时都指定精确的宇宙学。在这种情况下,可以指定一个“默认”宇宙学。

您可以使用中的“default_cosmology”选项将默认宇宙学设置为预定义值 [cosmology.core] 配置文件的部分(请参阅 配置系统 (astropy.config ) ). 或者,您可以使用 set 功能 default_cosmology 为当前Python会话设置宇宙学。如果您没有使用上述方法之一设置默认宇宙学,那么宇宙学模块将默认使用九年WMAP参数。

强烈建议您通过 default_cosmology 科学国家目标。然后可以使用如下方法提供覆盖选项:

def myfunc(..., cosmo=None):
    from astropy.cosmology import default_cosmology

    if cosmo is None:
        cosmo = default_cosmology.get()

    ... your code here ...

这可以确保所有代码一致地使用默认的宇宙学,除非显式重写。

注解

一般来说,最好使用明确的宇宙学(例如 WMAP9.H(0) 而不是 cosmology.default_cosmology.get().H(0) ). 默认宇宙学的使用通常应保留给将包含在 astropy 核心或附属包。

也见

效度和信度范围

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

红移问题的结果在预期的范围内更难返回。这必然依赖于模型,但一般情况下,你不应该期望红移的数值结果表现良好,红移比物质辐射相等的时代大几倍(因此,对于典型模型,不超过z=5-6000,但对于某些模型,红移低得多可能是不正常的)。特别是,您应该注意来自 scipy 关于无法收敛的积分的集成包(每个会话只能发出一次)。

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

参考/API

天文宇宙学包裹

天文宇宙学包含用于宇宙学距离测量和其他宇宙学相关计算的类和函数。

Astropy documentation 更多详细的使用示例和参考。

功能

z_at_value \(功能,fval[, zmin, zmax, ztol, ...] )

找到红移 z 在哪 func(z) = fval .

Classes

FLRW \(H0、Om0、Ode0[, Tcmb0, Neff, m_nu, ...] )

描述各向同性和均匀宇宙学的一个类。

FlatLambdaCDM \(H0,Om0[, Tcmb0, Neff, m_nu, ...] )

具有宇宙学常数且无曲率的FLRW宇宙学。

Flatw0waCDM \(H0,Om0[, w0, wa, Tcmb0, Neff, ...] )

具有CPL暗能量状态方程且无曲率的FLRW宇宙学。

FlatwCDM \(H0,Om0[, w0, Tcmb0, Neff, m_nu, ...] )

具有恒定暗能量状态方程且无空间曲率的FLRW宇宙学。

LambdaCDM \(H0、Om0、Ode0[, Tcmb0, Neff, ...] )

具有宇宙学常数和曲率的FLRW宇宙学。

default_cosmology ()

默认使用的宇宙学。改变它::。

w0waCDM \(H0、Om0、Ode0[, w0, wa, Tcmb0, ...] )

具有CPL暗能量状态方程和曲率的FLRW宇宙学。

w0wzCDM \(H0、Om0、Ode0[, w0, wz, Tcmb0, ...] )

具有可变暗能量状态方程和曲率的FLRW宇宙学。

wCDM \(H0、Om0、Ode0[, w0, Tcmb0, Neff, m_nu, ...] )

具有恒定暗能量状态方程和曲率的FLRW宇宙学。

wpwaCDM \(H0、Om0、Ode0[, wp, wa, zp, Tcmb0, ...] )

FLRW宇宙学,具有CPL暗能量状态方程、轴红移和曲率。

类继承图

Inheritance diagram of astropy.cosmology.core.FLRW, astropy.cosmology.core.FlatLambdaCDM, astropy.cosmology.core.Flatw0waCDM, astropy.cosmology.core.FlatwCDM, astropy.cosmology.core.LambdaCDM, astropy.cosmology.core.default_cosmology, astropy.cosmology.core.w0waCDM, astropy.cosmology.core.w0wzCDM, astropy.cosmology.core.wCDM, astropy.cosmology.core.wpwaCDM