The Uranus Problem

Le Verrier’s three memoirs and the prediction of Neptune’s position.
Author

Jonathan Whitmore

Published

April 9, 2026

A Planet That Wouldn’t Behave

William Herschel discovered Uranus on 13 March 1781. Within decades, astronomers noticed that the planet refused to follow the orbit predicted by Newtonian theory — even after accounting for Jupiter and Saturn’s gravitational pull. By the 1840s, the discrepancy had grown to over 100 arcseconds, far beyond observational error.

In 1845, François Arago — director of the Paris Observatory — pointed Le Verrier toward this problem. Could the anomaly be explained by an unknown planet beyond Uranus?

The First Memoir (10 November 1845)

The first memoir is often described as establishing that the known planets could not explain Uranus — but that is not what it claims. Le Verrier states its purpose narrowly: “établir la forme et la grandeur des termes que les actions perturbatrices de Jupiter et de Saturne introduisent dans les expressions des coordonnées héliocentriques d’Uranus”, adding that the resulting formulae “seront comparées aux observations de Paris et de Greenwich dans une seconde communication”. It closes the same way: “Il resterait à comparer la théorie précédente avec les observations. Mais je ne pourrais pas le faire actuellement d’une manière complète.”

What it did establish is that the existing theory was inadequate. Rebuilding the Jupiter and Saturn perturbations by two independent methods, he found terms that earlier work had dropped — enough that the summed discrepancies against the 1821 Tables reached 29 arcseconds, and enough to corrupt the orbital elements those Tables were fitted with.

Le Verrier himself drew the line, looking back from June 1846: he could, he wrote, have declared as early as November “qu’il fallait chercher ailleurs que dans l’imperfection des éléments de l’ellipse la cause des étranges inégalités d’Uranus” — but “malheureusement”, uncertainties in how the Tables had been built made that conclusion unsafe. The negative result had to wait for the second memoir.

We can reproduce this finding with our simulation. Using JPL state vectors for Jupiter, Saturn, and Uranus — a modernization of Le Verrier’s starting point — we integrate without Neptune and compare against observed longitudes:

NoteA note on methodology

Our reconstruction uses JPL state vectors and a numerical integrator where Le Verrier used hand-built planetary tables and analytical perturbation theory. His “baseline” was noisier than ours: he had to manually subtract Jupiter and Saturn’s perturbations using his own imperfect tables before isolating the Uranus anomaly. Our simulation does this “for free.” The results are qualitatively the same, but our residuals are cleaner than what Le Verrier had to work with.

Code
from pathlib import Path
import numpy as np
import pandas as pd

from discoverneptune.simulation import (
    StateVector,
    simulate_uranus_longitudes_from_vectors,
    simulate_uranus_longitudes_no_neptune,
)

# Load bundled observation data
from discoverneptune.data import find_bundled_data_dir

data_dir = find_bundled_data_dir()

obs = pd.read_csv(data_dir / "uranus_observations_1781_1846.csv")
svs = pd.read_csv(data_dir / "outer_planet_state_vectors_1781_01_01.csv")
state = {
    row.planet: StateVector(row.x, row.y, row.z, row.vx, row.vy, row.vz)
    for row in svs.itertuples(index=False)
}

jd_times = obs["datetime_jd"].to_numpy()
truth_lon = obs["longitude_rad"].to_numpy()
start_jd = float(jd_times[0])
Code
# Simulate WITHOUT Neptune
model_no_neptune = simulate_uranus_longitudes_no_neptune(
    jd_times, start_jd, state["jupiter"], state["saturn"], state["uranus"]
)
residuals_no_neptune = np.degrees(np.unwrap(truth_lon - model_no_neptune)) * 3600

print(f"Residual RMS without Neptune: {np.sqrt(np.mean(residuals_no_neptune**2)):.1f} arcsec")
print(f"Peak-to-peak: {np.ptp(residuals_no_neptune):.1f} arcsec")
Residual RMS without Neptune: 31.5 arcsec
Peak-to-peak: 131.4 arcsec

This is the signal Le Verrier saw — over 100 arcseconds of unexplained drift. No tweak to the known planets could make it go away.

The Second Memoir (1 June 1846)

Six months later Le Verrier both closed the negative result and inverted the problem. His own summary lists the steps: recompute the Jupiter and Saturn perturbations, reduce nearly three hundred meridian observations, and “prouver péremptoirement qu’il y a incompatibilité entre les lieux ainsi calculés et les lieux observés” — after which “L’existence d’une planète encore inconnue se trouvant ainsi mise hors de doute, j’ai renversé le problème”.

His simplifying assumptions were narrower than they are usually reported. He took the unknown planet’s orbit to lie in the ecliptic, justified rather than assumed: Jupiter, Saturn and Uranus are barely inclined to it, and Uranus’s observed latitudes show no unexplained inequalities. For distance he adopted “une distance moyenne double de celle d’Uranus” — Bode’s Law, not a circular orbit. The eccentricity was not assumed away: he solved for it, deriving “les expressions de l’excentricité de l’orbite et de la longitude du périhélie, en fonctions de la masse et de la longitude de l’époque”.

The memoir ends with a position rather than a full orbit: assigning the planet 325° of heliocentric longitude on 1 January 1847, he writes, does not risk an error of ten degrees.

His approach was a 19th-century version of what we now call optimization: systematically adjusting the unknown planet’s parameters to minimize the residuals.

Code
from discoverneptune.historical_values import (
    LEVERRIER_MEMOIR_1846_JUN,
    LEVERRIER_MEMOIR_1846_AUG,
    MODERN_NEPTUNE,
    GALLE_OBSERVATION,
)

