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 |
|---|---|
|
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 |
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
API reference — full
ketu.calculationssignature listMigration Guide — upgrading from v1.2, D-08 body-axis changes