Einige der Corner-Case-Tests in #6944 zeigten ein problematisches Verhalten für Frames mit Geschwindigkeiten, bei denen die tatsächliche Darstellung UnitSpherical
. Es stellt sich heraus, dass dies wahr ist. Die folgenden Fälle veranschaulichen das Problem:
Beachten Sie auch, dass wenn #6944 zusammengeführt wird, es einige Stellen mit Workarounds für diesen Fehler gibt. Wenn dieser Fehler behoben ist, sollten diese Problemumgehungen entfernt werden (durchsuchen Sie das Unterpaket coordinates
nach #7028
, um sie zu finden).
Das funktioniert:
>>> f = ICRS(1*u.deg, 2*u.deg)
>>> f.cartesian
<CartesianRepresentation (x, y, z) [dimensionless]
( 0.99923861, 0.01744177, 0.0348995)>
Aber diese beiden Fälle nicht:
>>> 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
Es ist wahrscheinlich ein nützlicher Hinweis , dass in dem zweiten andernfalls Fall f.cartesian
funktioniert, aber etwas in der Transformation zu GCRS ist , was es anfängt , Fehler macht. Es ist möglich, dass dies subtil unterschiedliche Probleme sind, aber sie liegen nahe genug beieinander, dass sie wahrscheinlich gemeinsam gelöst werden müssen.
@adrn oder @mhvk , hast du eine Ahnung, was hier los ist? Man könnte argumentieren, dass zumindest der obige Transformationsschritt etwas undefiniert ist, aber man sollte immer noch in der Lage sein, die kartesische Darstellung herauszubekommen, auch wenn die Einheiten etwas seltsam sind ...
Hallo @eteq ,
Ich habe versucht, an diesem Problem zu arbeiten. Aber im Beispielfall
>>> 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)
Das Beispiel enthält kein distance
, sondern ein radial_velocity
. Ich habe nicht verstanden, was es genau bedeutet. Auch wenn ich etwas Abstand in den Rahmen setze, funktioniert es perfekt!
Können Sie mir das Problem bitte verständlich machen, ich bin verwirrt.
@shreyasbapat Könnten Sie bitte versuchen zu sehen, ob https://github.com/astropy/astropy/pull/9064 dieses Problem behebt? (Edit: tut es nicht)
>>> 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
Ich denke, diese Frage ist unlösbar: Ohne Abstand kann man eine Eigenbewegung nicht in eine Raumgeschwindigkeit oder eine Raumgeschwindigkeit in eine Winkelgeschwindigkeit umwandeln. Ich denke, für diesen Fall müssen wir einfach sicherstellen, dass die Fehlermeldung klarer ist (ausgelöst durch ein Wohnmobil, aber keine Entfernung).
>>> 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)>
Das ist etwas subtiler. Ohne Eigenbewegung ist g
UnitSpherical
, was Sinn macht, und hier sollte es auch so sein, also stimmt etwas mit der Transformation nicht. Der Vollständigkeit halber funktioniert die Darstellung auf der Einheitskugel:
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)>
Aber trotzdem sollte g.cartesian
funktionieren - hier ist das Problem, dass Frames für den Benutzer entscheiden, welche Einheiten sinnvoll sind, und darauf bestehen, dass eine kartesische Geschwindigkeit in km/s
(natürlich geht das zurück auf meine langjährige Beschwerde, dass Koordinateneinheiten in der Darstellung für mich entschieden werden...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753
Die Einheiten selbst stammen von:
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]}}
Man sieht hier, dass CartesianDifferential
das einzige ist, das falsch ist, weil es überhaupt bevorzugte Einheiten gesetzt hat.
Was wahrscheinlich bedeutet, dass der Fix in #9086 mit einer kleinen Modifikation in Ordnung ist: Man sollte versuchen , zu den angeforderten Einheiten zu gelangen, aber es ist egal, ob dies fehlschlägt.