# Initial Orbit Determination (IOD) module¶ ## ¶

The polaistro.core.iod deals with the problem of determining an orbit being given two position vectors along it and the that the body takes to travel from one to another.

This problem is known as Lambert’s problem and many algorithms have developed to solved since the main difficult of it is focused on numerical methods. This module contains two different functions that enable to solve the Lambert problem.

poliastro.core.iod.vallado

Solves the Lambert’s problem.

The algorithm returns the initial velocity vector and the final one, these are computed by the following expresions:

$\begin{split}\vec{v_{o}} &= \frac{1}{g}(\vec{r} - f\vec{r_{0}}) \\ \vec{v} &= \frac{1}{g}(\dot{g}\vec{r} - \vec{r_{0}})\end{split}$

Therefore, the lagrange coefficients need to be computed. For the case of Lamber’s problem, they can be expresed by terms of the initial and final vector:

\begin{split}\begin{align} f = 1 -\frac{y}{r_{o}} \\ g = A\sqrt{\frac{y}{\mu}} \\ \dot{g} = 1 - \frac{y}{r} \\ \end{align}\end{split}

Where y(z) is a function that depends on the poliastro.core.stumpff coefficients:

$\begin{split}y = r_{o} + r + A\frac{zS(z)-1}{\sqrt{C(z)}} \\ A = \sin{(\Delta \nu)}\sqrt{\frac{rr_{o}}{1 - \cos{(\Delta \nu)}}}\end{split}$

The value of z to evaluate the stump functions is solved by applying a Numerical method to the following equation:

$z_{i+1} = z_{i} - \frac{F(z_{i})}{F{}'(z_{i})}$

Function F(z) to the expression:

$F(z) = \left [\frac{y(z)}{C(z)} \right ]^{\frac{3}{2}}S(z) + A\sqrt{y(z)} - \sqrt{\mu}\Delta t$
Parameters: k (float) – Gravitational Parameter r0 (array) – Initial position vector r (array) – Final position vector tof (~float) – Time of flight numiter (int) – Number of iterations to rtol (int) – Number of revolutions v0 (~np.array) – Initial velocity vector v (~np.array) – Final velocity vector

Examples

>>> from poliastro.core.iod import vallado
>>> from astropy import units as u
>>> import numpy as np
>>> from poliastro.bodies import Earth
>>> k = Earth.k.to(u.km**3 / u.s**2)
>>> r1 = np.array([5000, 10000, 2100])*u.km #Initial position vector
>>> r2 = np.array([-14600, 2500, 7000])*u.km #Final position vector
>>> tof = 3600*u.s #Time of fligh
>>> v1, v2 = vallado(k.value, r1.value, r2.value, tof.value, short=True, numiter=35, rtol=1e-8)
>>> v1 = v1*u.km / u.s
>>> v2 = v2*u.km / u.s
>>> print(v1, v2)
[-5.99249499  1.92536673  3.24563805] km / s [-3.31245847 -4.196619   -0.38528907] km / s


Note

This procedure can be found in section 5.3 of Curtis, with all the theoretical description of the problem. Analytical example can be found in the same book under name Example 5.2.

poliastro.core.iod.izzo

Aplies izzo algorithm to solve Lambert’s problem.

Parameters: k (float) – Gravitational Constant r1 (array) – Initial position vector r2 (array) – Final position vector tof (float) – Time of flight between both positions M (int) – Number of revolutions numiter (int) – Numbert of iterations rotl (float) – Error tolerance v1 (~numpy.array) – Initial velocity vector v2 (~numpy.array) – FInal velocity vector