z_at_value#

astropy.cosmology.z_at_value(func, fval, zmin=1e-08, zmax=1000, ztol=1e-08, maxfun=500, method='Brent', bracket=None, verbose=False)[源代码]#

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

这将发现一个宇宙学函数或方法(例如Planck13.distmod)等于已知值时的红移。

警告

请确保您了解要反转的函数的行为!取决于宇宙学,可能没有唯一的解决办法。例如,在标准Lambda-CDM宇宙学中,存在两个红移,其角直径距离分别为1500 Mpc、z~0.7和z~3.8。强迫 z_at_value 要找到您感兴趣的解决方案,请使用 zminzmax 限制搜索范围的关键字(请参阅下面的示例)。

参数:
func : function 或方法Python:函数或方法

一种以红移量作为输入的函数。

fvalQuantity数量

的(标量或数组)值 func(z) 来恢复健康。

zmin : floatarray_like [:ref: 'dimensionless'] 或 astropy:quantity-like ,可选PYTHON:FLOAT或NUMPY:ARRAY_LIKE [:ref: 'dimensionless'] 或占星状:数量相似,可选

的搜索下限 z . 注意一些宇宙学函数的发散,比如距离模,在z=0时(默认值为1e-8)。

zmax : floatarray_like [:ref: 'dimensionless'] 或 astropy:quantity-like ,可选PYTHON:FLOAT或NUMPY:ARRAY_LIKE [:ref: 'dimensionless'] 或占星状:数量相似,可选

的搜索上限 z (默认值为1000)。

ztol : floatarray_like [:ref: 'dimensionless'] ,可选PYTHON:FLOAT或NUMPY:ARRAY_LIKE [:ref: 'dimensionless'] ,可选

相对误差 z 可接受收敛。

maxfun : intarray_like ,可选PYTHON:INT或NUMPY:ARRAY_LIKE,可选

优化例程中允许的最大函数求值数(默认为500)。

method : strcallable() ,可选PYTHON:字符串或PYTHON:Callable(),可选

要传递到最小化的求解器的类型。提供的内置选项 minimize_scalar() ‘Brent’(默认)、‘Golden’和‘bound’名称不区分大小写-有关详细信息,请参阅那里的文档。它还接受自定义求解器,方法是传递任何用户提供的可调用对象,该对象满足其中“自定义最小化程序”注释中列出的要求,或者更详细地参见 Optimization (scipy.optimize) -尽管它们的使用目前尚未经过测试。

在 4.3 版本加入.

bracket : sequenceobject array [sequence] ,可选Python:序列或对象数组 [python:sequence] ,可选

对于‘Brent’和‘Golden’方法, bracket 定义括号间隔,并且可以具有三个项(Z1、Z2、Z3),使得Z1 func(z2) < func (z1), func(z3) 或假设为下坡括号搜索的开始间隔的两个项Z1和Z3。对于角直径距离等非单调函数,这可以用来在最大值所需的一侧开始搜索,但请参阅下面的示例以了解用法说明。

在 4.3 版本加入.

verbose : bool ,可选可选的布尔

打印求解程序的诊断输出(默认 False )。

在 4.3 版本加入.

返回:
z数量 ['redshift']

红移 z 满足感 zmin < z < zmaxfunc(z) = fvalztol 。有宇宙红移的单位。

加薪:
astropy.cosmology.CosmologyError

如果结果非常接近于 zminzmax

ValueError

如果 bracket 既不是数组,也不是2(或3)个元素序列。

TypeError

如果 bracket 不是对象数组。2(或3)元素序列将转换为对象数组,因此只有在使用非对象数组时才会出现此错误 bracket

警告:
AstropyUserWarning

如果 fval 没有用括号括起来 func(zmin)=fval(zmin)func(zmax)=fval(zmax)

如果求解器不成功。

笔记

这对任意输入的宇宙学都有效,但是如果你想要对同一宇宙学的大量值进行倒置,效率就会很低。在这种情况下,更快的做法是在覆盖相关红移范围的多个紧密间隔的红移处生成一个值数组,然后使用插值来查找感兴趣的每个值处的红移。例如,要在Planck13宇宙学中高效地找到与距离模数的10^6值相对应的红移,您可以执行以下操作:

>>> import astropy.units as u
>>> from astropy.cosmology import Planck13, z_at_value

生成24到44之间的10^6距离模数,我们要为其找到相应的红移:

>>> Dvals = (24 + np.random.rand(1000000) * 20) * u.mag

在zmin和zmax之间使用50个等对数间隔的值,制作一个覆盖我们需要的红移范围的距离模网格。我们使用测井间距对低距离模量曲线的陡峭部分进行充分采样:

>>> zmin = z_at_value(Planck13.distmod, Dvals.min())
>>> zmax = z_at_value(Planck13.distmod, Dvals.max())
>>> zgrid = np.geomspace(zmin, zmax, 50)
>>> Dgrid = Planck13.distmod(zgrid)

最后进行插值,以找到每个距离模数处的红移:

>>> zvals = np.interp(Dvals.value, Dgrid.value, zgrid)

实例

>>> import astropy.units as u
>>> from astropy.cosmology import Planck13, Planck18, z_at_value

年龄和回望时间与红移单调相关,因此可以找到唯一解:

>>> z_at_value(Planck13.age, 2 * u.Gyr)               
<Quantity 3.19812268 redshift>

但是,角直径不是单调的,并且有两个红移,其值为1500 Mpc。您可以使用Zmin和Zmax关键字查找您感兴趣的关键字:

>>> z_at_value(Planck18.angular_diameter_distance,
...            1500 * u.Mpc, zmax=1.5)                
<Quantity 0.68044452 redshift>
>>> z_at_value(Planck18.angular_diameter_distance,
...            1500 * u.Mpc, zmin=2.5)                
<Quantity 3.7823268 redshift>

或者, bracket 选项可用于初始化所需区域上的函数求解器,但应注意,这并不能保证函数求解器将保持在此起始括号附近。以角直径距离为例,在这个宇宙学中,它在红移1.6附近有一个最大值,在这个最大值的任一侧定义一个括号通常会返回同一侧的解:

>>> z_at_value(Planck18.angular_diameter_distance, 1500 * u.Mpc,
...            method="Brent", bracket=(1.0, 1.2))  
<Quantity 0.68044452 redshift>

但这不能确定,特别是如果选择的括号太宽和/或太接近转折点:

>>> z_at_value(Planck18.angular_diameter_distance,
...            1500 * u.Mpc, bracket=(0.1, 1.5))           
<Quantity 3.7823268 redshift>                              

同样,即使对于相同的最小化程序和相同的启动条件,也可以根据体系结构或库版本找到不同的结果:

>>> z_at_value(Planck18.angular_diameter_distance,
...            1500 * u.Mpc, bracket=(2.0, 2.5))           
<Quantity 3.7823268 redshift>                              
>>> z_at_value(Planck18.angular_diameter_distance,
...            1500 * u.Mpc, bracket=(2.0, 2.5))           
<Quantity 0.68044452 redshift>                             

因此,使用3参数变量通常更安全,以确保解决方案保持在括号范围内:

>>> z_at_value(Planck18.angular_diameter_distance, 1500 * u.Mpc, method="Brent",
...            bracket=(0.1, 1.0, 1.5))               
<Quantity 0.68044452 redshift>

还要注意的是,光度距离和距离模数(另外两个通常被颠倒的量)在平坦和开放的宇宙中是单调的,而在封闭的宇宙中则不是单调的。

所有的论点,除了 funcmethodverbose 接受数组输入。这不使用插值表或任何方法来加快求值速度,而是提供了一种在基于元素的标量求值上广播参数的方便方法。

非标量输入的最常见用例是计算 fval

>>> z_at_value(Planck13.age, [2, 7] * u.Gyr)          
<Quantity [3.19812061, 0.75620443] redshift>

fval 可以是任何形状:

>>> z_at_value(Planck13.age, [[2, 7], [1, 3]]*u.Gyr)  
<Quantity [[3.19812061, 0.75620443],
           [5.67661227, 2.19131955]] redshift>

其他参数可以是数组。对于非单调函数--例如,角直径距离--这对于寻找所有解都很有用。

>>> z_at_value(Planck13.angular_diameter_distance, 1500 * u.Mpc,
...            zmin=[0, 2.5], zmax=[2, 4])            
<Quantity [0.68127747, 3.79149062] redshift>

这个 bracket 参数同样可以是数组。但是,由于方括号必须已经是一个序列(或无),因此它必须作为对象给出 numpy.ndarray 。重要的是,数组的深度必须使每个括号子序列都是一个对象。否则将发生错误或意外结果。确保正确深度的一种方便方法是包括长度为0的元组作为括号,然后截断对象数组以删除占位符。这一点可以在以下示例中看到:

>>> bracket=np.array([(1.0, 1.2),(2.0, 2.5), ()], dtype=object)[:-1]
>>> z_at_value(Planck18.angular_diameter_distance, 1500 * u.Mpc,
...            bracket=bracket)  
<Quantity [0.68044452, 3.7823268] redshift>