def gooding(k, r, v, tofs, numiter=150, rtol=1e-8): """Propagate the orbit using the Gooding method. The Gooding method solves the Elliptic Kepler Equation with a cubic convergence, and accuracy better than 10e-12 rad is normally achieved. It is not valid for eccentricities equal or greater than 1.0. Parameters ---------- k : ~astropy.units.Quantity Standard gravitational parameter of the attractor. r : ~astropy.units.Quantity Position vector. v : ~astropy.units.Quantity Velocity vector. tofs : ~astropy.units.Quantity Array of times to propagate. numiter : int Maximum number of iterations for convergence. rtol : float This method does not require of tolerance since it is non iterative. Returns ------- rr : ~astropy.units.Quantity Propagated position vectors. vv : ~astropy.units.Quantity Notes ----- This method was developed by Gooding and Odell in their paper *The hyperbolic Kepler equation (and the elliptic equation revisited)* with DOI: https://doi.org/10.1007/BF01235540 """ k = k.to_value(u.m**3 / u.s**2) r0 = r.to_value(u.m) v0 = v.to_value(u.m / u.s) tofs = tofs.to_value(u.s) results = np.array([ gooding_fast(k, r0, v0, tof, numiter=numiter, rtol=rtol) for tof in tofs ]) return results[:, 0] << u.m, results[:, 1] << u.m / u.s
def gooding(k, r, v, tofs, numiter=150, rtol=1e-8): """Solves the Elliptic Kepler Equation with a cubic convergence and accuracy better than 10e-12 rad is normally achieved. It is not valid for eccentricities equal or greater than 1.0. Parameters ---------- k : ~astropy.units.Quantity Standard gravitational parameter of the attractor. r : ~astropy.units.Quantity Position vector. v : ~astropy.units.Quantity Velocity vector. tofs : ~astropy.units.Quantity Array of times to propagate. rtol: float This method does not require of tolerance since it is non iterative. Returns ------- rr : ~astropy.units.Quantity Propagated position vectors. vv : ~astropy.units.Quantity Note ---- This method was developed by Gooding and Odell in their paper *The hyperbolic Kepler equation (and the elliptic equation revisited)* with DOI: https://doi.org/10.1007/BF01235540 """ k = k.to(u.m**3 / u.s**2).value r0 = r.to(u.m).value v0 = v.to(u.m / u.s).value tofs = tofs.to(u.s).value results = [ gooding_fast(k, r0, v0, tof, numiter=numiter, rtol=rtol) for tof in tofs ] return ( [result[0] for result in results] * u.m, [result[1] for result in results] * u.m / u.s, )