Exoplanet Detection Methods · Radial Velocity

Radial Velocity

The method that found the first exoplanet around a Sun-like star: watching a star's spectral lines shift back and forth as an orbiting planet's gravity tugs it in a small, periodic wobble. This page derives the semi-amplitude equation from first principles, works through real numbers including 51 Pegasi b, reports current detection statistics, and includes a live calculator built on the same physics.

~19% of all confirmed exoplanets 51 Pegasi b, 1995 Real Keplerian fit implemented in this repo
Artist's concept of a star wobbling due to an orbiting planet's gravity

AI-generated artist's concept of a star's Doppler wobble — not a real photograph. The quantitative figure is generated from the explicitly declared synthetic injection; published target parameters and population counts are identified separately.

1. Two bodies, one shared orbit

A planet does not orbit a fixed, stationary star. Both bodies orbit their mutual center of mass — the barycenter — with the star tracing out a much smaller version of the planet's own orbit, scaled down by the mass ratio Mp/M★. As the star moves along that small orbit, its motion has a component toward and away from Earth that periodically Doppler-shifts its light: redshifted while receding, blueshifted while approaching. That shift shows up as a tiny periodic wavelength shift in the star's absorption lines — typically of order meters per second, measured against light itself traveling at 3×10⁸ m/s, which is why the technique depends on extremely high-resolution, high-stability spectroscopy: resolving a few-meters-per-second Doppler shift means resolving a wavelength shift of roughly one part in 10⁸.

2. The semi-amplitude equation

The velocity semi-amplitude of the star's reflex wobble — how fast it swings toward and away from us at the extremes of its small orbit — is:

K = (2πG / P)1/3 · [Mp sin i / (M★+Mp)2/3] · 1/√(1−e²)

Reading it term by term:

Jupiter induces a wobble of about 12.5 m/s on the Sun; Earth induces about 9 cm/s — three orders of magnitude smaller, and still below what any current instrument can measure for a true Earth twin around a Sun-like star. That gap is the central engineering challenge of the entire method.

Close-up concept of a stellar absorption-line spectrum shifting under Doppler motion

AI-generated close-up concept of a Doppler-shifting stellar spectrum — not an actual observation.

3. Eccentric orbits and Kepler's equation

For a circular orbit, the RV curve traced out over one period is a pure sinusoid. For an eccentric orbit, the star moves faster near periastron and slower near apastron, which distorts the curve into an asymmetric shape — rising steeply and falling more gradually, or vice versa, depending on the viewing angle (the argument of periastron, ω). Computing the star's velocity at a given moment requires first solving Kepler's equation,

M = E − e sin E

for the eccentric anomaly E given the mean anomaly M (which advances uniformly with time) — an equation with no closed-form solution, solved here by Newton-Raphson iteration, exactly as real RV pipelines do. E is then converted to the true anomaly ν, and the final velocity uses K·[cos(ν+ω) + e·cos ω]. This machinery is what lets a Keplerian fit recover not just the period and mass, but the full orbital shape — eccentricity and orientation — from RV data alone.

4. Why RV only gives a minimum mass

Radial velocity is only sensitive to the line-of-sight component of the star's motion — it cannot see motion transverse to our line of sight at all. That's the origin of the sin i factor in the semi-amplitude equation: if the orbit is viewed edge-on (i = 90°), the full wobble projects onto our line of sight and K is maximal; if viewed face-on (i = 0°), the star's motion is entirely transverse and produces no Doppler signal at all, no matter how massive the planet. Since the true inclination is generally unknown from RV data alone, the method can only ever recover the product Mp sin i — a firm lower bound on the true mass, not the mass itself. Breaking that degeneracy requires an independent inclination measurement, most commonly from a transit (which, by definition, requires i close to 90°) or from astrometry. This is precisely why RV and transit photometry are complementary rather than redundant: a planet detected by both methods yields a true mass, a true radius, and therefore a real bulk density.

5. Worked numerical examples

SystemMp sin iM★PeriodeComputed K
Earth & Sun (reference case)1.00 M⊕1.00 M☉365.25 d0.0178.9 cm/s
Jupiter & Sun (reference case)1.00 MJ1.00 M☉4,332.6 d (11.86 yr)0.04912.5 m/s
51 Pegasi b0.464 MJ1.069 M☉4.230797 d0.004255.74 m/s

Full derivation: 51 Pegasi b

