Science Journaling Club Founded 2024

VOLUME 2, ISSUE 3 · SPRING 2026 · ORIGINAL RESEARCH

Computing the Sunlight That Started and Ended the Ice Ages

Written jointly by the Science Journaling Club

Computational study · Peer-edited by the club review board · LaTeX source · Analysis code · Raw output · Interactive model

Abstract The amount of sunlight falling on the top of the atmosphere at any latitude on any day is a geometry problem with four inputs and no physics in it at all. We solved it, and then ran it across the past million years. The instrument was a Python file the club wrote; the only thing we did not compute ourselves is the orbit, which comes from the published La2004 solution of Laskar and colleagues, downloaded on 14 September 2026 and cached with its checksum. Summer solstice insolation at 65°N came out at 477.94 W/m² today and has ranged over 128.25 W/m² in the past million years, from 430.53 at 231 kyr BP to 558.78 at 958 kyr BP, a swing of 26.0% of the mean. Before trusting any of that we set the formula against six closed forms derived independently: the global annual mean came out 340.297512 against an exact 340.297470 W/m², the equatorial annual mean agreed with an elliptic-integral expression to 5.7×10−14, and a Monte Carlo integration over the sphere that never touches the daily formula landed 1.50 standard errors away on 4,000,000 samples. Transcribing Laskar's own Fortran subroutine and running it beside ours gave a maximum disagreement of 2.8×10−13 W/m² over a grid of 130,501 points. Varying each orbital parameter alone across its million-year range, the perihelion angle moves 65°N solstice insolation by 114.53 W/m² at maximum eccentricity and by nothing at all at zero eccentricity, obliquity by 37.97, and eccentricity on its own by 46.98. The spectrum of the resulting curve puts 81.26% of its variance in the precession band and 17.74% in the obliquity band, and it recovers the precession triplet at 23.83, 22.24 and 18.89 kyr and the obliquity line at 41.71 kyr, with 0–5 Myr windows sharpening those to 23.701 and 40.992 kyr. The 75 to 135 kyr band holds 0.07%. The nine glacial terminations of the LR04 age model sit a mean 1.78 kyr from the nearest maximum of our curve against 5.52 kyr for random dates, which is an alignment no set of nine random dates matched in 20,000 draws. It is also partly circular, and the section on the strongest objection says why. The curve offers 46 maxima over the million years. The ice offered nine. Seed 20260320.

A Geometry Problem With Ice Sheets In It

Nothing in this article required looking at anything. That is the part worth sitting with for a moment. Ice sheets two miles thick advanced across North America and Europe and then collapsed, nine times in the last million years, and the timing of it can be attacked with a protractor and an ellipse. No thermometer. No core. Four numbers about where the Earth is and which way it is tipped, and out the other end comes a curve whose peaks fall within a couple of thousand years of when the ice went away.

The quantity is insolation: watts per square metre arriving at the top of the atmosphere, averaged over one rotation of the planet. It depends on latitude, on the time of year, and on three slow properties of the orbit. How elliptical the orbit is, which is eccentricity. How far the spin axis is tipped over, which is obliquity. And which season the Earth happens to be passing closest to the Sun in, which is precession. All three drift on timescales of tens of thousands of years, and Milankovitch's argument, made in the 1920s and 1930s and set out at length in 1941 [1], was that the sunlight reaching the high northern summer is what decides whether last winter's snow survives until autumn.

477.94W/m², 65N June solstice, today
128.25W/m² range, past million years
81.26%of that variance is precession
0.07%is in the 100 kyr band

That last figure is the reason this article is not a victory lap. The most conspicuous rhythm in the ice record of the last 800,000 years is a sawtooth roughly 100,000 years long. The insolation curve we computed does not have it. Not weakly. It has seven hundredths of one percent of its power in that band, which is to say it is absent, and everybody who works on this has known so since Hays, Imbrie and Shackleton published the spectra of a deep-sea core in 1976 and found the orbital frequencies sitting in the sediment exactly where theory said, plus one big peak that had no business being there [2].

So this is a study with a clean result and an open ending. The geometry is exact, the arithmetic checks out to thirteen decimal places against closed forms, the orbital periods fall out of a Fourier transform without being asked for, the alignment with the terminations is real and is also partly an artefact of how those terminations were dated. We will take all of that in turn.

What the Formula Actually Says

Start with a flat patch of ground facing straight up. The power it collects is the solar constant, reduced by the inverse square of the current distance to the Sun, times the cosine of the angle between the Sun and the vertical. Average that over twenty-four hours, throwing away the hours when the Sun is below the horizon, and you have the daily-mean insolation:

