震级和其他对数单位#
震级和对数单位,如 dex
和 dB
用作相对于某个参考值的值的对数。支持具有此类单位的数量 astropy
通过 Magnitude
, Dex
和 Decibel
类。
创建对数量#
可以直接创建对数量,也可以通过与对数单位相乘来创建对数量。
例子#
要创建对数量:
>>> 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)>
上面,我们利用了这样一个事实,即 mag
, dex
,以及 dB
的特殊之处在于,当用作函数时,它们返回一个 LogUnit
实例 (MagUnit
, DexUnit
,以及 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)>
为方便起见, si
和 cgs
属性可用于将 Quantity
到基地 SI 或 CGS 单位::
>>> 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)>
现在应用校准,我们发现(注意单位的正确变化)::
>>> 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
对象的适当单位为 mag
, dB
或 dex
. 有了它,就可以使用像 mag/d
或 dB/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
Mamajek等人,2015年, arXiv:1510.06262
E、 g.,Holtzman等人,1995年, PASP 107, 1065
Oke,J.B.和Gunn,J.E.,1983年, ApJ 266, 713