The planet that started it all. Its real orbital parameters from a single self-consistent study (NASA Exoplanet Archive): period 4.230797 days, minimum mass 0.464 Jupiter masses, host star mass 1.069 Solar masses, eccentricity 0.0042. Feeding these into the semi-amplitude equation from Section 2:

P = 4.230797 × 86,400 s = 365,540 s Mp = 0.464 × 1.898×10²⁷ kg = 8.807×10²⁶ kg Mstar = 1.069 × 1.989×10³⁰ kg = 2.126×10³⁰ kg K = (2π·G / P)^(1/3) × Mp / (Mstar+Mp)^(2/3) / √(1−e²) = 55.74 m/s

The same study's own measured semi-amplitude is 55.73 m/s — the formula reproduces the published value essentially exactly, because the minimum mass in that study was itself derived from this same K measurement. That circularity is expected, not a weakness: it confirms the equation and the published numbers are internally consistent, which is exactly what you'd want to check before trusting either one on a target where the answer isn't already known. This portfolio's own radial_velocity_demo.py implements the same Kepler solver and semi-amplitude formula used above, then validates it against an independently injected synthetic signal rather than a real target — see Section 8.

6. Interactive calculator

Move the sliders below. The outputs are computed live, directly from the semi-amplitude equation in Section 2 — nothing here is looked up or pre-baked.

Semi-amplitude, K–
K if edge-on (i=90°)–
Recoverable: Mp sin i–
Single-point SNR (K/σ)–

K uses the full equation from Section 2, including the eccentricity and inclination factors. "K if edge-on" holds every other parameter fixed and sets i=90° to show how much of the true signal a face-on-biased inclination hides. Mp sin i is the true observable — the quantity an RV fit alone can actually recover, per Section 4. Single-point SNR is simply K divided by the stated per-measurement instrument precision, a rough proxy for how easily a single high-precision spectrograph visit would detect the signal (real detection significance comes from a periodogram over many visits, not one point — see Section 8).

7. Real detection statistics

Pulled live from the NASA Exoplanet Archive's confirmed-planet counts by discovery method, accessed 2026-08-14:

Total confirmed6,336
Via radial velocity1,197 (~19%)
Via transit4,676 (~74%)
Via microlensing282 (~4%)
Via direct imaging98 (~2%)

Radial velocity is the second most productive detection method, and — unlike transit photometry — it does not require a lucky edge-on alignment to work at all (only a non-zero inclination), which made it the method of choice throughout the 1990s and 2000s before wide-field transit surveys took over as the dominant discovery channel. It remains essential today not as a primary discovery method but as the standard way to confirm transiting candidates and measure their true masses: major facilities driving this include HARPS (La Silla, ~1 m/s precision), ESPRESSO (VLT, sub-m/s precision), and Keck/HIRES, among others.

AI-generated illustration of the HARPS spectrograph at La Silla Observatory

AI-generated illustration of the HARPS spectrograph at La Silla Observatory, whose ~1 m/s precision is the noise level this repo's own simulation uses. Not an official observatory photograph — see ESO/HARPS for real imagery.

Keplerian radial-velocity fit recovery plot from this repo's own injection-recovery test
Output of scripts/radial_velocity_demo.py: the periodogram and cadence-specific noise threshold, phase-folded Keplerian fit, sampling window, and fixed-cadence amplitude-recovery experiment. The inputs are synthetic and the statistical scope is stated in Section 8.

8. Reproducible injection–recovery experiment

This repository implements a bounded teaching experiment in Python. It is not a production RV search pipeline:

  1. Injects a known Keplerian orbit (period, semi-amplitude K, eccentricity) sampled the way a real ground-based spectrograph campaign actually observes — irregular nightly cadence with seasonal observing-window gaps, not a smooth, evenly sampled curve.
  2. Adds noise combining HARPS's own published ~1 m/s single-measurement photon-noise precision with a ~1.5 m/s stellar jitter term added in quadrature — both realistic, published regimes, since stellar activity (spots, plages, granulation) imposes a noise floor no amount of instrumental precision alone can remove.
  3. Recovers the orbital period from a Lomb-Scargle periodogram (scipy.signal.lombscargle) and publishes the spectral window so cadence-driven aliases are visible.
  4. Refines period, K, eccentricity, and argument of periastron with a full nonlinear Keplerian least-squares fit (scipy.optimize.curve_fit), built on the from-scratch Kepler-equation solver and RV model derived in Sections 2-3.
  5. Calibrates the maximum peak with 1,000 independent white-Gaussian noise realizations on the exact cadence. The plus-one estimate avoids reporting a zero Monte Carlo probability.
  6. Repeats fixed-cadence injections at six amplitudes, with 100 trials each. A recovery must clear the 99th-percentile noise threshold and return a best period within 1% of the injection; Wilson 95% binomial intervals accompany every fraction.
  7. Converts the recovered K into a minimum mass Mp sin i using the semi-amplitude equation and a fixed host star mass, and reports the error against the known injected truth.

