Eclipses

Chapter 1

Calculating positions

A solar eclipse happens at new moon, a lunar eclipse at full moon. Each of these happens every month, but most months bring neither eclipse. The reason is the plane of the Moon’s orbit, tilted about five degrees from the plane of Earth’s orbit, where the Sun also lies.

Seen from Earth, the Moon’s apparent path across the sky crosses the ecliptic, the Sun’s own apparent path, at this angle of about five degrees. An eclipse can happen if the Moon is at that crossing point, the node, at new or full moon. Usually the Moon passes well to one side or the other of the Sun (or of Earth’s shadow). We begin with the moments of new moon, that is, with solar eclipses; lunar eclipses come later.

1.1 Positions in the sky

Let us see how this looks in two cases: May 2027, when the new moon passes well to the north of the Sun, and August 2027, when the Moon’s path crosses the ecliptic at about the time of new moon and a solar eclipse follows.

Figure 1.1:

The Moon’s path against the stars as it passes the Sun at new moon in May and August 2027. The May new moon falls where the Moon’s orbit is at its greatest tilt in the direction of the Sun. The Moon passes the Sun by more than five degrees. The August new moon lies in the direction of the crossing of the two orbital planes, the node. An eclipse can occur when the Sun is close enough to a node at the moment of new moon.

Because the position of the Moon (and of the Sun) against the stars varies a little with where on Earth the observer is, the view in figure 1.1 is geocentric, that is, calculated as seen from the centre of Earth.

To know whether an eclipse happens, we first have to find the moments of new moonThe moment of new moon is taken to be the instant when the Moon and the Sun have the same ecliptic longitude., calculate the angular separation between the Sun and the Moon, and work out some limits for whether an eclipse can happen anywhere on Earth.

First we change coordinates from equatorial to ecliptic, making the Sun’s path in figure 1.1 the new x axis. The Moon moves against the stars much faster than the Sun. The Moon covers its own diameter in about an hour, the Sun in about 12 hours.

Figure 1.2: The previous figure in ecliptic coordinates. The Sun’s longitude is set to zero at its position at the moment of new moon. The Sun’s own motion is drawn in as well.

Let us look at August more closely.

Figure 1.3: The moment of the August new moon seen closer up. In the geocentric view the Moon partly covers the Sun, so an eclipse clearly happens somewhere on Earth.

The figure shows that, at least as seen from the centre of Earth, an eclipse would happen if the angular separation between the centres of the Sun and the Moon is smaller than the sum of their apparent radii. In August this appears to be the case. It is also apparent that at this new moon the closest approach does not fall at the moment of new moon itself but a little after it, because the Moon’s path runs downward and to the left.

1.2 Brute force

Since calculating the positions of the bodies at a given instant is easy with a computer, let us simply find the angle between them as a function of time.

Code for the angular separation, using Skyfield
from skyfield.api import load

ts = load.timescale()
eph = load('de440s.bsp')
earth = eph['earth']
sun, moon = eph['sun'], eph['moon']

t = ts.utc(2027, 8, 2, 9, range(5, 126, 10))
p = earth.at(t)
s = p.observe(sun).apparent()
m = p.observe(moon).apparent()
sep = s.separation_from(m).degrees

for ti, deg in zip(t, sep):
    stamp = ti.utc_strftime('%Y-%m-%d %H:%M')
    print(f"{stamp} - {deg:.2f}")
2027-08-02 09:05 - 0.63
2027-08-02 09:15 - 0.53
2027-08-02 09:25 - 0.44
2027-08-02 09:35 - 0.35
2027-08-02 09:45 - 0.26
2027-08-02 09:55 - 0.19
2027-08-02 10:05 - 0.15
2027-08-02 10:15 - 0.17
2027-08-02 10:25 - 0.23
2027-08-02 10:35 - 0.32
2027-08-02 10:45 - 0.41
2027-08-02 10:55 - 0.50
2027-08-02 11:05 - 0.60
Figure 1.4:

The angular separation between the Moon and the Sun on 2027-08-02.

Figure 1.4 shows that the separation stays below 0.5° (an eclipse happens), and a trained eye may notice that the least angular separation falls a little to the right of the lowest point.

It may not feel like it on a modern computer, but we are still going about this far too laboriously. We have to compute the positions of the Sun and the Moon many times over for this one new moon. On top of that, every separation in the curve has been computed in spherical coordinates, with a needlessly awkward formula.The spherical law of cosines (haversine):

where = right ascension, declination.
Finding the exact moment of least angular separation would mean fitting some sort of hyperbola to the points above, or else reaching for a minimisation algorithm.

If you had to work these out with a pencil, paper and a slide rule, you would never go about it this way. There are at least two obvious shortcuts.

First, the ecliptic is the equator of the spherical coordinate system we have chosen (a great circle), and everything of interest to us happens within a few degrees of it. We may as well forget spherical coordinates altogether and work the thing out in rectangular ones (which is how the figures above are drawn in any case).