# Le Verrier's June 1846 prediction
print("Le Verrier's June 1846 prediction:")
print("  Semi-major axis: not published in the June memoir")
print("  Mass: not published in the June memoir")
print(f"  Longitude: {LEVERRIER_MEMOIR_1846_JUN.longitude_deg:.1f}\u00b0")
Le Verrier's June 1846 prediction:
  Semi-major axis: not published in the June memoir
  Mass: not published in the June memoir
  Longitude: 325.0°

The Third Memoir and the Letter to Galle (31 August 1846)

Le Verrier’s third memoir refined the prediction. He wrote to Johann Galle at the Berlin Observatory on 18 September 1846 with specific coordinates. On the night of 23 September, Galle and his student Heinrich d’Arrest found the new planet within 1° of Le Verrier’s predicted position.

Code
print("Le Verrier's final prediction (August 1846):")
print(
    "  Published longitude: "
    f"{LEVERRIER_MEMOIR_1846_AUG.longitude_deg:.2f}\u00b0 "
    "(quoted for 1 Jan 1847)"
)
print(f"  Predicted semi-major axis: {LEVERRIER_MEMOIR_1846_AUG.semi_major_axis_au:.3f} AU")
print()
print("Galle's observation, reduced to 1 January 1847:")
print(f"  Inferred longitude: {GALLE_OBSERVATION.longitude_deg:.1f}\u00b0")
print()
error_deg = abs(LEVERRIER_MEMOIR_1846_AUG.longitude_deg - GALLE_OBSERVATION.longitude_deg)
print(f"Common-epoch longitude offset: {error_deg:.2f}\u00b0")
Le Verrier's final prediction (August 1846):
  Published longitude: 326.53° (quoted for 1 Jan 1847)
  Predicted semi-major axis: 36.154 AU

Galle's observation, reduced to 1 January 1847:
  Inferred longitude: 327.4°

Common-epoch longitude offset: 0.87°

The Mass-Distance Degeneracy

Le Verrier got the longitude almost exactly right but overestimated the distance (36.2 AU predicted vs 30.1 AU actual). This isn’t a failure — it reflects a fundamental degeneracy: a more massive planet farther away produces nearly the same perturbation pattern as a less massive planet closer in.

The longitude is better constrained because it determines where in the sky the perturbation signal points. Distance and mass trade off against each other along a valley of nearly-equal-fit solutions.

The historical longitudes below share a common epoch and are both referred to the mean equinox of 1847, so their 0.87° separation is a like-for-like comparison. We deliberately do not place the optimizer’s J2000-frame longitude on the same axis. Its ω = Ω = 0 convention also absorbs orbit geometry into fitted mean longitude, making a direct marker comparison doubly misleading. The fitted distance and mass are one point on a degeneracy valley, not an exact recovery of Neptune’s orbit.

Code
import matplotlib.pyplot as plt

labels = ["Le Verrier\n(Aug 1846)", "Our optimizer", "Modern\n(JPL)"]
a_values = [
    LEVERRIER_MEMOIR_1846_AUG.semi_major_axis_au,
    result.neptune.a,
    MODERN_NEPTUNE.semi_major_axis_au,
]
lon_values = [
    LEVERRIER_MEMOIR_1846_AUG.longitude_deg,
    GALLE_OBSERVATION.longitude_deg,
]
lon_labels = [
    "Le Verrier\n(Aug 1846)",
    "Galle\n(inferred)",
]


def _build(theme="light"):
    apply_style(theme)
    cycle = category_cycle(theme)
    bar_colors_a = [cycle[0], cycle[2], cycle[3]]
    bar_colors_lon = [cycle[0], cycle[1]]
    fig, axes = plt.subplots(1, 2, figsize=(12, 4))

    ax = axes[0]
    ax.barh(labels, a_values, color=bar_colors_a)
    ax.set_xlabel("Semi-major axis (AU)")
    ax.set_title("Distance estimates")
    truth_line(ax, MODERN_NEPTUNE.semi_major_axis_au, label="Modern value",
               axis="x", theme=theme)

    ax = axes[1]
    for y_pos, (lon, col) in enumerate(
        zip(lon_values, bar_colors_lon, strict=True)
    ):
        ax.plot([lon], [y_pos], "D", ms=11, color=col)
    ax.set_yticks(range(len(lon_labels)))
    ax.set_yticklabels(lon_labels)
    ax.set_xlim(min(lon_values) - 3, max(lon_values) + 3)
    ax.set_xlabel("Heliocentric longitude (degrees)")
    ax.set_title("Historical comparison: epoch/equinox 1 Jan 1847")

    return fig


display(dual_render(_build, alt="Le Verrier distance estimates and historical 1847-equinoctial longitude comparison"))
Figure 2: Distance estimates and the internally consistent historical longitude comparison. Le Verrier’s August prediction and the longitude inferred from Galle’s observation share epoch 1 Jan 1847 and the mean equinox of 1847. J2000-frame simulated longitudes are intentionally excluded. The June memoir published no distance.

References

  • Le Verrier, U. “Première mémoire sur la théorie d’Uranus.” Comptes Rendus 21 (10 Nov 1845).
  • Le Verrier, U. “Recherches sur les mouvements d’Uranus.” Comptes Rendus 22 (1 Jun 1846).
  • Le Verrier, U. “Sur la planète qui produit les anomalies observées dans le mouvement d’Uranus.” Comptes Rendus 23 (31 Aug 1846).
  • Grosser, M. The Discovery of Neptune (1962), chapters 5–7.
  • Standage, T. The Neptune File (2000).