The result from this repo's own run, with HARPS-class noise and only 60 irregularly sampled nights:

QuantityInjectedRecoveredError
Period4.23 days4.2303 days0.01%
K (semi-amplitude)92.0 m/s92.00 m/s0.01%
Mp sin i235.7 Earth masses235.8 Earth masses0.00%

The observed peak power is 0.9903; the 99th percentile of the 1,000 noise-only maximum peaks is 0.3165. Zero null maxima reached the observation, so the finite-resolution plus-one estimate is 1/1,001 (0.0999%). This result is conditional on the exact cadence, known 1.80 m/s independent-Gaussian noise scale, searched frequency grid, and null model—not a survey-wide false-alarm probability.

Injected KRecoveriesFractionWilson 95% interval
1.5 m/s35 / 10035%26.4–44.7%
3.0 m/s100 / 100100%96.3–100%
5.0 m/s100 / 100100%96.3–100%
10.0 m/s100 / 100100%96.3–100%
20.0 m/s100 / 100100%96.3–100%
92.0 m/s100 / 100100%96.3–100%

These fractions freeze the cadence, period, phase and eccentricity. They describe this experiment, not a general instrument completeness curve. Download the amplitude-recovery table and fit and null-calibration summary.

Run it yourself: pip install -r requirements.txt && python scripts/radial_velocity_demo.py. Tests live in tests/test_radial_velocity.py, including a regression guard that minimum mass scales as M★2/3 at fixed K — not the M★1/2 scaling it's easy to misremember — and run automatically on every push via GitHub Actions.

9. Limitations and open problems

The amplitude grid includes one near-noise case, but it freezes cadence, phase, period and eccentricity and assumes independent Gaussian residuals with a known scale. It does not marginalize over weather-driven schedules or an orbital population. The local least-squares covariance is conditional on the fitted model and fixed error bars; it is not a posterior distribution. Jitter is injected but not inferred, and the model has no long-term trend, activity indicators, additional companion, correlated-noise process or multi-instrument zero-points.

More fundamentally, stellar activity is the field's hardest open problem: starspots, plages, and granulation on the host star's own surface can imprint RV-like signals of 1-5 m/s or more that mimic or mask a genuine planetary orbit, and disentangling the two is an active area of research (activity indicators like the Ca II H&K lines, and Gaussian-process regression against them, are common mitigations, neither implemented here). And per Section 4, RV alone never yields a true mass — only Mp sin i — so any single-method RV "planet" carries an unresolved inclination ambiguity unless independently broken.

A defensible next experiment would randomize cadence and orbital geometry, infer jitter, inject correlated stellar activity, and compare competing models with posterior-predictive checks. Real RV pipelines such as radvel offer an external benchmark.

10. References

  1. Mayor, M. and Queloz, D., 1995. A Jupiter-mass companion to a solar-type star. Nature, 378, pp.355-359 — the first exoplanet discovered around a Sun-like star (51 Pegasi b).
  2. Marcy, G.W. and Butler, R.P., 1998. Detection of Extrasolar Giant Planets. Annual Review of Astronomy and Astrophysics, 36, pp.57-97.
  3. Lovis, C. and Fischer, D., 2010. Radial Velocity Techniques for Exoplanets, in Exoplanets, ed. S. Seager, University of Arizona Press, pp.27-53.
  4. Lomb, N.R., 1976. Least-squares frequency analysis of unequally spaced data. Astrophysics and Space Science, 39, pp.447-462.
  5. Mayor, M. et al., 2003. Setting New Standards with HARPS. The Messenger, 114, pp.20-24 — the ~1 m/s instrumental precision used above.
  6. Fulton, B.J. et al., 2018. RadVel: The Radial Velocity Modeling Toolkit. Publications of the Astronomical Society of the Pacific, 130(986), 044504.
  7. NASA Exoplanet Archive confirmed-planet counts by discovery method, exoplanetarchive.ipac.caltech.edu — accessed 2026-08-14.
  8. NASA Exoplanet Archive, exoplanetarchive.ipac.caltech.edu.