Orbital Mechanics and Kepler's Laws: from the ellipse to the anomaly equation
Kepler's three laws let you compute the exact position of any planet at any point in time — without numerical integration. The key: the transcendental Kepler equation, solved in a few Newton's method iterations.
1. Kepler's three laws
Йоганн Кеплер (1609–1619) вивів свої закони з спостережень Тихо Браге — і вони виявилися точними задовго до того, як Ньютон пояснив їх через закон тяжіння.
Every planet moves along an ellipse with the Sun at one of its foci.
The planet's radius vector sweeps equal areas in equal time intervals.
The square of the orbital period is proportional to the cube of the semi-major axis: T² ∝ a³.
Разом ці закони описують кеплерівський рух — ідеальну дві-тільну задачу, де масою людини нехтуємо, а Сонце нерухоме. Реальний Сонячний рух відхиляється від цього через взаємні тяжіння планет — саме тоді потрібні N-тіла.
2. Ellipse geometry
Еліпс визначається великою напівосю a та ексцентриситетом e ∈ [0, 1):
c = a · e ← distance centre → focus
r_min = a(1 − e) ← perihelion (closest point to the Sun)
r_max = a(1 + e) ← aphelion (farthest point)
У фокусній системі координат (Сонце у лівому фокусі) положення точки на еліпсі описується через справжню аномалію ν (кут відносно перигелію):
3. First law — elliptical orbit
Орбіту повністю описують 6 орбітальних елементів Кеплера. Для 2D-симуляції Сонячної системи достатньо двох:
- a — велика напівось (розмір орбіти, в а.о.)
- e — ексцентриситет (форма: 0 = коло, близько до 1 = дуже видовжений еліпс)
Для 3D потрібні ще нахил i, довгота висхідного вузла Ω, аргумент перицентру ω та середня аномалія у епох M₀. NASA Horizons публікує всі 6 елементів для кожної планети.
4. Second law — equal areas та збереження моменту
Другий закон Кеплера — це збереження кутового моменту:
dA/dt = L / (2m) = const ← areal velocity — constant
Наслідок: у перигелії планета рухається найшвидше, в афелії — найповільніше. Кутова швидкість ν̇ змінюється з відстанню:
μ = G·M — gravitational parameter of the Sun
In AU/yr²: μ = 4π² (with a in AU, T in years)
Це означає, що ми не можемо просто лінійно змінювати ν за часом — нам потрібна фізична прив'язка через рівняння Кеплера.
5. Third law — harmonic
Ньютон вивів точну форму через закон тяжіння:
In the AU–year system: T [years] = a^(3/2) [AU]
Земля: a = 1 а.о. → T = 1 рік ✓
Марс: a = 1.524 → T = 1.524^1.5 ≈ 1.88 рр ✓
Юпітер: a = 5.203 → T = 5.203^1.5 ≈ 11.86 рр ✓
Третій закон дозволяє обчислити кутову швидкість (середній рух) n:
6. Kepler's equation and anomalies
Щоб знайти де знаходиться планета у момент часу t, потрібно пов'язати час із кутом. Введемо три аномалії:
-
Середня аномалія M — лінійна функція часу:
M = n·(t − t_peri) - Ексцентрична аномалія E — допоміжний кут, паметричне опис еліпса
- Справжня аномалія ν — реальний кут на орбіті
Зв'язок M і E — трансцендентне рівняння Кеплера:
Це рівняння не можна вирішити аналітично для E. Використовують ітерацію Ньютона:
Eₙ₊₁ = Eₙ − (Eₙ − e·sin(Eₙ) − M) / (1 − e·cos(Eₙ))
Converges in 3–5 iterations for all Solar System planets
Маючи E, обчислюємо справжню аномалію ν та декартові координати на орбіті:
y_orb = a · √(1−e²) · sin(E)
tan(ν/2) = √((1+e)/(1−e)) · tan(E/2)
r = a · (1 − e · cos(E)) ← distance to the Sun
7. JavaScript implementation
/** Solves Kepler's equation by Newton's method */
function solveKepler(M, e, tol = 1e-9) {
M = M % (2 * Math.PI); // Normalise to [0, 2π]
let E = M;
for (let i = 0; i < 50; i++) {
const dE = (E - e * Math.sin(E) - M) / (1 - e * Math.cos(E));
E -= dE;
if (Math.abs(dE) < tol) break;
}
return E;
}
/** Returns {x, y} in the orbital plane (AU) */
function orbitalPos(a, e, M) {
const E = solveKepler(M, e);
return {
x: a * (Math.cos(E) - e),
y: a * Math.sqrt(1 - e * e) * Math.sin(E)
};
}
/** Planets: a (AU), e, period (years), color */
const PLANETS = [
{ name: 'Mercury', a: 0.387, e: 0.206, T: 0.241, color: '#a8a8a8' },
{ name: 'Venus', a: 0.723, e: 0.007, T: 0.615, color: '#f5c842' },
{ name: 'Earth', a: 1.000, e: 0.017, T: 1.000, color: '#4fa3e0' },
{ name: 'Mars', a: 1.524, e: 0.093, T: 1.881, color: '#d95030' },
{ name: 'Jupiter', a: 5.203, e: 0.049, T: 11.86, color: '#e8b87d' },
{ name: 'Saturn', a: 9.537, e: 0.057, T: 29.46, color: '#c8b560' },
];
// Animation: t in years
let t = 0;
function animate() {
clearCanvas();
drawSun();
for (const p of PLANETS) {
const n = 2 * Math.PI / p.T; // mean motion [rad/yr]
const M = n * t; // mean anomaly
const { x, y } = orbitalPos(p.a, p.e, M);
drawPlanet(x, y, p.color, p.name);
}
t += 0.005; // 1 frame = ~1.8 days
requestAnimationFrame(animate);
}
Обчислення точного положення планети займає ~10 нс. Навіть усі 8 планет + Плутон + 100 астероїдів розраховуються за <5 мкс — набагато дешевше за N-тіла.
8. Real planet data
| Планета | a (а.о.) | e | T (роки) | Перигелій (а.о.) | Афелій (а.о.) |
|---|---|---|---|---|---|
| Mercury | 0.387 | 0.206 | 0.241 | 0.307 | 0.467 |
| Venus | 0.723 | 0.007 | 0.615 | 0.718 | 0.728 |
| Earth | 1.000 | 0.017 | 1.000 | 0.983 | 1.017 |
| Mars | 1.524 | 0.093 | 1.881 | 1.381 | 1.666 |
| Jupiter | 5.203 | 0.049 | 11.86 | 4.950 | 5.455 |
| Saturn | 9.537 | 0.057 | 29.46 | 9.001 | 10.07 |
| Uranus | 19.19 | 0.046 | 84.01 | 18.29 | 20.09 |
| Neptune | 30.07 | 0.010 | 164.8 | 29.77 | 30.37 |
Дані відповідають середнім орбітальним елементам J2000 (NASA JPL). Реальні елементи повільно змінюються через прецесію (спорадичні збурення від інших планет).
9. Kepler vs N-body: коли що обирати
Аналітичний підхід Кеплера та чисельний метод N-тіл вирішують різні задачі:
| Criterion | Kepler (analytic) | N-body (Leapfrog) |
|---|---|---|
| Bodies | One body around centre | Any number |
| Accuracy | Machine precision (±eps) | Depends on dt |
| Speed | O(1) per planet | O(N²) або O(N log N) |
| Interactions | With central body only | All pairwise |
| Example | Position of Mars in 1000 years | Galaxy collisions, body+moon |
Для Сонячної системи повнофункціональна симуляція поєднує обидва: Кеплер для фонових планет (не впливають між собою), N-тіло для випадків, де потрібні збурення (астероїди поблизу Юпітера, резонанси в поясі Койпера).
🪐 Solar System simulation
Interactive Solar System with real orbital elements of the planets and Three.js.