$$Q = \frac{S_0}{\pi}\left(\frac{a}{r}\right)^{2} \Big[H_0 \sin\phi \sin\delta + \cos\phi \cos\delta \sin H_0\Big]$$

Three pieces do all the work. The declination \(\delta\), which is how far north or south of the equator the Sun stands, given by \(\sin\delta = \sin\varepsilon \sin\lambda\) with \(\varepsilon\) the obliquity and \(\lambda\) the Sun's longitude around the year. The sunset hour angle \(H_0 = \arccos(-\tan\phi\tan\delta)\), which is half the length of the day in radians. And the distance \(r/a = (1-e^2)/(1 - e\cos(\lambda - \varpi))\), where \(e\) is the eccentricity and \(\varpi\) locates perihelion.

The arccosine is the elegant bit. When \(-\tan\phi\tan\delta\) exceeds 1 there is no solution, which is polar night, and clamping it to 1 gives \(H_0 = 0\) and \(Q = 0\) with no special case required. When it falls below \(-1\) the Sun never sets, and clamping gives \(H_0 = \pi\) and \(Q = S_0 (a/r)^2 \sin\phi\sin\delta\). Two of the more dramatic facts about the polar regions come out of one clipped arccosine.

Converting \(\lambda\) into a calendar date needs Kepler's equation, because the Earth does not move around the ellipse at a constant rate. We solve \(M = E - e\sin E\) by Newton iteration and measure days from the northward equinox. The headline number avoids the whole question by using the June solstice, defined as \(\lambda = 90^\circ\) exactly, which is an astronomical event and carries no calendar convention at all.

-90 -60 -30 0 +30 +60 +90 0 60 120 180 240 300 360 50 150 250 350 450 500 65 N 477.9 equinox June sol equinox Dec sol days since the northward equinox latitude (degrees) Daily-mean insolation at the top of the atmosphere, W/m2, today's orbit contours labelled in W/m2; shaded = polar night, where the Sun never rises at all
Figure 1. The whole function, on today's orbit. Latitude runs up the page, the year runs across it. Contours are daily-mean insolation in W/m². Two things are worth staring at. The 500 contour closes around the north pole in late June and the 550 contour closes around the south pole in December, which is to say the summer pole is the sunniest place on the planet on a daily basis, beating the equator by a factor of 1.36 at solstice, because a twenty-four hour day at a poor angle beats a twelve hour day at a good one. And the southern maximum is the higher of the two, 559.47 against 524.18 W/m², purely because Earth is near perihelion in December. The dashed line is 65°N; the dot on it is the 477.94 W/m² that the rest of this article follows through a million years.

The solar constant enters as a simple multiplier, and we used 1361 W/m² from the TIM radiometer recalibration of Kopp and Lean [3]. Most of the older insolation literature uses 1365 or 1368; Laskar's own parameter file ships with 1368. Every absolute number in this article scales linearly with that choice, and every relative number, every percentage and every spectral share, is untouched by it.

The Arithmetic

Plain numbers, then. This section has no argument in it.

Today: eccentricity 0.0167024, obliquity 23.43929°, longitude of perihelion 102.9179°. Those are row zero of the La2004 file.

The June solstice falls 92.758 days after the northward equinox. The Earth is then 1.016265 semi-major axes from the Sun. The declination is 23.43929°. At 65°N the sunset hour angle is 2.7646 radians, so the day is 21 hours 7 minutes long. Multiply it out: 477.936747 W/m².

The December solstice falls 276.248 days after the equinox, at a distance of 0.983707. Northern summer, equinox to equinox, runs 186.406 days. Southern summer runs 178.836. The difference is 7.570 days, and it is not a rounding artefact; it is why northern autumn feels short.

Annual means, today: 415.596 W/m² at the equator, 172.349 at either pole, 340.298 averaged over the globe. That last one is the famous \(S_0/4\), which is 340.250, raised by a factor \(1/\sqrt{1-e^2} = 1.00013951\) because an eccentric orbit spends more time far away but the inverse square law more than makes up for it.

Over the past million years: eccentricity between 0.004155 and 0.057815. Obliquity between 22.0762° and 24.4546°. The precession index \(e\sin\tilde\omega\) between \(-0.05768\) and \(+0.05573\). The resulting 65°N solstice insolation between 430.528 and 558.777 W/m², mean 493.164, standard deviation 23.488.

Today's 477.94 sits low. Only 28.1% of the past million years were dimmer.

Checking It Against Things We Did Not Compute

A formula that returns plausible numbers is worth nothing. The question is whether it returns the right ones, and the only way to find out is to compute the same quantity twice by routes that share no code.

