Astropy: кадры со скоростями и "единичным" представлением не могут преобразоваться в декартову

Созданный на 23 дек. 2017  ·  3Комментарии  ·  Источник: astropy/astropy

Некоторые из угловых тестов в # 6944 выявили некоторую проблемную работу для кадров, которые имеют скорости, где фактическое представление - UnitSpherical . Оказывается, это правда. Приведенные ниже случаи иллюстрируют проблему:

Также обратите внимание, что если # 6944 объединен, у него есть пара мест с обходными путями для этой ошибки. Если эта ошибка исправлена, эти обходные пути следует удалить (найдите в подпакете coordinates #7028 чтобы найти их).

Это работает:

>>> f = ICRS(1*u.deg, 2*u.deg)
>>> f.cartesian
<CartesianRepresentation (x, y, z) [dimensionless]
    ( 0.99923861,  0.01744177,  0.0348995)>

Но в этих двух случаях нет:

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible
>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> g.cartesian
UnitConversionError: '1 / s' (frequency) and 'km / s' (speed) are not convertible

Вероятно, это полезная подсказка о том, что во втором случае ошибки f.cartesian действительно работает, но что-то в преобразовании в GCRS заставляет его начать давать сбой. Возможно, это несколько разные проблемы, но они достаточно близки, и их, вероятно, придется решать вместе.

@adrn или @mhvk , вы не знаете, что здесь происходит? Кто-то может возразить, что, по крайней мере, описанный выше шаг преобразования несколько нечеткий, но все равно должна быть возможность получить декартово представление, даже если единицы немного странные ...

Bug coordinates

Все 3 Комментарий

Привет @eteq!

Я пытался работать над этим вопросом. Но в данном примере


>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)

В примере нет distance , а есть radial_velocity . Я не понял, что именно это значит. Кроме того, если я помещу в кадр какое-то расстояние, все работает отлично!

Не могли бы вы объяснить мне проблему, я запутался.

@shreyasbapat Не могли бы вы проверить, устраняет ли https://github.com/astropy/astropy/pull/9064 эту проблему? (Изменить: это не так)

9086 напомнил мне об этой проблеме. Для двух случаев:

Без расстояния, но с фургоном

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible

Я думаю, что этот вопрос неразрешим: без расстояния невозможно преобразовать собственное движение в пространственную скорость, а пространственную скорость в агулярную. Итак, я думаю, что в этом случае нам просто нужно убедиться, что сообщение об ошибке более четкое (вызвано наличием RV, но отсутствием расстояния).

RV, введенный преобразованием координат

>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> repr(g)
# error
>>> g.data
<CartesianRepresentation (x, y, z) [dimensionless]
    (0.99923901, 0.01742676, 0.03489572)
 (has differentials w.r.t.: 's')>
g.data.differentials
<CartesianDifferential (d_x, d_y, d_z) in 1 / s
    (6.07736084e-13, -1.85772092e-11, -8.12625661e-12)>

Это немного более тонко. Без правильного движения g будет UnitSpherical , что имеет смысл, и здесь он тоже должен быть, поэтому с преобразованием что-то не так. Для полноты, представление его на единичной сфере действительно работает:

g.represent_as('unitspherical')                                                               
Out[24]: 
<UnitSphericalRepresentation (lon, lat) in rad
    (0.01743826, 0.0349028)
 (has differentials w.r.t.: 's')>

In [25]: g.represent_as('unitspherical').differentials['s']                                            
Out[25]: 
<UnitSphericalDifferential (d_lon, d_lat) in rad / s
    (-1.85963079e-11, -8.13120751e-12)>

Но даже в этом случае g.cartesian тоже должен работать - здесь проблема в том, что кадры решают для пользователя, какие единицы разумны, настаивая на том, что декартова скорость находится в km/s (конечно, это восходит к к моей давней жалобе на то, что единицы координат в представлении решены за меня ...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753

Сами единицы получаются из:

g.representation_info
{astropy.coordinates.representation.CartesianRepresentation: {'names': ['x',
   'y',
   'z'],
  'units': [None, None, None]},
 astropy.coordinates.representation.UnitSphericalRepresentation: {'names': ('ra',
   'dec'),
  'units': (Unit("deg"), Unit("deg"))},
 astropy.coordinates.representation.RadialRepresentation: {'names': ['distance'],
  'units': [None]},
 astropy.coordinates.representation.SphericalRepresentation: {'names': ('ra',
   'dec',
   'distance'),
  'units': (Unit("deg"), Unit("deg"), None)},
 astropy.coordinates.representation.PhysicsSphericalRepresentation: {'names': ['phi',
   'theta',
   'r'],
  'units': [Unit("deg"), Unit("deg"), None]},
 astropy.coordinates.representation.CylindricalRepresentation: {'names': ['rho',
   'phi',
   'z'],
  'units': [None, Unit("deg"), None]},
 astropy.coordinates.representation.CartesianDifferential: {'names': ('v_x',
   'v_y',
   'v_z'),
  'units': (Unit("km / s"), Unit("km / s"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalDifferential: {'names': ('pm_ra',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalDifferential: {'names': ('pm_ra',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.RadialDifferential: {'names': ['d_distance'],
  'units': [None]},
 astropy.coordinates.representation.PhysicsSphericalDifferential: {'names': ['d_phi',
   'd_theta',
   'd_r'],
  'units': [None, None, None]},
 astropy.coordinates.representation.CylindricalDifferential: {'names': ['d_rho',
   'd_phi',
   'd_z'],
  'units': [None, None, None]}}

Здесь можно увидеть, что CartesianDifferential - единственное, что неверно, потому что в нем вообще установлены предпочтительные единицы измерения.

Это, вероятно, означает, что исправление в # 9086 в порядке с небольшой модификацией: нужно попытаться перейти к запрошенным модулям, но не заботиться о том, что это не удастся.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги