<p>Here is my attempt using Astropy. Spoiler alert: my answer differs from Tycho's by about 6 arcminutes.
That seems rather large, so there is probably an issue with my approach, but it also may be due to limitations in Astropy's model of axial precession for dates so far in the past, or inherent problems with simply linearly propagating the star's motion backwards in time.
Hopefully others here will chime in to help sort out these issues.</p>
<p>The code below uses <a href="https://astroquery.readthedocs.io/en/latest/" rel="nofollow noreferrer">Astroquery</a> to find the position, distance, and proper motion of Hamal in the ICRS reference frame using the Hipparcos catalog.</p>
<p>With that information, I use the <a href="https://docs.astropy.org/en/stable/coordinates/apply_space_motion.html" rel="nofollow noreferrer"><code>SkyCoord.apply_space_motion()</code></a> method suggested by @JamesK to calculate the Hamal's location in 1582.</p>
<p>Next, to apply @JamesK's suggestion of using refraction, convert Hamal's location into local altitude and azimuth at the Uraniborg using educated guesses for the barometric pressure, temperature, and humidity.</p>
<p>Finally, to account for precession of the equinoxes as pointed out by @JohnDoty, evaluate Hamal's location in the True Equator True Equinox (TETE) coordinate frame at the Uraniborg assuming no atmospheric refraction.</p>
<pre><code>import numpy as np
import astropy.units as u
import astropy.time
import astropy.constants
import astropy.coordinates
import astroquery.vizier

# Define the time of the observation
time = astropy.time.Time(&quot;1582-02-27T19:00&quot;)

# Define the location of the observation
location = astropy.coordinates.EarthLocation.of_address(&quot;Uraniborg&quot;)

# Define the barometric pressure at the observation site
# Assume 1 atmosphere since the Uraniborg is at sea level
pressure = 1 * astropy.constants.atm

# Define the temperature at the observation site.
# Assume 0 degrees Celsius since that seems like a
# reasonable average low temperature
temperature = 0 * u.deg_C

# Define the relative humidity at the observation site.
# Assume pretty high humidity since Uraniborg is near
# the ocean
humidity = 80 * u.percent

# Define the wavelength of the observation
# as the center of the human visible spectrum
wavelength = 550 * u.nm

# Query VizieR using astroquery to get the position
# and proper motion of Hamal from the Hipparcos catalog
query = astroquery.vizier.Vizier.query_object(
    object_name=&quot;Hamal&quot;,
    catalog=&quot;Hipparcos&quot;,
)[0]

# Express the query results in ICRS coordinates
hamal = astropy.coordinates.SkyCoord(
    ra=query[&quot;RAICRS&quot;],
    dec=query[&quot;DEICRS&quot;],
    distance=query[&quot;Plx&quot;],
    pm_ra_cosdec=query[&quot;pmRA&quot;],
    pm_dec=query['pmDE'],
    frame=&quot;icrs&quot;,
    obstime=astropy.time.Time(&quot;J1991.25&quot;),
    location=location,
    pressure=pressure,
    temperature=temperature,
    relative_humidity=humidity,
    obswl=wavelength,
)

# Determine Hamal's position at the observation time
hamal_obstime = hamal.apply_space_motion(time)

# Determine Hamal's apparent altitude and
# azimuth accounting for refraction
hamal_altaz = hamal_obstime.altaz

# Set pressure to zero to determine apparent position
# without accounting for refraction
hamal_apparent = hamal_altaz.replicate(pressure=0)

# Convert apparent position into the True Equator True 
# Equinox frame to account for precession of the equinoxes
hamal_tete = hamal_apparent.transform_to(
    astropy.coordinates.TETE(
        obstime=hamal_apparent.obstime,
        location=hamal_apparent.location
    )
)

print(hamal_tete.ra[0])
</code></pre>
<p>which outputs</p>
<pre><code>25d58m39.07454889s
</code></pre>
<p>Here is a <a href="https://colab.research.google.com/drive/100xFfSt7HMXLgEAs60Q0FfNihMpbyyE8?usp=sharing" rel="nofollow noreferrer">Google Colab Notebook</a> of the above code if you want to easily run it for yourself.</p>