Four closed forms are available. Integrating \(Q\) over the whole sphere and the whole year has to give \(S_0 / (4\sqrt{1-e^2})\), and the \((a/r)^2\) in the formula cancels against the Kepler weight \(dt/d\lambda\) exactly, which is why eccentricity enters only through that square root. At the equator the hour angle is always \(\pi/2\), the integrand collapses to \(\cos\delta\), and the annual mean becomes \(2 S_0 E(\sin\varepsilon) / (\pi^2\sqrt{1-e^2})\) with \(E\) the complete elliptic integral of the second kind. At either pole the integrand is \(\pi\sin\delta\) for half the year and zero for the other half, giving \(S_0\sin\varepsilon/(\pi\sqrt{1-e^2})\). And at the equinoxes and solstices the general formula reduces to one term.

We evaluated the elliptic integral by the arithmetic-geometric mean, which shares not one line with the quadrature it is checking. Both routes gave 1.506684231543093.

That still leaves one gap. All four closed forms descend from the same daily-mean integral, so a mistake in that integral would corrupt the check and the thing being checked identically. The fix is a Monte Carlo estimate that never uses it: scatter 4,000,000 points uniformly over the sphere and uniformly in time, compute the solar zenith angle at each from scratch, average the flux. Uniform in time means uniform in mean anomaly, which is what mean anomaly is for. It came back at 339.968 W/m² against the analytic 340.297, a gap of 1.50 standard errors, which for a random estimator is not a disagreement at all.

Then, last, the reference implementation. Laskar's La2004 distribution ships the Fortran subroutine cwj that computes exactly this quantity, and it does not clip the hour angle: it branches explicitly on three cases. We transcribed it, ran both over a grid of 181 latitudes by 721 solar longitudes, and took the largest disagreement anywhere.

quantityclub valuereferencedifferencerelativesource of the reference
against closed forms derived by hand
global annual mean, W/m²340.297512340.2974704.27×10−50.0000%S0/(4√(1−e²))
annual mean, equator, W/m²415.595852415.5958525.68×10−140.0000%2S0E(sinε)/π²√(1−e²)
annual mean, north pole, W/m²172.348965172.3489641.06×10−60.0000%S0sinε/(π√(1−e²))
annual mean, south pole, W/m²172.348965172.3489641.06×10−60.0000%same, by symmetry
northward equinox, equator, W/m²436.704616436.7046160exact(S0/π)(a/r)²
southward equinox, equator, W/m²430.230602430.2306020exact(S0/π)(a/r)²
June solstice, north pole, W/m²524.183832524.1838321.14×10−130.0000%S0(a/r)²sinε
December solstice, south pole, W/m²559.457064559.4570640exactS0(a/r)²sinε
December solstice, north pole, W/m²0.00000000exactpolar night
E(sinε), two independent methods1.5066842315430931.5066842315430930exactAGM vs 220-point quadrature
against an independent estimator and an independent implementation
Monte Carlo global mean, W/m²339.968091340.297470−0.329−1.50σ4,000,000 samples, SE 0.2196
largest gap vs Laskar's cwj, W/m²2.84×10−1302.84×10−13machine181 × 721 grid
against published present-day values
65°N June solstice, W/m²477.937480−2.06−0.43%Berger 1978 tables, S0=1365 [4]
the same, with S0 = 1365479.341480−0.66−0.14%same, like for like
annual mean, equator, W/m²415.596416−0.40−0.10%textbook figure [5]
annual mean, pole, W/m²172.349173−0.65−0.38%textbook figure [5]
obliquity today, degrees23.43929123.4393−8.9×10−60.0000%standard element
eccentricity today0.01670240.016708−5.6×10−6−0.034%standard element
longitude of perihelion, degrees102.9179102.947−0.029−0.028%standard element
northern summer half year, days186.406186.40.0060.003%7.570 d asymmetry vs ~7.5 quoted

Nineteen rows, nineteen agreements. The only one carrying a real gap is the Monte Carlo, and its gap is smaller than its own noise. The 65°N row looks like a 0.43% discrepancy until you notice it is entirely the solar constant: put 1365 back in and it closes to 0.14%, which is as close as a value published to three significant figures can be approached.

Working Notes From the Club Table

Meeting 1
Downloaded INSOLN.LA2004.BTL.ASC. 4.4 MB, 51,001 rows, Fortran D-exponents that numpy will not parse. One string replace fixes it. Column 4 is pibar, "longitude of perihelion from moving equinox", 1.79626 rad = 102.92°. Looks right.

Meeting 1, later
It was not right. First version put the vernal equinox 102 days after perihelion, so around 16 April. It is 20 March. Took most of an hour. The problem is that \(\varpi\) is the longitude of the Earth's perihelion, and insolation is written in terms of where the Sun appears, which is 180° away. Laskar's own subroutine says so in a comment we had not read: "pibar + pi (repere geocentrique)".

