Chiron — the 14th Body

Ketu v1.3 adds Chiron as the 14th celestial body. Chiron is a small solar system body (a centaur) orbiting between Saturn and Uranus, carrying astrological significance as the “Wounded Healer”. It is accessible through all standard Ketu calculation functions using body_id=13.

Implementation Details

Property

Value

body_id

13

Valid date range

1900-01-01 to 2100-12-31 (Julian Days 2415020.5 to 2488069.5) — expanded in v1.4

Position accuracy

max error 0.001214° (sub-arcminute, ~4 arcseconds) — improved in v1.4

Evaluation method

Pure-NumPy Chebyshev polynomial evaluation

Runtime dependency

None — coefficients embedded in ketu/data/chiron_coeffs.npz

The Chebyshev coefficients were generated offline using Swiss Ephemeris (build-only, AGPL-isolated). At runtime, Ketu uses pure NumPy — no pyswisseph dependency required.

Accessing Chiron via Calculation Functions

Chiron uses the same API as any other body — just pass body_id=13.

from ketu.calculations import long, lat

jd = 2451545.0   # J2000: 2000-01-01 12:00 UTC

chiron_lon = long(jd, 13)   # ~251.6125 degrees
chiron_lat = lat(jd, 13)

print(f"Chiron longitude: {chiron_lon:.4f} deg")
print(f"Chiron latitude:  {chiron_lat:.4f} deg")

You can also compute Chiron’s properties alongside other bodies:

from ketu.calculations import long, lat

jd = 2451545.0
body_ids = [0, 1, 13]   # Sun, Moon, Chiron
lons = [long(jd, b) for b in body_ids]

Chiron in a Natal Chart

compute_chart returns a structured array with a body_lons field of shape [14]. Index 13 is Chiron.

from ketu.charts import compute_chart

jd = 2451545.0
chart = compute_chart(jd, 48.8566, 2.3522)   # Paris, J2000

chiron_longitude = chart["body_lons"][13]
chiron_latitude  = chart["body_lats"][13]
chiron_speed     = chart["body_speeds"][13]   # degrees/day

print(f"Chiron at {chiron_longitude:.4f} deg")

All relational chart functions (synastry, composite, returns) inherit Chiron automatically — it appears at index 13 in every body_lons, body_lats, body_speeds, aspect_matrix, and aspect_orbs field.

Date Range and Error Behaviour

Chiron’s embedded coefficients cover 1900-01-01 to 2100-12-31 (expanded in v1.4). Input outside this range is silently clamped to the nearest segment boundary — no ValueError is raised:

from ketu.calculations import long

# Out-of-range JD: result is clamped to the nearest boundary (no exception)
chiron_lon = long(2300000.0, 13)   # clamped to the 1900/2100 edge

For dates inside the range, the positional error is guaranteed to be at most 0.001214° (about 4 arcseconds), well below the 0.01° target set during the Chebyshev spike (Phase 23).

Breaking Change in v1.3 (D-08)

Prior to v1.3, CHART_DTYPE had a body_lons[13] field (indices 0–12). Adding Chiron expanded this to body_lons[14] (indices 0–13). Any code that hardcoded the body count (13) or accessed body arrays by fixed numeric index beyond 12 must be updated.

See Migration Guide for the full upgrade path from v1.2 to v1.3.

Next Steps