Second, the motions of the Sun and the Moon close to new moon are very steady and linear.How linear? Below are the ecliptic longitude of the Moon and of the Sun, and the ecliptic latitude of the Moon, for an hour either side of new moon. Moon's longitude+0.63°−0.63°±1 hSun's longitude+0.04°−0.04°±1 hMoon's latitude+0.20°+0.09°±1 h

1.3 The least angular separation

Let us put these two approximations to use and look at the positions of the Moon and the Sun near the node. For the original derivation, see Explanatory Supplement section 11.2.2 and figure 11.1.

Figure 1.5:

The Sun and the Moon in rectangular coordinates: S and M at the moment of new moon, S′ and M′ a moment later. Also shown are the separation σ, the node N and the inclination I of the Moon’s orbit. is the Moon’s latitude at the moment of new moon. Neither the scale nor the ratio of the speeds is true to life.

We would like to compute σ, and above all its least valueThe slanted dotted line in figure 1.5.. For that we invent a new quantity: the ratio λ of the “horizontal rates” of the Moon and the Sun. Note that both bodies move at a steady rate.

The derivation, step by step

From the right triangle

Let us find both legs. From the triangle

and by the definition of λ, so

From the triangle , in turn, and since

Substituting both:

The least value is where the derivative of this vanishes. Since depends on the angle only through its tangent, it is enough to differentiate with respect to the tangent:

from which

Write for the denominator. Then that is

Substituting back into the expression for σ² gives

since what stands inside the brackets is .

The least angular separation comes out as

We could get by with this, but let us make one more change of variables, which will turn out to be very enlightening. Define

The angle is the angle at which the Moon’s path would appear to cross the ecliptic if the coordinate system were fixed to the Sun.

Figure 1.6:

When the coordinate system travels with the Sun, the Moon appears to cross the ecliptic at the angle .

Figure 1.7:

The same situation drawn in a stationary coordinate system fixed to the Sun. The least angular separation is now easy to determine.

Expressed with the angle , the least angular separation is now simply

1.4 A worked example

Let us now compute the least angular separations in practice. First we find every moment of new moon in 2027:

Code for finding the moments of new moon, using Skyfield
from skyfield import almanac
from skyfield.api import load

ts = load.timescale()
eph = load('de440s.bsp')

t0, t1 = ts.utc(2027, 1, 1), ts.utc(2028, 1, 1)
t, phase = almanac.find_discrete(t0, t1, almanac.moon_phases(eph))

for ti in t[phase == 0]:
    print(ti.utc_strftime('%Y-%m-%d %H:%M'))
2027-01-07 20:24
2027-02-06 15:56
2027-03-08 09:29
2027-04-06 23:51
2027-05-06 10:59
2027-06-04 19:40
2027-07-04 03:02
2027-08-02 10:05
2027-08-31 17:41
2027-09-30 02:36
2027-10-29 13:37
2027-11-28 03:24
2027-12-27 20:12

Next we determine , , and for each moment of new moon The speeds and the angle I are found numerically: both positions are computed one minute before and one minute after the moment of new moon. The ratio of the motions in longitude gives λ, and the change in the Moon’s latitude divided by the change in its longitude gives tan I. , and from them the least angular separation:

Code for the least angular separation
# continue from previous
from numpy import arctan, cos
from skyfield.framelib import ecliptic_frame

earth, sun, moon = eph['earth'], eph['sun'], eph['moon']

def lonlat(body, ti):
    lat, lon, _ = earth.at(ti).observe(body).apparent().frame_latlon(ecliptic_frame)
    return lon.degrees, lat.degrees

def wrap(d):
    return (d + 180) % 360 - 180

for ti in t[phase == 0]:
    a, b = ts.tt_jd(ti.tt - 1 / 1440), ts.tt_jd(ti.tt + 1 / 1440)
    ml_a, mb_a = lonlat(moon, a)
    ml_b, mb_b = lonlat(moon, b)
    sl_a, _ = lonlat(sun, a)
    sl_b, _ = lonlat(sun, b)

    beta = lonlat(moon, ti)[1]
    lam = wrap(ml_b - ml_a) / wrap(sl_b - sl_a)
    tan_I = (mb_b - mb_a) / wrap(ml_b - ml_a)
    I_ = arctan(lam / (lam - 1) * tan_I)
    sigma = abs(beta) * cos(I_)

    print(f"{ti.utc_strftime('%Y-%m-%d %H:%M')} - {sigma:.3f}")
2027-01-07 20:24 - 2.862
2027-02-06 15:56 - 0.267
2027-03-08 09:29 - 2.380
2027-04-06 23:51 - 4.303
2027-05-06 10:59 - 5.006
2027-06-04 19:40 - 4.362
2027-07-04 03:02 - 2.586
2027-08-02 10:05 - 0.145
2027-08-31 17:41 - 2.352
2027-09-30 02:36 - 4.252
2027-10-29 13:37 - 5.002
2027-11-28 03:24 - 4.316
2027-12-27 20:12 - 2.338

The two smallest separations in the list fall in February and August (the lines in bold). A solar eclipse happens in those two months. In the next chapter we set about finding the exact limits that decide it.