Meeting 2
Argument about what "day of year" means when the length of the seasons changes with precession. Resolved by refusing the question. The headline number is taken at \(\lambda = 90^\circ\), the solstice itself, which is a position in the orbit and not a date.

Meeting 2
Annual mean at the pole would not converge. Kept drifting in the fourth decimal as we changed the sample count. Turned out to be correct behaviour and not a bug. The integrand has a kink where polar night starts, so the error falls like \(1/N\) instead of vanishing. See Figure 2A. The equator hits machine precision at 32 samples. The pole needs 262,144 to reach \(4\times10^{-9}\).

Meeting 3
Transcribed cwj from insolsub.f as a check. Agreed to 2.8×10−13 first try, which was the least dramatic ten minutes of the project and the most reassuring.

Meeting 3
Ran the spectrum on the full 51 Myr file to pin down the line periods. Obliquity came out at 40.06 kyr, not 41. Spent a while hunting for the bug. There is no bug: tidal friction has been slowing Earth's precession constant, so the obliquity period really was shorter in the deep past, which is a known result [6]. Restricted to the last 5 Myr it gives 40.992 kyr.

Meeting 4
Terminations line up almost too well, mean offset 1.78 kyr. Somebody asked how LR04 was dated. Long silence. See section 9. We kept the result and changed what we claim it means.

Meeting 4
Seed 20260320, fixed, never touched again. Total runtime 21 seconds, of which 4 are the Monte Carlo and most of the rest is one 222-point convergence reference we compute three times and use once.

One Parameter at a Time

The three orbital parameters do not contribute equally, and they do not contribute independently. Holding two at their million-year mean and sweeping the third across its full million-year range gives a clean ranking, and one surprise.

1e-15 1e-12 1e-9 1e-6 1e-3 1e0 2^3 2^7 2^11 2^15 2^18 pole 65 N equator N used points sampled around the orbit error in the annual mean, W/m2 A. how many samples the year needs 440 460 480 500 520 540 560 parameter swept across its million-year range: eccentricity, 0.0042 to 0.058 obliquity, 22.08 to 24.45 deg perihelion angle, e held at 0.058 perihelion angle, e held at 0.028 B. one parameter at a time, Q at 65 N W/m2 Does the arithmetic converge, and what actually moves the answer? left: error against a 2^22-point reference. right: the other two parameters held at the million-year mean.
Figure 2. A. Absolute error in the annual-mean insolation against the number of orbit samples, measured against a 222-point reference, at three latitudes. The equator falls to machine zero by 32 points because the integrand is smooth and periodic. 65°N takes until 64. The pole never gets there: its error halves with each doubling and no faster, which is the signature of a kink in the integrand, and the kink is the moment polar night begins. The dashed line marks the 16,384 points used everywhere else in this study. B. Insolation at 65°N on the June solstice as each parameter is swept across its full past-million-year range with the other two held at the million-year mean. The two precession curves are the same sweep at two eccentricities, and the gap between them is the entire point: precession has no lever of its own.

Obliquity is the easy one. Push it from 22.076° to 24.455° and the 65°N solstice goes from 446.38 to 484.35 W/m², a span of 37.97. A steeper tilt means a higher summer sun and a longer summer day at high latitude, and the effect is monotone and unexciting.

Eccentricity alone gives 46.98 W/m², running from 487.97 at \(e = 0.004155\) down to 440.99 at \(e = 0.057815\). That sweep holds perihelion at today's angle, which happens to put the Earth near aphelion in June, so a rounder orbit brings northern summer closer to the Sun. Turn perihelion halfway round the circle and the same sweep runs the other way.

Which brings the surprise, except it should not be a surprise. Sweeping the perihelion angle through a full circle at mean eccentricity moves the answer by 55.46 W/m². At the largest eccentricity of the last million years it moves it by 114.53. At zero eccentricity it moves it by exactly nothing, because a circle has no perihelion and the angle to it is undefined.

So the precession term is not a signal in its own right. It is a carrier at roughly 23,000 years whose amplitude is eccentricity, which is exactly why the standard index is written \(e\sin\tilde\omega\) with the two multiplied together. Over the actual million years, letting one parameter vary in time and freezing the others, the standard deviations come out at 11.24 W/m² for eccentricity alone, 8.93 for obliquity alone, and 19.63 for the perihelion angle at mean eccentricity, against 23.49 for the real curve with all three moving. Those three variances sum to 1.072 times the total, which they should not do if the terms were independent, and they are not.

A Million Years of June

Run the whole thing backwards, one value per thousand years, and the curve in the bottom panel of Figure 3 is what Milankovitch spent twenty years computing by hand.

0.000 0.031 0.062 eccentricity e 21.9 23.2 24.6 obliquity, degrees -0.07 +0.00 +0.07 precession index e sin(w) 425 495 565 65 N June solstice insolation, W/m2 I II III IV V VI VII VIII IX 0 100 200 300 400 500 600 700 800 900 1000 thousands of years before present Three orbital numbers, and the sunlight they add up to roman numerals mark the nine glacial terminations on the LR04 age model. dot at the right edge is today.
Figure 3. The three orbital parameters and the insolation they produce, past million years, from the La2004 solution. Eccentricity wanders slowly between 0.004 and 0.058 with a visible long beat. Obliquity oscillates cleanly at about 41 kyr, the most regular signal on the page. The precession index is a fast oscillation whose envelope is eccentricity, which is why it nearly dies around 400 and 750 kyr BP when the orbit is at its roundest. The bottom panel is 65°N June solstice insolation; roman numerals mark the nine glacial terminations on the LR04 age model [7]. The insolation maximum at 958 kyr BP, 558.78 W/m², is the brightest northern summer in the window, and nothing in particular happened.

The extremes are worth naming. The brightest June at 65°N in the past million years was 958,000 years ago, at 558.78 W/m², with eccentricity at 0.0545, obliquity at 23.78° and the precession index at its most positive. The dimmest was 231,000 years ago, at 430.53, with eccentricity nearly as high at 0.0465 but obliquity down at 22.09° and the precession index almost as negative as it gets. The whole swing is 128.25 W/m², or 26.0% of the mean.

That 128 W/m² is a large number by the standards of anything in climate, and it is also completely different in kind from the numbers it invites comparison with, because it is neither global nor annual. Averaged over the sphere and over the year, the orbital variation is very nearly nothing, since eccentricity enters the global annual mean only through \(1/\sqrt{1-e^2}\). Across the full million-year range of \(e\), from 0.004155 to 0.057815, that moves the global annual mean from 340.253 to 340.820 W/m². A swing of 0.567. Milankovitch forcing does not change how much sunlight the Earth receives in a year. It moves sunlight between latitudes and between seasons and leaves the annual total where it was, which is why a theory of the ice ages built on it has to be a theory about where and when, never about how much.

What the Fourier Transform Says, and What It Does Not

Take the periodogram of that curve and the orbital periods appear without being asked for.

eccentricity band 0.07% obliquity band 17.74% precession band 81.26% 0.00 0.25 0.50 0.75 1.00 400 100 41 23 19 15 23.8 22.2 18.9 41.7 period, thousands of years power, scaled to its own peak Where the power sits, and where it does not 65 N June insolation eccentricity, same window eccentricity owns the 100 kyr band. the insolation curve keeps 0.07% of its power there.
Figure 4. Hann-windowed periodogram of the 65°N June solstice insolation over the past million years, each spectrum scaled to its own peak. The dashed curve is the eccentricity spectrum over the same window, and it is included to make one point: eccentricity has 46.38% of its power in the 75 to 135 kyr band and the insolation curve has 0.07%. Labels mark the four strongest lines in the insolation spectrum. The three shaded bands were fixed before the spectra were computed.

The precession band from 17 to 26 kyr holds 81.26% of the variance. The obliquity band from 35 to 55 kyr holds 17.74%. Together with the eccentricity band the three account for 99.08% of everything, which is a decent sign that the band edges were chosen sensibly and that there is nothing else in the signal.

The individual lines are where the check bites. The four strongest peaks come in at 23.83, 22.24 and 18.89 kyr, which is the precession triplet, and 41.71 kyr, which is obliquity. A thousand-kyr record cannot place a peak near 41 kyr better than about 0.85 kyr, so we ran the same analysis on longer stretches of the same file. Over the most recent 5 Myr the obliquity line lands at 40.992 kyr and the precession line at 23.701 kyr. Over 51 Myr the eccentricity lines land at 404.770 ± 1.606, 94.974 ± 0.088, 124.090 ± 0.151 and 98.839 ± 0.096 kyr. Nobody tuned anything. These are the periods the literature quotes [4][6][8], and they drop out of a Fourier transform of somebody else's orbital integration.

Now the part that does not work. The 75 to 135 kyr band in the insolation curve holds 0.07% of the power, and its largest peak in that band sits at 125 kyr. Widen the window to 5 Myr and the 300 to 500 kyr band, where eccentricity keeps 40.57% of its own power, holds 0.06% of the insolation curve's. Eccentricity is loud in the orbit and almost silent in the sunlight, for the straightforward reason that it enters the daily insolation at first order only as the multiplier on precession, and multiplying a slow envelope onto a fast carrier puts power into sidebands around the carrier rather than at the envelope's own frequency.