CC BY-SA 4.0
2024-02-29T10:01:01.330Z
That is extraordinarily generous of you. I had begun experimenting with `astropy` and the answer I got was about 4 degrees (!) different from Tycho's report. I expect that by comparing your code with my own, I will learn a great deal.
CrimsonDark
CC BY-SA 4.0
2024-02-29T11:41:02.790Z
On an interesting historical note (given your own 7 minute difference), I read only yesterday that Kepler was able to fit a circular orbit to Tycho Brahe's observations ***for Mars*** ... but with an 8 minute error. He believed that 8 minutes might be expected of some observers, but definitely not from Tycho ... and saw that as evidence against a circular orbit. I realise that there are lots of ways that a model-fit to data from 440 years ago might go wrong, but you've given me a great start. –
CrimsonDark
CC BY-SA 4.0
2024-03-01T07:19:13.883Z
@CrimsonDark, I've edited my answer to try and account for atmospheric refraction but it only improves the discrepancy by about 1 arcminute. Still progress though!
Roy Smart
CC BY-SA 4.0
2024-02-29T06:20:07.350Z
2024-03-01T07:13:26.740Z
2024-03-01T07:13:26.740Z
Roy Smart
<p>Between 1582 and 1588, <a href="https://en.wikipedia.org/wiki/Tycho_Brahe" rel="nofollow noreferrer">Tycho Brahe</a> observed <a href="https://en.wikipedia.org/wiki/Hamal" rel="nofollow noreferrer"><span class="math-container">$\alpha$</span> Arietis</a> from <a href="https://en.wikipedia.org/wiki/Uraniborg" rel="nofollow noreferrer">Uraniborg</a> (55°54′28″N 12°41′48″E) on at least 27 separate occasions and made a record of the right ascension of the star (see <a href="https://archive.org/details/operaomniaedidit02brahuoft" rel="nofollow noreferrer">Opera Omnia</a>, pages 170-198). On February 27, 1582, for example, he recorded the position as 26 degrees, 4 minutes, 16 seconds, as shown in the image below.</p>
<p><a href="https://i.sstatic.net/tC3Cb.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/tC3Cb.png" alt="enter image description here" /></a></p>
<p>I'd like to determine the correct RA value for <span class="math-container">$\alpha$</span> Arietis on each of the dates that Tycho recorded an observation, cognizant of the fact that the star's proper motion is not insignificant. I'm also aware that Tycho made several, essentially paired, observations with the intention of balancing parallax errors.</p>
<p>I'm not a professional astronomer but I have looked at both <a href="https://en.wikipedia.org/wiki/Stellarium_%28software%29" rel="nofollow noreferrer">Stellarium</a> and <a href="https://en.wikipedia.org/wiki/Astropy" rel="nofollow noreferrer">astropy</a> as possible tools for doing the calculation. It looks as if astropy is likely to be the more suitable. I'm reasonably competent with Python but unfamilar with <code>astropy</code> so I have some questions:</p>
<ul>
<li>Am I correct in my assessment that <code>astropy</code> is likely provide a better approach than Stellarium</li>
<li>Am I correct in thinking that this is a calculation that should be reasonably easy in <code>astropy</code></li>
<li>How do I ensure that <code>astropy</code> uses a Julian calendar as I'm reasonably sure that the dates recorded by Tycho Brahe are Julian calendar dates. As far as I know, the Gregorian calendar was adopted in some parts of the world in 1582 but not in many protestant countries until much later.</li>
<li>Will <code>astropy</code> show a result &quot;properly&quot; biased by the parallax error that reflects what Tycho would be expected to have recorded (I hope I'm asking a sensible question here and not just showing my ignorance!)</li>
<li>What is the best way to set up the calculation given that this is the only astronomical calculation I need to do.</li>
</ul>
<p><strong>Added in response to the comment by @JohnDoty</strong></p>
<ul>
<li>Can (or <em>does</em>?) either <code>astropy</code> or <code>Stellarium</code> take account of the precession of the equinoxes. My understanding is that Tycho determined RA relative to the position of the vernal equinox as calculated from his own measurements.</li>
</ul>
<p><strong>Added data from the same publication. Dates and RA values</strong></p>
<pre><code>|1582|02|26|26|00|44
|1582|02|27|26|04|16
|1582|03|05|25|56|33
|1582|03|05|25|59|15
|1582|03|09|25|59|49
|1582|03|20|26|00|32
|1582|04|03|26|00|30
|1585|09|14|26|04|43
|1585|09|15|26|01|21
|1585|09|15|26|01|16
|1585|09|21|25|56|23
|1586|12|26|25|54|51
|1586|12|27|25|52|22
|1587|01|09|26|02|05
|1587|01|24|26|06|44
|1587|08|17|26|05|40
|1587|08|17|26|01|01
|1587|08|18|25|54|35
|1587|08|18|25|54|49
|1588|03|28|26|06|20
|1588|04|16|25|54|48
|1588|04|16|25|59|06
|1588|04|16|26|06|30
|1588|10|26|25|54|13
|1588|11|29|26|08|52
|1588|12|06|25|58|49
|1588|12|15|26|06|32
</code></pre>

CC BY-SA 4.0
2024-02-28T07:20:28.257Z
Thoughts:  Stellarium does have a proper motion model.  It is a linear model. Our uncertainty in the proper motion is of order 0.3 milliarcsec/yr. Even with the best model there is an uncertainty of more than an arcsec. The difference between Julian and Gregorian introduces a difference of about 5 mas (much less than the uncertainty) - can be neglected. Stellarium also has a parallax model.  Consider refraction.  This introduces further uncertainty in the calculation. Less sure of astropy, but I think it uses the same linear model. But model errors are less than uncertainty in proper motion
James K
CC BY-SA 4.0
2024-02-28T07:22:05.170Z
See https://docs.astropy.org/en/stable/coordinates/apply_space_motion.html for how to apply space motion in astropy.
James K
CC BY-SA 4.0
2024-02-29T00:50:03.217Z
Right ascension? Beware of precession of the equinoxes.  https://en.wikipedia.org/wiki/Axial_precession
John Doty
<astropy><right-ascension>
Position of Hamal (alpha Arietis) between 1582 and 1588
CrimsonDark
# Position of Hamal (alpha Arietis) between 1582 and 1588

(Asked by: username_0 on 2024-02-28)

Between 1582 and 1588, Tycho Brahe observed $\alpha$ Arietis from Uraniborg (55°54′28″N 12°41′48″E) on at least 27 separate occasions and made a record of the right ascension of the star (see Opera Omnia, pages 170-198). On February 27, 1582, for example, he recorded the position as 26 degrees, 4 minutes, 16 seconds, as shown in the image below.

I'd like to determine the correct RA value for $\alpha$ Arietis on each of the dates that Tycho recorded an observation, cognizant of the fact that the star's proper motion is not insignificant. I'm also aware that Tycho made several, essentially paired, observations with the intention of balancing parallax errors.
I'm not a professional astronomer but I have looked at both Stellarium and astropy as possible tools for doing the calculation. It looks as if astropy is likely to be the more suitable. I'm reasonably competent with Python but unfamilar with astropy so I have some questions:

Am I correct in my assessment that astropy is likely provide a better approach than Stellarium
Am I correct in thinking that this is a calculation that should be reasonably easy in astropy
How do I ensure that astropy uses a Julian calendar as I'm reasonably sure that the dates recorded by Tycho Brahe are Julian calendar dates. As far as I know, the Gregorian calendar was adopted in some parts of the world in 1582 but not in many protestant countries until much later.
Will astropy show a result "properly" biased by the parallax error that reflects what Tycho would be expected to have recorded (I hope I'm asking a sensible question here and not just showing my ignorance!)
What is the best way to set up the calculation given that this is the only astronomical calculation I need to do.

Added in response to the comment by @JohnDoty

Can (or does?) either astropy or Stellarium take account of the precession of the equinoxes. My understanding is that Tycho determined RA relative to the position of the vernal equinox as calculated from his own measurements.

Added data from the same publication. Dates and RA values
|1582|02|26|26|00|44
|1582|02|27|26|04|16
|1582|03|05|25|56|33
|1582|03|05|25|59|15
|1582|03|09|25|59|49
|1582|03|20|26|00|32
|1582|04|03|26|00|30
|1585|09|14|26|04|43
|1585|09|15|26|01|21
|1585|09|15|26|01|16
|1585|09|21|25|56|23
|1586|12|26|25|54|51
|1586|12|27|25|52|22
|1587|01|09|26|02|05
|1587|01|24|26|06|44
|1587|08|17|26|05|40
|1587|08|17|26|01|01
|1587|08|18|25|54|35
|1587|08|18|25|54|49
|1588|03|28|26|06|20
|1588|04|16|25|54|48
|1588|04|16|25|59|06
|1588|04|16|26|06|30
|1588|10|26|25|54|13
|1588|11|29|26|08|52
|1588|12|06|25|58|49
|1588|12|15|26|06|32

**Tags:** astropy, right-ascension
> **Comments:**
> **username_1**: Thoughts:  Stellarium does have a proper motion model.  It is a linear model. Our uncertainty in the proper motion is of order 0.3 milliarcsec/yr. Even with the best model there is an uncertainty of more than an arcsec. The difference between Julian and Gregorian introduces a difference of about 5 mas (much less than the uncertainty) - can be neglected. Stellarium also has a parallax model.  Consider refraction.  This introduces further uncertainty in the calculation. Less sure of astropy, but I think it uses the same linear model. But model errors are less than uncertainty in proper motion  
> **username_1**: See https://docs.astropy.org/en/stable/coordinates/apply_space_motion.html for how to apply space motion in astropy.  
> **username_2**: Right ascension? Beware of precession of the equinoxes.  https://en.wikipedia.org/wiki/Axial_precession  

---

## 1 answers

### Answer by username_3 on 2024-02-29. Score: 4

Here is my attempt using Astropy. Spoiler alert: my answer differs from Tycho's by about 6 arcminutes.
That seems rather large, so there is probably an issue with my approach, but it also may be due to limitations in Astropy's model of axial precession for dates so far in the past, or inherent problems with simply linearly propagating the star's motion backwards in time.
Hopefully others here will chime in to help sort out these issues.
The code below uses Astroquery to find the position, distance, and proper motion of Hamal in the ICRS reference frame using the Hipparcos catalog.
With that information, I use the SkyCoord.apply_space_motion() method suggested by @JamesK to calculate the Hamal's location in 1582.
Next, to apply @JamesK's suggestion of using refraction, convert Hamal's location into local altitude and azimuth at the Uraniborg using educated guesses for the barometric pressure, temperature, and humidity.
Finally, to account for precession of the equinoxes as pointed out by @JohnDoty, evaluate Hamal's location in the True Equator True Equinox (TETE) coordinate frame at the Uraniborg assuming no atmospheric refraction.
import numpy as np
import astropy.units as u
import astropy.time
import astropy.constants
import astropy.coordinates
import astroquery.vizier

# Define the time of the observation
time = astropy.time.Time("1582-02-27T19:00")

# Define the location of the observation
location = astropy.coordinates.EarthLocation.of_address("Uraniborg")

# Define the barometric pressure at the observation site
# Assume 1 atmosphere since the Uraniborg is at sea level
pressure = 1 * astropy.constants.atm

# Define the temperature at the observation site.
# Assume 0 degrees Celsius since that seems like a
# reasonable average low temperature
temperature = 0 * u.deg_C

# Define the relative humidity at the observation site.
# Assume pretty high humidity since Uraniborg is near
# the ocean
humidity = 80 * u.percent

# Define the wavelength of the observation
# as the center of the human visible spectrum
wavelength = 550 * u.nm

# Query VizieR using astroquery to get the position
# and proper motion of Hamal from the Hipparcos catalog
query = astroquery.vizier.Vizier.query_object(
    object_name="Hamal",
    catalog="Hipparcos",
)[0]

# Express the query results in ICRS coordinates
hamal = astropy.coordinates.SkyCoord(
    ra=query["RAICRS"],
    dec=query["DEICRS"],
    distance=query["Plx"],
    pm_ra_cosdec=query["pmRA"],
    pm_dec=query['pmDE'],
    frame="icrs",
    obstime=astropy.time.Time("J1991.25"),
    location=location,
    pressure=pressure,
    temperature=temperature,
    relative_humidity=humidity,
    obswl=wavelength,
)

# Determine Hamal's position at the observation time
hamal_obstime = hamal.apply_space_motion(time)

# Determine Hamal's apparent altitude and
# azimuth accounting for refraction
hamal_altaz = hamal_obstime.altaz

# Set pressure to zero to determine apparent position
# without accounting for refraction
hamal_apparent = hamal_altaz.replicate(pressure=0)

# Convert apparent position into the True Equator True 
# Equinox frame to account for precession of the equinoxes
hamal_tete = hamal_apparent.transform_to(
    astropy.coordinates.TETE(
        obstime=hamal_apparent.obstime,
        location=hamal_apparent.location
    )
)

print(hamal_tete.ra[0])

which outputs
25d58m39.07454889s

Here is a Google Colab Notebook of the above code if you want to easily run it for yourself.

> **Comments:**
> **username_0**: That is extraordinarily generous of you. I had begun experimenting with `astropy` and the answer I got was about 4 degrees (!) different from Tycho's report. I expect that by comparing your code with my own, I will learn a great deal.  
> **username_0**: On an interesting historical note (given your own 7 minute difference), I read only yesterday that Kepler was able to fit a circular orbit to Tycho Brahe's observations ***for Mars*** ... but with an 8 minute error. He believed that 8 minutes might be expected of some observers, but definitely not from Tycho ... and saw that as evidence against a circular orbit. I realise that there are lots of ways that a model-fit to data from 440 years ago might go wrong, but you've given me a great start. –  
> **username_3**: @CrimsonDark, I've edited my answer to try and account for atmospheric refraction but it only improves the discrepancy by about 1 arcminute. Still progress though!  

---

