In my asterisms project I want to see what the night sky used to look like for ancient civilizations as well as what it is going to look like in the future. This notebook was inspired by a paper I found by Matt Jones and took some unexpected turns. I documented the whole process, even my mental wrangling of celestial concepts, because hopefully it helps some amateur astronomers to understand by the following examples.
My initial goal is to view the stars in the far-flung future, and in the ancient past. To roll back time for constellations, we'll need to consider the proper motion of the stars. I found a recent paper by Matt Jones (2014) on the subject and wanted to try it out for myself.
%pylab inline
%matplotlib inline
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
Populating the interactive namespace from numpy and matplotlib
def alphaUM(time):
originalX = -61.3
velocityX = -12.9
originalY = 46.7
velocityY = -20.5
originalZ = 96.7
velocityZ = -9.65
KMtoLY = 1.05702341*10**-13
newX = originalX + velocityX*KMtoLY*time
newY = originalY + velocityY*KMtoLY*time
newZ = originalZ + velocityZ*KMtoLY*time
fig = pylab.figure()
ax = Axes3D(fig)
ax.plot([originalX], [originalY], [originalZ], 'd')
ax.plot([newX], [newY], [newZ], 'd')
pylab.axis('equal')
#fig.savefig('alphaUM.png')
return newX, newY, newZ
alphaUM(100000)
(-61.30000013635602, 46.699999783310204, 96.69999989799724)
Sweet! Pretty simple. Let's do this for all of the Ursa Major stars now. All of the stars happen to be in the PyEphem stars database so we'll leverage that. Although Alcor isn't listed as part of the Ursa Major constellation, I wanted to include it because it is a binary with the Mizar system. It is crazy, their combined system is actually a sextuple system.
import ephem
UMa = {
'dubhe': 'αUMa', #HIP 54061
'merak': 'βUMa', #HIP 53910
'phecda':'γUMa', #HIP 58001
'megrez':'δUMa', #HIP 59774
'alioth':'εUMa', #HIP 62956
'mizar': 'ζUMa', #HIP 65378
'alcor': '80UMa',#HIP 65477
'alcaid':'ηUMa', #HIP 67301
}
def const(const,year=None,epoch='2000',title=None):
s = []
for star in const.keys():
s.append(ephem.star(star.capitalize()))
for i in range(len(s)):
if(year!=None):
s[i].compute(year,epoch=epoch)
else:
s[i].compute(epoch=epoch)
tau = 2.0 * pi
degree = tau / 360.0
hour = tau / 24.0
ra_list = [star.a_ra / hour for star in s]
dec_list = [star.a_dec / degree for star in s]
mag_array = np.array([star.mag for star in s])
size_array = (5 - mag_array) ** 1.5 * 4
scatter(ra_list,dec_list,size_array)
if(title!=None):
pyplot.title(title)
gca().xaxis.grid(True)
gca().yaxis.grid(True)
gca().invert_xaxis()
return s
Note that we are using a_ra
and a_dec
instead of just ra
and dec
. If you swapped out a_ra
with ra
you wouldnt see a difference in the values between the epochs. Why is this? a_ra
/a_dec
are the astronomical geocentric position for the star atlas epoch you've specified, while ra
/dec
are the apparent topocentric position for the epoch-of-date. Additionally, there is a third g_ra
and g_dec
which are the apparent geocentric positions for the epoch-of-date. See the full explanation on how these three positions differ.
Below are different combinations of varying the year and epoch for the Big Dipper constellation. In the examples that keep the epoch as the default J2000
, we are able to reproduce the results seen by many sky plotting programs. Specifically, we see the same result as documented by Ian Ridpath and Rick Pogge. I recommend watching their animations, because it makes the transitions between depictions easier to see.
ancient_uma = const(UMa,year='-100000',epoch='-100000')
#savefig('uma_ancient_epoch.png')
ancient_uma = const(UMa,year='-100000',title='Butterfly Net')
#savefig('uma_ancient.png')
present_uma = const(UMa,year='2014',epoch='2014',title='Current Big Dipper (Epoch 2014)')
#savefig('uma_present_epoch.png')
present_uma = const(UMa,year='2014',title='Big Dipper (Epoch 2000)')
#savefig('uma_present.png')
future_uma = const(UMa,year='100000',epoch='100000')
#savefig('uma_future_epoch.png')
future_uma = const(UMa,year='100000',title='Dustpan')
#savefig('uma_future.png')
Ian Ridpath gives a talk, Pictures in the sky: the origin and history of the constellations, that displays an animation of the same transition. See the video at t=2563. Jones got his images from Rick Pogge's video and lecture which was output from his Fortran code.
I read the PyEphem tutorial section on fixed objects, precession, and epochs. This computes the position of Halley's Comet in 1066.
halley.compute(epoch='1066')
This is probably useless: it computes the current position of halley, but returns coordinates relative to the direction the earth’s axis was pointing in the year 1066. Unless you use a Conquest-era star atlas, this is not useful.
halley.compute('1066', epoch='1066')
This is slightly more promising: it computes the position of halley in 1066 and returns coordinates for the orientation of the earth in that year. This might help you visualize how the object was positioned above contemporary observers, who considered it an ill omen in the imminent conflict between King Harold of England and William the Bastard. But to plot this position against a background of stars, you would first have to recompute each star’s position in 1066 coordinates.
halley.compute('1066')
This is what you will probably use most often; you get the position of halley in the year 1066 but expressed in the 2000 coordinates that your star atlas probably uses.
I am a little confused by Jones and Ridpath's results. Although I am happy that we can get the stellar dustpan and butterfly net they talk about, why are they using coordinates relative to our current position? Wouldnt using the ancient epoch and far flung future epoch and year give results for how ancient or future man would see these stars instead? Based on the second Halley's Comet example Brandon Rhodes gives, I am going to go with the following as what I think the depictions of the precession of the Big Dipper are.
Some additional food for thought:
The first assumption is that the brightness of each star will remain constant so that the predominant stars in the night sky will remain the predominant ones in the future (and would have been similar in the past). The second assumption is that no star will reach the end of its life and thus completely disappear and that no new bright stars will form (and thus create an added point in the constellation). These combine to also assume that the gravitational tug among and between stars will also remain constant.
Matt notes some assumptions; and although discovering stars that have ceased to exist or predicting star formation is probably just a fantasy, we do know of some observed changes in the stars such as Betelguese. Betelgeuse was described as red by Ptolemy, but described as yellow by the ancient Chinese. This suggests that before it was a red super giant it was a yellow super giant.
Hopefully we will find an Atlantian library with ancient star charts, but until then we can calculate the change in apparent magnitude using distance calculations.
To update you on this subject, the big-dipper.ipynb (nbviewer) notebook shows the different iterations of varying epochs and years. It also shows how to display constellation line segments, and can handle wrapping constellations like the iau-bounds.ipynb (nbviewer) notebook. What we find out in subsequent notebooks is that the above method of varying date and epoch together is correct. However, the depiction is broken due to the precession model being implemented. In far-flung-proper-motion.ipynb (nbviewer) I find out why this happens, and in vondrak.ipynb (nbviewer) I implement a long-term precession model that works for hundreds of thousands of years.