Bi-Elliptic Transfer (space-systems/orbit-mechanics/bi-elliptic-transfer)
Use when the task is analyzing the bi-elliptic three-impulse transfer
between two coplanar circular orbits: the perigee raise to an
intermediate apogee radius r_b, the burn at r_b that raises the perigee
to the target radius, the circularization at the target, the total
delta-v, and the crossover comparison against the Hohmann two-impulse
transfer for the same orbit pair. This leaf implements the standard
three-burn model in pure Python, stdlib only. It pairs with
space-systems/orbit-mechanics/hohmann-transfer, which owns the
two-impulse Hohmann transfer itself; this leaf re-derives the Hohmann
budget only as the internal comparison baseline that decides whether the
three-burn strategy wins at large radius ratios.
Domain quick reference
- Circular orbit speed: v = sqrt(mu / r), with mu the gravitational
parameter (3.986004418e14 m^3/s^2 for Earth) and r the orbit radius
in meters.
- First burn (perigee raise): dv1 = sqrt(mu * (2/r1 - 2/(r1 + r_b))) -
sqrt(mu / r1). At the inner circular orbit radius r1 the spacecraft
accelerates onto a transfer ellipse whose apogee reaches the
intermediate radius r_b above the target radius r2.
- Second burn (at the intermediate apogee): dv2 =
sqrt(mu * (2/r_b - 2/(r_b + r2))) - sqrt(mu * (2/r_b - 2/(r1 + r_b))).
At r_b the spacecraft changes from the first ellipse (perigee r1) to
the second ellipse (perigee r2), so it arrives at the target radius
from above.
- Third burn (circularization): dv3 = sqrt(mu * (2/r2 - 2/(r_b + r2))) -
sqrt(mu / r2). The spacecraft meets r2 at the perigee of the second
ellipse, faster than the circular speed, so the closing impulse is
retrograde and dv3 is the positive magnitude of that speed gap.
- Bi-elliptic total: dv_bi = dv1 + dv2 + dv3. The three impulses are
magnitudes; the arrival burn direction differs from the first two.
- Hohmann baseline: dv1_h = sqrt(mu * (2/r1 - 2/(r1 + r2))) -
sqrt(mu/r1) and dv2_h = sqrt(mu/r2) - sqrt(mu * (2/r2 - 2/(r1 + r2))),
summed for the two-impulse total of the same orbit pair.
- Crossover saving: saving = dv_hohmann - dv_bi. The bi-elliptic
transfer is cheaper for large radius ratios (roughly r2/r1 above
11.94 at the best r_b); at small ratios the extra middle burn only
adds cost. Ties go to hohmann, the simpler strategy.
- Transfer time: the sum of the two half-period coasts, t = pi *
sqrt((r1 + r_b)^3 / (8 mu)) + pi * sqrt((r_b + r2)^3 / (8 mu)). The
overshoot to r_b costs days: the worked example below coasts about
14.5 days.
Workflow
- Establish the gravitational parameter mu and the two circular orbit
radii r1 (start) and r2 (target, larger) in meters; radius, not
altitude.
- Choose the intermediate apogee radius r_b above r2. The classic
choice r_b = 2 * r2 shows the crossover saving at large radius
ratios; r_b close to r2 degenerates into the Hohmann budget.
- Compute the Hohmann baseline for the orbit pair with
hohmann_delta_v(mu, r1, r2) to know what the two-burn strategy
costs.
- Compute the three impulses with bi_elliptic_delta_v(mu, r1, r_b,
r2); check that dv3 is small compared with dv1 when r_b is far
above r2, as the closing burn happens near the target.
- Compare strategies with transfer_comparison(mu, r1, r2, r_b) and
read the saving and the verdict ("bi-elliptic" when the three-burn
total is lower, "hohmann" otherwise).
- When mission time matters, size the coast with
transfer_time_bi_elliptic(mu, r1, r_b, r2) and convert to days;
the bi-elliptic option trades a much longer transfer time for its
delta-v saving.
- Sanity-check the choice: an intermediate apogee at 2 * r2 with
r2 = 30 * r1 saves about 113 m/s over Hohmann, while at r2 = 2 * r1
the three-burn option loses and the verdict is "hohmann".
Worked example
Earth mu = 3.986004418e14 m^3/s^2. Start radius r1 = 6578 km (300 km
circular orbit), target radius r2 = 30 * r1 = 197340 km, intermediate
apogee r_b = 2 * r2 = 394680 km. Module outputs (deterministic):
- Hohmann baseline: dv1 = 3045.4 m/s, dv2 = 1060.2 m/s, total =
4105.6 m/s.
- Bi-elliptic: dv1 = 3133.8 m/s, dv2 = 638.6 m/s, dv3 = 219.9 m/s,
total = 3992.2 m/s.
- Crossover: saving = 113.4 m/s, verdict "bi-elliptic": the three-burn
transfer is cheaper at this radius ratio with r_b = 2 * r2.
- Transfer time: 1248552.7 s, about 14.45 days, versus the roughly
5.3-hour Hohmann coast for the same orbit pair.
Pitfalls
- Passing altitude instead of radius: all inputs are circular orbit
radii in meters (r1, r2, r_b), so a 300 km orbit enters as
6578000 m, not 300000.
- Choosing r_b at or below the target: the intermediate apogee must
sit above r2 (r_b <= r2 raises ValueError); r_b close to r2 just
degenerates into the Hohmann budget and buys nothing.
- Reversing the transfer direction: an inward transfer (r2 <= r1) is
rejected with ValueError - this leaf models outward raises only.
- Expecting the extra burn to always pay: the bi-elliptic total only
beats Hohmann at large radius ratios (the worked example saves
113.4 m/s at r2 = 30 r1); at small ratios like r2 = 2 r1 the
verdict is "hohmann" and ties go to the simpler two-burn strategy.
- Comparing strategies on delta-v alone: the bi-elliptic coast runs
14.45 days versus a 5.3-hour Hohmann coast in the worked example,
so a delta-v saving can be a mission-time loss.
- Forgetting the burn directions: dv1 and dv2 are prograde raises,
but dv3 is the retrograde circularization at the target perigee;
the three values are magnitudes, and only their sum forms the
total.
Verification
- Worked-example bounds (contract anchors): Hohmann total in
3900-4300 m/s, bi-elliptic total in 3850-4150 m/s, saving in
50-180 m/s, verdict "bi-elliptic", transfer time in 10-40 days. The
module outputs above sit inside every bound.
- Sanity at a small ratio: with r2 = 2 * r1 and a moderate r_b the
Hohmann total stays below the bi-elliptic total and the verdict is
"hohmann".
- Degenerate limit: with r_b very close to r2 (r_b = 1.01 * r2) the
bi-elliptic total approaches the Hohmann total from above
(bi_total > hohmann_total - 1.0 m/s).
- Round-trip: every impulse equals the difference of the two vis-viva
speeds it is defined from, and the total equals dv1 + dv2 + dv3
within 1e-6.
- Determinism: pure math on module constants, no random number
generation anywhere; repeated calls return identical floats.
- ValueError rejection of every non-physical input: mu <= 0, r1 <= 0,
r2 <= 0, r1 == r2, r_b <= r2, and an inward transfer (r2 <= r1).
- Run the contract test offline: python3
scripts/test_bi_elliptic_transfer.py (33 tests, deterministic).
Related leaves
- space-systems/orbit-mechanics/hohmann-transfer: owns the two-impulse
Hohmann transfer that this leaf re-derives only as the comparison
baseline.
- space-systems/orbit-mechanics/keplerian-elements: the two-body
orbital elements that frame both circular end orbits.
- space-systems/orbit-mechanics/orbital-perturbations: J2 and drag
effects that a many-day transfer arc accumulates.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_bi_elliptic_transfer.py
The test covers the worked example (Hohmann and bi-elliptic anchors
with their magnitude bounds, the 50-180 m/s saving window, the
"bi-elliptic" verdict, the 10-40 day time bound), the circular-speed
identity, the small-radius-ratio sanity check with a "hohmann" verdict,
the degenerate r_b near r2 limit, vis-viva round trips for every
impulse, exact convenience-dict keys, run-to-run determinism, and
ValueError rejection of every non-physical input in the validation
list.
Compliance
- Standards referenced, not reproduced: ECSS-E-ST-10C (systems
engineering general requirements) frames mission analysis and orbit
design within the ECSS lifecycle, and the three-burn transfer
geometry and vis-viva relationships above are common astrodynamics
methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: bi-elliptic-transfer3description: Use when you must analyze the bi-elliptic three-impulse transfer between two coplanar circular orbits and compare it against the Hohmann transfer: compute the three burn delta-v values (the perigee raise to the intermediate apogee radius, the intermediate-apogee burn that raises the perigee to the target radius, and the target circularization), the total bi-elliptic delta-v, the Hohmann delta-v for the same orbit pair as the comparison baseline, the delta-v saving of the cheaper strategy, and the chosen transfer verdict. Produces the three impulse magnitudes, the two transfer totals, the saving, and the strategy verdict that gate an orbit-transfer design choice at large radius ratios. Trigger: bi-elliptic-transfer, three-impulse-transfer, intermediate-apogee, delta-v-saving, orbit-transfer-comparison, bi-elliptic-crossover.4license: Apache-2.05---67# Bi-Elliptic Transfer (space-systems/orbit-mechanics/bi-elliptic-transfer)89Use when the task is analyzing the bi-elliptic three-impulse transfer10between two coplanar circular orbits: the perigee raise to an11intermediate apogee radius r_b, the burn at r_b that raises the perigee12to the target radius, the circularization at the target, the total13delta-v, and the crossover comparison against the Hohmann two-impulse14transfer for the same orbit pair. This leaf implements the standard15three-burn model in pure Python, stdlib only. It pairs with16space-systems/orbit-mechanics/hohmann-transfer, which owns the17two-impulse Hohmann transfer itself; this leaf re-derives the Hohmann18budget only as the internal comparison baseline that decides whether the19three-burn strategy wins at large radius ratios.2021## Domain quick reference2223- Circular orbit speed: v = sqrt(mu / r), with mu the gravitational24 parameter (3.986004418e14 m^3/s^2 for Earth) and r the orbit radius25 in meters.26- First burn (perigee raise): dv1 = sqrt(mu * (2/r1 - 2/(r1 + r_b))) -27 sqrt(mu / r1). At the inner circular orbit radius r1 the spacecraft28 accelerates onto a transfer ellipse whose apogee reaches the29 intermediate radius r_b above the target radius r2.30- Second burn (at the intermediate apogee): dv2 =31 sqrt(mu * (2/r_b - 2/(r_b + r2))) - sqrt(mu * (2/r_b - 2/(r1 + r_b))).32 At r_b the spacecraft changes from the first ellipse (perigee r1) to33 the second ellipse (perigee r2), so it arrives at the target radius34 from above.35- Third burn (circularization): dv3 = sqrt(mu * (2/r2 - 2/(r_b + r2))) -36 sqrt(mu / r2). The spacecraft meets r2 at the perigee of the second37 ellipse, faster than the circular speed, so the closing impulse is38 retrograde and dv3 is the positive magnitude of that speed gap.39- Bi-elliptic total: dv_bi = dv1 + dv2 + dv3. The three impulses are40 magnitudes; the arrival burn direction differs from the first two.41- Hohmann baseline: dv1_h = sqrt(mu * (2/r1 - 2/(r1 + r2))) -42 sqrt(mu/r1) and dv2_h = sqrt(mu/r2) - sqrt(mu * (2/r2 - 2/(r1 + r2))),43 summed for the two-impulse total of the same orbit pair.44- Crossover saving: saving = dv_hohmann - dv_bi. The bi-elliptic45 transfer is cheaper for large radius ratios (roughly r2/r1 above46 11.94 at the best r_b); at small ratios the extra middle burn only47 adds cost. Ties go to hohmann, the simpler strategy.48- Transfer time: the sum of the two half-period coasts, t = pi *49 sqrt((r1 + r_b)^3 / (8 mu)) + pi * sqrt((r_b + r2)^3 / (8 mu)). The50 overshoot to r_b costs days: the worked example below coasts about51 14.5 days.5253## Workflow54551. Establish the gravitational parameter mu and the two circular orbit56 radii r1 (start) and r2 (target, larger) in meters; radius, not57 altitude.582. Choose the intermediate apogee radius r_b above r2. The classic59 choice r_b = 2 * r2 shows the crossover saving at large radius60 ratios; r_b close to r2 degenerates into the Hohmann budget.613. Compute the Hohmann baseline for the orbit pair with62 hohmann_delta_v(mu, r1, r2) to know what the two-burn strategy63 costs.644. Compute the three impulses with bi_elliptic_delta_v(mu, r1, r_b,65 r2); check that dv3 is small compared with dv1 when r_b is far66 above r2, as the closing burn happens near the target.675. Compare strategies with transfer_comparison(mu, r1, r2, r_b) and68 read the saving and the verdict ("bi-elliptic" when the three-burn69 total is lower, "hohmann" otherwise).706. When mission time matters, size the coast with71 transfer_time_bi_elliptic(mu, r1, r_b, r2) and convert to days;72 the bi-elliptic option trades a much longer transfer time for its73 delta-v saving.747. Sanity-check the choice: an intermediate apogee at 2 * r2 with75 r2 = 30 * r1 saves about 113 m/s over Hohmann, while at r2 = 2 * r176 the three-burn option loses and the verdict is "hohmann".7778## Worked example7980Earth mu = 3.986004418e14 m^3/s^2. Start radius r1 = 6578 km (300 km81circular orbit), target radius r2 = 30 * r1 = 197340 km, intermediate82apogee r_b = 2 * r2 = 394680 km. Module outputs (deterministic):8384- Hohmann baseline: dv1 = 3045.4 m/s, dv2 = 1060.2 m/s, total =85 4105.6 m/s.86- Bi-elliptic: dv1 = 3133.8 m/s, dv2 = 638.6 m/s, dv3 = 219.9 m/s,87 total = 3992.2 m/s.88- Crossover: saving = 113.4 m/s, verdict "bi-elliptic": the three-burn89 transfer is cheaper at this radius ratio with r_b = 2 * r2.90- Transfer time: 1248552.7 s, about 14.45 days, versus the roughly91 5.3-hour Hohmann coast for the same orbit pair.929394## Pitfalls9596- Passing altitude instead of radius: all inputs are circular orbit97 radii in meters (r1, r2, r_b), so a 300 km orbit enters as98 6578000 m, not 300000.99- Choosing r_b at or below the target: the intermediate apogee must100 sit above r2 (r_b <= r2 raises ValueError); r_b close to r2 just101 degenerates into the Hohmann budget and buys nothing.102- Reversing the transfer direction: an inward transfer (r2 <= r1) is103 rejected with ValueError - this leaf models outward raises only.104- Expecting the extra burn to always pay: the bi-elliptic total only105 beats Hohmann at large radius ratios (the worked example saves106 113.4 m/s at r2 = 30 r1); at small ratios like r2 = 2 r1 the107 verdict is "hohmann" and ties go to the simpler two-burn strategy.108- Comparing strategies on delta-v alone: the bi-elliptic coast runs109 14.45 days versus a 5.3-hour Hohmann coast in the worked example,110 so a delta-v saving can be a mission-time loss.111- Forgetting the burn directions: dv1 and dv2 are prograde raises,112 but dv3 is the retrograde circularization at the target perigee;113 the three values are magnitudes, and only their sum forms the114 total.115## Verification116117- Worked-example bounds (contract anchors): Hohmann total in118 3900-4300 m/s, bi-elliptic total in 3850-4150 m/s, saving in119 50-180 m/s, verdict "bi-elliptic", transfer time in 10-40 days. The120 module outputs above sit inside every bound.121- Sanity at a small ratio: with r2 = 2 * r1 and a moderate r_b the122 Hohmann total stays below the bi-elliptic total and the verdict is123 "hohmann".124- Degenerate limit: with r_b very close to r2 (r_b = 1.01 * r2) the125 bi-elliptic total approaches the Hohmann total from above126 (bi_total > hohmann_total - 1.0 m/s).127- Round-trip: every impulse equals the difference of the two vis-viva128 speeds it is defined from, and the total equals dv1 + dv2 + dv3129 within 1e-6.130- Determinism: pure math on module constants, no random number131 generation anywhere; repeated calls return identical floats.132- ValueError rejection of every non-physical input: mu <= 0, r1 <= 0,133 r2 <= 0, r1 == r2, r_b <= r2, and an inward transfer (r2 <= r1).134- Run the contract test offline: python3135 scripts/test_bi_elliptic_transfer.py (33 tests, deterministic).136137## Related leaves138139- space-systems/orbit-mechanics/hohmann-transfer: owns the two-impulse140 Hohmann transfer that this leaf re-derives only as the comparison141 baseline.142- space-systems/orbit-mechanics/keplerian-elements: the two-body143 orbital elements that frame both circular end orbits.144- space-systems/orbit-mechanics/orbital-perturbations: J2 and drag145 effects that a many-day transfer arc accumulates.146147## Behavior contract (gate 3)148149Run the deterministic contract test (stdlib unittest, offline):150151 python3 scripts/test_bi_elliptic_transfer.py152153The test covers the worked example (Hohmann and bi-elliptic anchors154with their magnitude bounds, the 50-180 m/s saving window, the155"bi-elliptic" verdict, the 10-40 day time bound), the circular-speed156identity, the small-radius-ratio sanity check with a "hohmann" verdict,157the degenerate r_b near r2 limit, vis-viva round trips for every158impulse, exact convenience-dict keys, run-to-run determinism, and159ValueError rejection of every non-physical input in the validation160list.161162## Compliance163164- Standards referenced, not reproduced: ECSS-E-ST-10C (systems165 engineering general requirements) frames mission analysis and orbit166 design within the ECSS lifecycle, and the three-burn transfer167 geometry and vis-viva relationships above are common astrodynamics168 methodology, summary-only per standards-map.yaml.169- compliance: STANDARDS-REF, gated: false.