Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
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)