使用Astropy将ICRS坐标从历元1991.25转至J2016.0遇问题求助
解决方案
概念澄清
首先明确:ICRS是惯性参考系,本身没有“历元(equinox)”的概念——历元是针对FK5这类随时间变化的动力学坐标系的。你提到的“历元1991.25的ICRS坐标”,实际对应两种常见场景,以下分别给出解决方法:
场景1:原始坐标是FK5历元J1991.25的坐标,需转至FK5历元J2016.0
如果你的原始坐标实际是FK5系统在J1991.25历元下的值(而非ICRS),正确步骤如下:
- 初始化时明确指定FK5框架和对应历元
- 直接转换到目标历元的FK5框架
- 若需要ICRS表示,可从目标历元的FK5转换到ICRS(注意:ICRS坐标是固定值,和历元无关)
代码示例:
from astropy.coordinates import SkyCoord, FK5, ICRS ar = 243.90472242 dr = -8.36823651 # 初始化FK5历元J1991.25的坐标 c_fk5_1991 = SkyCoord(ar, dr, frame=FK5(equinox='J1991.25'), unit='deg') print("FK5 J1991.25坐标:\n", c_fk5_1991) # 转换到FK5历元J2016.0 c_fk5_2016 = c_fk5_1991.transform_to(FK5(equinox='J2016.0')) print("\nFK5 J2016.0坐标:\n", c_fk5_2016) # 可选:转换为ICRS坐标(此值与原始ICRS坐标一致,因为ICRS是惯性系) c_icrs = c_fk5_2016.transform_to(ICRS) print("\n对应ICRS坐标:\n", c_icrs)
场景2:原始坐标是J1991.25时刻的ICRS坐标,需计算J2016.0时刻的ICRS坐标(考虑天体自行)
如果你的原始坐标是天体在J1991.25时刻的ICRS位置,想要得到它在J2016.0时刻的ICRS位置,必须引入天体的自行(proper motion)和可选的径向速度(需替换为实际观测值)。
代码示例:
from astropy.coordinates import SkyCoord import astropy.units as u from astropy.time import Time ar = 243.90472242 dr = -8.36823651 # 替换为天体实际自行值:ra方向自行μ_ra*cos(dec)、dec方向自行μ_dec pm_ra_cosdec = 10 * u.mas/u.yr pm_dec = 5 * u.mas/u.yr # 径向速度(未知可设为0) rv = 0 * u.km/u.s # 初始化J1991.25时刻的ICRS坐标,包含自行参数 t_1991 = Time('J1991.25') c_icrs_1991 = SkyCoord(ra=ar*u.deg, dec=dr*u.deg, pm_ra_cosdec=pm_ra_cosdec, pm_dec=pm_dec, radial_velocity=rv, obstime=t_1991, frame='icrs') # 计算J2016.0时刻的ICRS坐标 t_2016 = Time('J2016.0') c_icrs_2016 = c_icrs_1991.apply_space_motion(new_obstime=t_2016) print("J1991.25时刻ICRS坐标:\n", c_icrs_1991) print("\nJ2016.0时刻ICRS坐标:\n", c_icrs_2016)
之前操作无效的原因
你将ICRS转FK5再转回ICRS得到原值,核心原因是:
- ICRS是固定惯性系,FK5不同历元的坐标只是同一个ICRS坐标在随时间变化的动力学坐标系下的投影,转换回ICRS自然会回到原始固定值。
- 只有当你处理非惯性动力学坐标系(如FK5)的历元转换,或考虑天体自身运动(自行)时,才会得到与原始值不同的坐标。
内容的提问来源于stack exchange,提问作者B612
相关产品推荐
相关产品推荐

