Source code for adam_core.orbit_determination.gibbs

import numpy as np

from adam_core.constants import Constants as c

__all__ = ["calcGibbs"]

MU = c.MU


[docs] def calcGibbs(r1, r2, r3): """ Calculates the velocity vector at the location of the second position vector (r2) using the Gibbs method. .. math:: \vec{D} = \vec{r}_1 \times \vec{r}_2 + \vec{r}_2 \times \vec{r}_3 + \vec{r}_3 \times \vec{r}_1 \vec{N} = r_1 (\vec{r}_2 \times \vec{r}_3) + r_2 (\vec{r}_3 \times \vec{r}_1) + r_3 (\vec{r}_1 \times \vec{r}_2) \vec{B} \equiv \vec{D} \times \vec{r}_2 L_g \equiv \sqrt{\frac{\mu}{ND}} \vec{v}_2 = \frac{L_g}{r_2} \vec{B} + L_g \vec{S} For more details on theory see Chapter 4 in David A. Vallado's "Fundamentals of Astrodynamics and Applications". Parameters ---------- r1 : `~numpy.ndarray` (3) Heliocentric position vector at time 1 in cartesian coordinates in units of AU. r2 : `~numpy.ndarray` (3) Heliocentric position vector at time 2 in cartesian coordinates in units of AU. r3 : `~numpy.ndarray` (3) Heliocentric position vector at time 3 in cartesian coordinates in units of AU. Returns ------- v2 : `~numpy.ndarray` (3) Velocity of object at position r2 at time t2 in units of AU per day. """ r1_mag = np.linalg.norm(r1) r2_mag = np.linalg.norm(r2) r3_mag = np.linalg.norm(r3) Z12 = np.cross(r1, r2) Z23 = np.cross(r2, r3) Z31 = np.cross(r3, r1) # coplanarity = np.arcsin(np.dot(Z23, r1) / (np.linalg.norm(Z23) * r1_mag)) N = r1_mag * Z23 + r2_mag * Z31 + r3_mag * Z12 N_mag = np.linalg.norm(N) D = Z12 + Z23 + Z31 D_mag = np.linalg.norm(D) S = (r2_mag - r3_mag) * r1 + (r3_mag - r1_mag) * r2 + (r1_mag - r2_mag) * r3 # S_mag = np.linalg.norm(S) B = np.cross(D, r2) Lg = np.sqrt(MU / N_mag / D_mag) v2 = Lg / r2_mag * B + Lg * S return v2