def test_true_to_eccentric_hyperbolic(): # Data from Curtis, H. (2013). *Orbital mechanics for engineering students*. # Example 3.5 nu = 100 * u.deg ecc = 2.7696 * u.one expected_F = 2.2927 * u.rad F = angles.nu_to_F(nu, ecc) assert_quantity_allclose(F, expected_F, rtol=1e-4)
def test_true_to_eccentric_hyperbolic(): # Data from Curtis, H. (2013). *Orbital mechanics for engineering students*. # Example 3.5 nu = 100 * u.deg ecc = 2.7696 * u.one expected_F = 2.2927 * u.rad F = angles.nu_to_F(nu, ecc) assert_quantity_allclose(F, expected_F, rtol=1e-4)
def test_true_to_mean_hyperbolic(): # Data from Curtis, H. (2013). "Orbital mechanics for engineering students". # Example 3.5 nu = 100 * u.deg ecc = 2.7696 * u.one expected_M = 11.279 * u.rad M = angles.F_to_M(angles.nu_to_F(nu, ecc), ecc) assert_quantity_allclose(M, expected_M, rtol=1e-4)
def newton(func, x0, ecc, M, fprime=None, maxiter=50): EFD = 1.0 * x0 delta = 1e-2 nu_prev = 1e+10 converged = False # Newton-Rapheson method with u.set_enabled_equivalencies(u.dimensionless_angles()): for iter in range(maxiter): if ecc < 1.0 - delta: nu = E_to_nu(EFD, ecc) E_plus = nu_to_E(nu + variation, ecc) E_minus = nu_to_E(nu - variation, ecc) M_actual = _kepler_equation(EFD, M, ecc, count=False) M_plus = _kepler_equation(E_plus, M, ecc, count=False) M_minus = _kepler_equation(E_minus, M, ecc, count=False) elif ecc > 1.0 + delta: nu = F_to_nu(EFD, ecc) F_plus = nu_to_F(nu + variation, ecc) F_minus = nu_to_F(nu - variation, ecc) M_actual = _kepler_equation_hyper(EFD, M, ecc, count=False) M_plus = _kepler_equation_hyper(F_plus, M, ecc, count=False) M_minus = _kepler_equation_hyper(F_minus, M, ecc, count=False) else: nu = D_to_nu(EFD, ecc) D_plus = nu_to_D(nu + variation, ecc) D_minus = nu_to_D(nu - variation, ecc) M_actual = _kepler_equation_parabolic(EFD, M, ecc, count=False) M_plus = _kepler_equation_parabolic(D_plus, M, ecc, count=False) M_minus = _kepler_equation_parabolic(D_minus, M, ecc, count=False) converged = (np.abs(nu_prev - nu) < variation) and (M_actual * M_plus <= 0 or M_minus * M_actual <= 0) nu_prev = nu EFD_new = EFD - func(EFD, M, ecc) / fprime(EFD, M, ecc) if converged: return EFD_new EFD = EFD_new print(ecc, "fail") return -1
def test_mean_to_true_hyperbolic_highecc(expected_nu, ecc): M = angles.F_to_M(angles.nu_to_F(expected_nu, ecc), ecc) nu = angles.F_to_nu(angles.M_to_F(M, ecc), ecc) assert_quantity_allclose(nu, expected_nu, rtol=1e-4)