震级和其他对数单位#

震级和对数单位,如 dexdB 用作相对于某个参考值的值的对数。支持具有此类单位的数量 astropy 通过 MagnitudeDexDecibel 类。

创建对数量#

可以直接创建对数量,也可以通过与对数单位相乘来创建对数量。

例子#

要创建对数量:

>>> import astropy.units as u, astropy.constants as c, numpy as np
>>> u.Magnitude(-10.)  
<Magnitude -10. mag>
>>> u.Magnitude(10 * u.ct / u.s)  
<Magnitude -2.5 mag(ct / s)>
>>> u.Magnitude(-2.5, "mag(ct/s)")  
<Magnitude -2.5 mag(ct / s)>
>>> -2.5 * u.mag(u.ct / u.s)  
<Magnitude -2.5 mag(ct / s)>
>>> u.Dex((c.G * u.M_sun / u.R_sun**2).cgs)  
<Dex 4.438067627303133 dex(cm / s2)>
>>> np.linspace(2., 5., 7) * u.Unit("dex(cm/s2)")  
<Dex [2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ] dex(cm / s2)>

上面,我们利用了这样一个事实,即 magdex ,以及 dB 的特殊之处在于,当用作函数时,它们返回一个 LogUnit 实例 (MagUnitDexUnit ,以及 DecibelUnit ,分别)。在解析字符串时发生的情况与所需的相同 Unit

至于正常 Quantity 对象,则可以使用 value 属性。此外,您还可以将 Quantity 该物理单元使用 physical 属性::

>>> logg = 5. * u.dex(u.cm / u.s**2)
>>> logg.value
5.0
>>> logg.physical  
<Quantity 100000. cm / s2>

转换为不同单位#

喜欢 Quantity 对象,对数量可以转换成不同的单位,不管是另一个对数单位还是一个物理单位。

例子#

要将对数量转换为不同的单位:

>>> logg = 5. * u.dex(u.cm / u.s**2)
>>> logg.to(u.m / u.s**2)  
<Quantity 1000. m / s2>
>>> logg.to('dex(m/s2)')  
<Dex 3. dex(m / s2)>

为方便起见, sicgs 属性可用于将 Quantity 到基地 SICGS 单位::

>>> logg.si  
<Dex 3. dex(m / s2)>

算术和光度应用#

对数量的加法和减法按预期工作,适当地乘以和除以物理单位。最好通过光度还原的例子来观察。

例子#

首先,假设三个物体的计数率,计算仪器的震级:

>>> tint = 1000.*u.s
>>> cr_b = ([3000., 100., 15.] * u.ct) / tint
>>> cr_v = ([4000., 90., 25.] * u.ct) / tint
>>> b_i, v_i = u.Magnitude(cr_b), u.Magnitude(cr_v)
>>> b_i, v_i  
(<Magnitude [-1.19280314,  2.5       ,  4.55977185] mag(ct / s)>,
 <Magnitude [-1.50514998,  2.61439373,  4.00514998] mag(ct / s)>)

那么,仪器的B-V颜色是:

>>> b_i - v_i  
<Magnitude [ 0.31234684, -0.11439373,  0.55462187] mag>

请注意,物理单位已变为无量纲。以下步骤可用于校正大气消光:

>>> atm_ext_b, atm_ext_v = 0.12 * u.mag, 0.08 * u.mag
>>> secz = 1./np.cos(45 * u.deg)
>>> b_i0 = b_i - atm_ext_b * secz
>>> v_i0 = v_i - atm_ext_b * secz
>>> b_i0, v_i0  
(<Magnitude [-1.36250876,  2.33029437,  4.39006622] mag(ct / s)>,
 <Magnitude [-1.67485561,  2.4446881 ,  3.83544435] mag(ct / s)>)

因为绝灭是无量纲的,所以单位不变。现在假设第一颗恒星有已知的ST星等,我们可以计算零点:

>>> b_ref, v_ref = 17.2 * u.STmag, 17.0 * u.STmag
>>> b_ref, v_ref  
(<Magnitude 17.2 mag(ST)>, <Magnitude 17. mag(ST)>)
>>> zp_b, zp_v = b_ref - b_i0[0], v_ref - v_i0[0]
>>> zp_b, zp_v  
(<Magnitude 18.56250876 mag(ST s / ct)>,
 <Magnitude 18.67485561 mag(ST s / ct)>)

在这里, ST 是ST零点通量的简写:

>>> (0. * u.STmag).to(u.erg/u.s/u.cm**2/u.AA)  
<Quantity 3.63078055e-09 erg / (Angstrom s cm2)>
>>> (-21.1 * u.STmag).to(u.erg/u.s/u.cm**2/u.AA)  
<Quantity 1. erg / (Angstrom s cm2)>

备注

目前,只执行根据光度或通量定义的量值,因为这些值不依赖于测量所用的滤波器。它们包括绝对和表观热计量 [M15], ST [H95], 和AB [OG83] 数量级。

现在应用校准,我们发现(注意单位的正确变化)::

>>> B, V = b_i0 + zp_b, v_i0 + zp_v
>>> B, V  
(<Magnitude [17.2       , 20.89280314, 22.95257499] mag(ST)>,
 <Magnitude [17.        , 21.1195437 , 22.51029996] mag(ST)>)

