function laguerre_conway(state::Vector{<:Real}, time::Float64, primary::Body=Sun) μ = primary.μ n = 5 # Choose LaGuerre-Conway "n" i = 0 r0 = state[1:3] # Are we in elliptical or hyperbolic orbit? r0_mag = √(state[1]^2 + state[2]^2 + state[3]^2) v0 = state[4:6] v0_mag = √(state[4]^2 + state[5]^2 + state[6]^2) σ0 = (r0 ⋅ v0)/√(μ) a = 1 / ( 2/r0_mag - v0_mag^2/μ ) coeff = 1 - r0_mag/a if a > 0 # Elliptical ΔM = ΔE_new = √(μ) / sqrt(a^3) * time ΔE = 1000 while abs(ΔE - ΔE_new) > 1e-10 ΔE = ΔE_new F = ΔE - ΔM + σ0 / √(a) * (1-cos(ΔE)) - coeff * sin(ΔE) dF = 1 + σ0 / √(a) * sin(ΔE) - coeff * cos(ΔE) d2F = σ0 / √(a) * cos(ΔE) + coeff * sin(ΔE) sign = dF >= 0 ? 1 : -1 ΔE_new = ΔE - n*F / ( dF + sign * √(abs((n-1)^2*dF^2 - n*(n-1)*F*d2F ))) i += 1 if i > 100 throw(LaGuerreConway_Error()) end end F = 1 - a/r0_mag * (1-cos(ΔE)) G = a * σ0/ √(μ) * (1-cos(ΔE)) + r0_mag * √(a) / √(μ) * sin(ΔE) r = a + (r0_mag - a) * cos(ΔE) + σ0 * √(a) * sin(ΔE) Ft = -√(a)*√(μ) / (r*r0_mag) * sin(ΔE) Gt = 1 - a/r * (1-cos(ΔE)) else # Hyperbolic or Parabolic ΔN = √(μ) / sqrt(-a^3) * time ΔH = 0 ΔH_new = time < 0 ? -1 : 1 while abs(ΔH - ΔH_new) > 1e-10 ΔH = ΔH_new F = -ΔN - ΔH + σ0 / √(-a) * (cos(ΔH)-1) + coeff * sin(ΔH) dF = -1 + σ0 / √(-a) * sin(ΔH) + coeff * cos(ΔH) d2F = σ0 / √(-a) * cos(ΔH) + coeff * sin(ΔH) sign = dF >= 0 ? 1 : -1 ΔH_new = ΔH - n*F / ( dF + sign * √(abs((n-1)^2*dF^2 - n*(n-1)*F*d2F ))) i += 1 if i > 100 throw(LaGuerreConway_Error()) end end F = 1 - a/r0_mag * (1-cos(ΔH)) G = a * σ0/ √(μ) * (1-cos(ΔH)) + r0_mag * √(-a) / √(μ) * sin(ΔH) r = a + (r0_mag - a) * cos(ΔH) + σ0 * √(-a) * sin(ΔH) Ft = -√(-a)*√(μ) / (r*r0_mag) * sin(ΔH) Gt = 1 - a/r * (1-cos(ΔH)) end return [ F*state[1:3] + G*state[4:6]; Ft*state[1:3] + Gt*state[4:6]] end