lamberthub

Lambert's problem solvers for orbital mechanics.

Version

avanzini Module

Summary

Functions

avanzini2008

Solves Lambert problem using Gooding’s devised algorithm.

Description

Lambert’s problem solver using the method proposed by Giulio Avanzini in 2008.

This module holds the implementation of the algorithm devised by Avanzini, which appeared for the first time in his article [1]. The solver takes advantage of the conservation of the eccentricity projection along the chord direction, so it iterates over this orbital element till the time of transfer from Kepler’s equation matches the desired transfer one.

However, the original routines was not developed to work under multi-revolutions conditions. In addition, Avanzini did not provide the derivative of Kepler’s equation with respect to the transverse eccentricity component, forcing a bounded numerical method (bisection or regulafalsi). This was solved by Quan He, which proposed new changes to Avanzini’s original algorithm in an article [2] proposed in 2010.

Finally, a new method [3] was proposed by Changxuan Wen in 2014, simplifying all previous routines.

[1] Avanzini, G. (2008). A simple Lambert algorithm. Journal of guidance,

control, and dynamics, 31(6), 1587-1594.

[2] He, Q., Li, J., & Han, C. (2010). Multiple-revolution solutions of the

transverse-eccentricity-based lambert problem. Journal of guidance, control, and dynamics, 33(1), 265-269.

[3] Wen, C., Zhao, Y., & Shi, P. (2014). Derivative analysis and algorithm

modification of transverse-eccentricity-based Lambert problem. Journal of Guidance, Control, and Dynamics, 37(4), 1195-1201.

Module Details

lamberthub.ecc_solvers.avanzini.avanzini2008(mu, r1, r2, tof, M=0, is_prograde=True, is_low_path=True, maxiter=35, atol=1e-05, rtol=1e-07, full_output=False)[source]

Solves Lambert problem using Gooding’s devised algorithm.

Parameters:
mu: float

Gravitational parameter, equivalent to \(GM\) of attractor body.

r1: numpy.array

Initial position vector.

r2: numpy.array

Final position vector.

M: int

Number of revolutions. Must be equal or greater than 0 value.

is_prograde: bool

If True, specifies prograde motion. Otherwise, retrograde motion is imposed.

is_low_path: bool

If two solutions are available, it selects between high or low path.

maxiter: int

Maximum number of iterations.

atol: float

Absolute tolerance.

rtol: float

Relative tolerance.

full_output: bool

If True, the number of iterations and time per iteration are also returned.

Returns:
v1: numpy.array

Initial velocity vector.

v2: numpy.array

Final velocity vector.

numiter: int

Number of iterations.

tpi: float

Time per iteration in seconds.

Notes

The following routine might be simplified making use of private functions. However, we decided to expose all the auxiliary routines to properly reproduce original report figures.