The ice record does not agree. The dominant rhythm since about 800 kyr ago is a 100 kyr sawtooth [7][9], and the interglacials that punctuate it have been catalogued and compared one by one [18]. Whatever produces it, it is not a 100 kyr line in the forcing, because there essentially is not one. Explanations on offer include a threshold mechanism that skips insolation peaks until the ice sheet is old and large enough [10], every second or third obliquity cycle being selected [11], ice-sheet hysteresis with isostatic rebound [12], and a simple rule based on how long it has been since the last interglacial [13]. None of those is something our calculation could produce, because none of them lives in the sunlight. They live in the ice.

The Strongest Objection: the Clock Was Set By the Thing We Are Testing

Here is the case against this section's own headline, made before the headline is.

We report that nine glacial terminations sit an average of 1.78 kyr from the nearest maximum of our insolation curve, against 5.52 kyr for dates thrown at random, and that no set of nine random dates in 20,000 draws matched it. Taken at face value that is a striking confirmation of Milankovitch. Taken with any care at all, it is close to circular.

The LR04 stack is an orbitally tuned age model [7]. Its authors did not date those cores independently and then notice they lined up with insolation. They aligned the benthic oxygen isotope record to a simple ice model driven by 21 June insolation at 65°N, which is the quantity in our bottom panel, and read the ages off. So when we measure the distance from a termination to an insolation maximum we are partly measuring the tuning procedure. The residual of 1.78 kyr is, to a significant extent, a statement about how tightly Lisiecki and Raymo's algorithm was allowed to pull.

terminationMIS boundaryLR04 age, kyrnearest Q65N maximumoffset, kyrQ at that maximumQ at the termination
I1/214.011.0−3.0527.07518.79
II5/6130.0127.0−3.0548.83538.62
III7/8243.0243.00.0533.74533.74
IV9/10337.0334.0−3.0539.78528.93
V11/12424.0426.0+2.0499.62498.65
VI13/14533.0531.0−2.0514.81514.19
VII15/16621.0621.00.0537.06537.06
VIII17/18712.0713.0+1.0520.19517.46
IX19/20790.0788.0−2.0521.04515.26
mean offset −1.11 kyr · mean absolute offset 1.78 kyr · s.d. 1.90 · s.e. 0.63 · −1.75σ from zero
random-date null: mean absolute offset 5.52 kyr · our value 3.39σ below it · 0 of 20,000 draws as tight · p < 0.00005

How much is left once the circularity is subtracted? Some, and we cannot say how much from inside this study. Three things push back. Terminations II and V and the more recent ones have been dated independently by uranium-thorium on speleothems, which owes nothing to orbital tuning, and those ages agree with the tuned ones to within the tuning residual [14]. The tuning target is a single insolation curve at one latitude on one day, so it is mildly informative that the caloric summer half year, a different curve nothing was tuned to, still gives a mean offset of 2.89 kyr. And the alignment of the frequencies, which is the Hays, Imbrie and Shackleton result [2], was established on records with independent magnetostratigraphic age control and does not depend on tuning at all.

None of that rescues the specific number 1.78. We report it, and we report that it cannot be read as an independent test, and a reader who wants an independent test should go to the radiometrically dated speleothem record rather than to us.

There is a second objection, smaller and cleaner. Our curve has 46 local maxima over the past million years, spaced 21.5 kyr apart on average. There were nine terminations. Even if every termination sits on a maximum, 37 maxima produced nothing whatsoever, so the curve cannot be a sufficient cause of anything. At best it is a trigger that something else has to arm.

Which Summer? Three Answers, Three Cultures

Everything above takes "summer insolation at 65°N" to mean the daily-mean value on the June solstice. That is one choice. It is not Milankovitch's.

He used the caloric summer half year: the 182.62 days of the year that receive the most sunlight, averaged. Huybers later argued for the total energy received on every day whose insolation clears a melting threshold, on the grounds that what melts ice is joules, and that a longer summer is worth as much as a brighter one [15]. We computed all three on the same orbital elements.

0% 25% 50% 75% 100% 81 18 solstice 45 53 caloric half year 14 83 integrated energy precession band obliquity band A. share of the power, past 1 Myr fraction of variance 0 100 200 300 I II III thousands of years before present B. the same summers, last 300 kyr solstice caloric integrated Three reasonable definitions of summer, three different answers right-hand curves each scaled to their own full range, so only the shape is being compared.
Figure 5. A. Share of the variance in the precession band and the obliquity band, for three definitions of summer insolation at 65°N over the past million years. The solstice value is 81% precession. The integrated summer energy is 83% obliquity. The caloric half year sits between them at 45% and 53%. B. The same three curves over the last 300 kyr, each scaled to its own range so only the shape is being compared, with terminations I, II and III marked. They are not the same signal.

The numbers are not close. Correlated against the orbital parameters over the million years, the solstice value has \(r = 0.915\) with the precession index and \(0.395\) with obliquity. The integrated summer energy has \(r = 0.393\) with precession and \(0.916\) with obliquity. The two quantities have almost exactly swapped. The caloric half year lands in between, at \(0.698\) and \(0.712\).

The reason is a cancellation that Huybers pointed out. When precession brings perihelion into northern summer the days get brighter, and by Kepler's second law that summer also gets shorter. Brighter times shorter is nearly constant, so anything that integrates over the season loses most of the precession signal, while a single-day snapshot keeps all of it. Obliquity has no such cancellation: a bigger tilt makes the summer brighter without shortening it.

This matters for more than bookkeeping. Before about 1 Myr ago the ice record is dominated by a 41 kyr rhythm, not a 100 kyr one, and the obliquity-heavy definitions of summer are much better at explaining that [15][16]. Whether the early Pleistocene looks like an obliquity world or a precession world depends on which integral you take, and both integrals are of the same sunlight.

What We Computed and What We Did Not

We computed watts per square metre arriving at the top of a transparent atmosphere. That is all.

There is no atmosphere in this model, no cloud, no albedo and therefore no ice-albedo feedback, which is the largest amplifier in the real system and the reason a 20 W/m² change in summer sunlight can move an ice sheet at all. There is no carbon dioxide, and the glacial cycles are accompanied by a swing of about a third in atmospheric CO₂ that our calculation knows nothing about. There is no ocean, no heat transport and no thermal inertia, so there is no lag between a forcing and a response, when a real ice sheet takes millennia to build and millennia to fall apart [17]. There is no ice sheet at all, so no isostatic rebound and no elevation feedback [12]. The solar constant is frozen at today's value for a million years.

What the calculation does establish is the shape of the forcing, and that shape is not negotiable. Summer sunlight at high northern latitudes really did swing by 128 W/m². It really did do so mostly at 23 and 41 thousand years. There really is almost nothing at 100 thousand years in it. Any theory of the ice ages has to start from those three facts, and the first two are the reason Milankovitch was right and the third is the reason the argument has run for a hundred years and is not over.

Where a different choice would change the answer

The definition of summer. Of everything in this study this moves the conclusion most, and section 10 is about nothing else. Solstice insolation says precession runs the show, 81% to 18%. Integrated summer energy says obliquity does, 83% to 14%. We led with the solstice because it is the conventional Milankovitch index and because it is the quantity LR04 was tuned to, and a reader who thinks melting is about joules rather than peak brightness should read Figure 5A right to left.

The latitude. 65°N is a convention, chosen because it is roughly where the great northern ice sheets had their southern margins. Nothing in the arithmetic picks it. We reran the whole spectral decomposition at five other latitudes: at 45°N the precession share climbs to 94.80% and obliquity falls to 4.57%, at 30°N it is 98.31% against 1.15%, and at 85°N it is 75.79% against 23.06%. Obliquity's leverage grows towards the pole and precession's does not, so the choice of latitude is itself an argument about which orbital parameter matters. One curiosity fell out of that sweep: above the Arctic Circle every latitude gives exactly the same band shares, because under the midnight sun the formula collapses to \(S_0 (a/r)^2 \sin\phi \sin\delta\) and \(\sin\phi\) is then a constant multiplier that cancels out of every ratio.

The orbital solution. We used La2004 [8]. La2010 revises the planetary ephemeris and changes eccentricity noticeably before about 50 Myr ago [16]. Over one million years the two agree to far better than anything here depends on, and swapping them would change no number in this article at the precision we quote.

The solar constant. 1361 against Berger's 1365 or Laskar's 1368 shifts every absolute watt figure by up to half a percent and shifts no percentage, no correlation and no spectral share at all. The 128.25 W/m² range would read 128.63 at 1365.

The obliquity reference frame. La2004 tabulates obliquity relative to the fixed ecliptic of J2000 rather than the ecliptic of date. The two differ by a small amount that grows with time, and using the other convention would move the absolute insolation values slightly while leaving the spectral structure alone.

Reproducing this

Two commands, and the first one is a download. You need Python 3.12 and numpy, nothing else.

curl -o analysis/data/INSOLN.LA2004.BTL.ASC \
  http://vo.imcce.fr/insola/earth/online/earth/La2004/INSOLN.LA2004.BTL.ASC
python milankovitch-insolation.py > milankovitch-insolation-output.txt