我们可以将这些大小转换为另一个系统,例如ABMag,使用适当的 equivalency **

>>> V.to(u.ABmag, u.spectral_density(5500.*u.AA))  
<Magnitude [16.99023831, 21.10978201, 22.50053827] mag(AB)>

这对于将量值转换为通量密度特别有用。 V 目前是ST量级,这是基于单位波长的通量密度 (\(f_\lambda\) ). 因此,我们可以直接转换 V 单位波长的通量密度 to() 方法:

>>> flam = V.to(u.erg/u.s/u.cm**2/u.AA)
>>> flam  
<Quantity [5.75439937e-16, 1.29473986e-17, 3.59649961e-18] erg / (Angstrom s cm2)>

转换 V 单位频率的磁通密度 (\(f_\nu\) ),我们再次需要合适的 equivalency ,在本例中是震级带的中心波长,5500埃:

>>> lam = 5500 * u.AA
>>> fnu = V.to(u.erg/u.s/u.cm**2/u.Hz, u.spectral_density(lam))
>>> fnu  
<Quantity [5.80636959e-27, 1.30643316e-28, 3.62898099e-29] erg / (Hz s cm2)>

我们可以用中心频率来代替:

>>> nu = 5.45077196e+14 * u.Hz
>>> fnu = V.to(u.erg/u.s/u.cm**2/u.Hz, u.spectral_density(nu))
>>> fnu  
<Quantity [5.80636959e-27, 1.30643316e-28, 3.62898099e-29] erg / (Hz s cm2)>

备注

在将量值转换为通量密度时,操作顺序很重要;需要确定单位的值 之前 转换。例如, 21 * u.ABmag.to(u.erg/u.s/u.cm**2/u.Hz) 会给你21次 \(f_\nu\) 对于AB mag为1,而 (21 * u.ABmag).to(u.erg/u.s/u.cm**2/u.Hz) 会给你 \(f_\nu\) 对于一个21的AB mag。

假设我们也知道第一颗恒星的固有颜色,那么我们就可以计算出它的变红:

>>> B_V0 = -0.2 * u.mag
>>> EB_V = (B - V)[0] - B_V0
>>> R_V = 3.1
>>> A_V = R_V * EB_V
>>> A_B = (R_V+1) * EB_V
>>> EB_V, A_V, A_B  
(<Magnitude 0.4 mag>, <Magnitude 1.24 mag>, <Magnitude 1.64 mag>)

在这里,你可以看到物种灭绝已经转化为数量。这通常发生在除法和乘法中,因为这些过程只适用于无量纲的量值(否则,物理单位必须提高到一定的幂次),并且 Quantity 与对数量不同的是,对象允许的单位是 mag / d .

请注意,您可以采取自动单位转换相当远(也许太远,但它是有趣的)。例如,假设我们也知道热辐射修正和绝对热辐射量,那么我们就可以计算出距离模数:

>>> BC_V = -0.3 * (u.m_bol - u.STmag)
>>> M_bol = 5.46 * u.M_bol
>>> DM = V[0] - A_V + BC_V - M_bol
>>> BC_V, M_bol, DM  
(<Magnitude -0.3 mag(bol / ST)>,
 <Magnitude 5.46 mag(Bol)>,
 <Magnitude 10. mag(bol / Bol)>)

带着一个合适的 equivalency ,我们也可以在不记住5-5log规则的情况下转换为距离(但您可能会发现 Distance 类将更加方便)::

>>> radius_and_inverse_area = [(u.pc, u.pc**-2,
...                            lambda x: 1./(4.*np.pi*x**2),
...                            lambda x: np.sqrt(1./(4.*np.pi*x)))]
>>> DM.to(u.pc, equivalencies=radius_and_inverse_area)  
<Quantity 1000. pc>

NumPy函数#

对于对数量,大多数 numpy 函数和许多数组方法没有意义,因此它们被禁用。但您可以使用您期望工作的功能::

>>> np.max(v_i)  
<Magnitude 4.00514998 mag(ct / s)>
>>> np.std(v_i)  
<Magnitude 2.33971149 mag>

备注

这是通过以下方式实现的:中具有受支持的uunction列表 units/function/core.py 中显式禁用某些数组方法 FunctionQuantity 。如果您认为某个函数或方法被错误地处理,请 let us know

无量纲对数量#

无量纲量的处理有点特别,如果需要,对数量将被转换成正态 Quantity 对象的适当单位为 magdBdex . 有了它,就可以使用像 mag/ddB/m ,不能方便地支持为对数单位。例如::

>>> dBm = u.dB(u.mW)
>>> signal_in, signal_out = 100. * dBm, 50 * dBm
>>> cable_loss = (signal_in - signal_out) / (100. * u.m)
>>> signal_in, signal_out, cable_loss  
(<Decibel 100. dB(mW)>, <Decibel 50. dB(mW)>, <Quantity 0.5 dB / m>)
>>> better_cable_loss = 0.2 * u.dB / u.m
>>> signal_in - better_cable_loss * 100. * u.m  
<Decibel 80. dB(mW)>

References

[M15]

Mamajek等人,2015年, arXiv:1510.06262

[H95]

E、 g.,Holtzman等人,1995年, PASP 107, 1065

[OG83]

Oke,J.B.和Gunn,J.E.,1983年, ApJ 266, 713