Expect about 21 seconds. Ours took 20.9 s on numpy 2.4.2 and Python 3.12.3. The orbital file is 4,590,090 bytes with SHA-256 beginning 3f13b9f8e69085ba, and the script prints the full digest so a reader can confirm they have the same data we did; it was retrieved on 14 September 2026. The termination ages are read from the LR04 age-model table at lorraine-lisiecki.com/LR04_MISboundaries.txt, cached in the same directory, and are not typed into the source. The seed 20260320 governs the Monte Carlo integration in section 4 and the random-date null in section 9, and nothing else; everything else in the file is deterministic arithmetic. Numbers differing from ours by more than the printed standard errors mean something is wrong, and we would like to hear about it. The interactive model runs the same insolation formula in your browser, and its default settings reproduce the headline numbers above.

References

  1. Milanković, M. (1941). Kanon der Erdbestrahlung und seine Anwendung auf das Eiszeitenproblem. Königlich Serbische Akademie, Belgrade, Special Publication 132. English translation: Canon of Insolation and the Ice-Age Problem, Israel Program for Scientific Translations, Jerusalem, 1969.
  2. Hays, J. D., Imbrie, J. & Shackleton, N. J. (1976). Variations in the Earth's orbit: pacemaker of the ice ages. Science 194, 1121–1132. doi:10.1126/science.194.4270.1121
  3. Kopp, G. & Lean, J. L. (2011). A new, lower value of total solar irradiance: evidence and climate significance. Geophysical Research Letters 38, L01706. doi:10.1029/2010GL045777
  4. Berger, A. L. (1978). Long-term variations of daily insolation and Quaternary climatic changes. Journal of the Atmospheric Sciences 35, 2362–2367. doi:10.1175/1520-0469(1978)035<2362:LTVODI>2.0.CO;2
  5. Hartmann, D. L. (2016). Global Physical Climatology, 2nd edition. Elsevier, Amsterdam. doi:10.1016/C2009-0-00030-0
  6. Berger, A., Loutre, M. F. & Laskar, J. (1992). Stability of the astronomical frequencies over the Earth's history for paleoclimate studies. Science 255, 560–566. doi:10.1126/science.255.5044.560
  7. Lisiecki, L. E. & Raymo, M. E. (2005). A Pliocene–Pleistocene stack of 57 globally distributed benthic δ18O records. Paleoceanography 20, PA1003. doi:10.1029/2004PA001071
  8. Laskar, J., Robutel, P., Joutel, F., Gastineau, M., Correia, A. C. M. & Levrard, B. (2004). A long-term numerical solution for the insolation quantities of the Earth. Astronomy & Astrophysics 428, 261–285. doi:10.1051/0004-6361:20041335
  9. Raymo, M. E. (1997). The timing of major climate terminations. Paleoceanography 12, 577–585. doi:10.1029/97PA01169
  10. Paillard, D. (1998). The timing of Pleistocene glaciations from a simple multiple-state climate model. Nature 391, 378–381. doi:10.1038/34891
  11. Huybers, P. & Wunsch, C. (2005). Obliquity pacing of the late Pleistocene glacial terminations. Nature 434, 491–494. doi:10.1038/nature03401
  12. Abe-Ouchi, A., Saito, F., Kawamura, K., Raymo, M. E., Okuno, J., Takahashi, K. & Blatter, H. (2013). Insolation-driven 100,000-year glacial cycles and hysteresis of ice-sheet volume. Nature 500, 190–193. doi:10.1038/nature12374
  13. Tzedakis, P. C., Crucifix, M., Mitsui, T. & Wolff, E. W. (2017). A simple rule to determine which insolation cycles lead to interglacials. Nature 542, 427–432. doi:10.1038/nature21364
  14. Cheng, H., Edwards, R. L., Sinha, A., Spötl, C., Yi, L., Chen, S., Kelly, M., Kathayat, G., Wang, X., Li, X., Kong, X., Wang, Y., Ning, Y. & Zhang, H. (2016). The Asian monsoon over the past 640,000 years and ice age terminations. Nature 534, 640–646. doi:10.1038/nature18591
  15. Huybers, P. (2006). Early Pleistocene glacial cycles and the integrated summer insolation forcing. Science 313, 508–511. doi:10.1126/science.1125249
  16. Laskar, J., Fienga, A., Gastineau, M. & Manche, H. (2011). La2010: a new orbital solution for the long-term motion of the Earth. Astronomy & Astrophysics 532, A89. doi:10.1051/0004-6361/201116836
  17. Imbrie, J. & Imbrie, J. Z. (1980). Modeling the climatic response to orbital variations. Science 207, 943–953. doi:10.1126/science.207.4434.943
  18. Past Interglacials Working Group of PAGES (2016). Interglacials of the last 800,000 years. Reviews of Geophysics 54, 162–219. doi:10.1002/2015RG000482