The answer poasted by @SF. based on Hop's blog checks out!
Here's a numerical verification. It's not pretty, but continuing the orbits (shown for both Mars and Earth) for 55% of their period nicely intersects 90 degrees away from the staring point, yay!
body a(km) dv(m/s) alpha(deg)
----- ----- ------- ----------
Earth 5438 7199 22.5
Mars 2893 3235 22.5
def deriv(X, t):
x, v = X.reshape(2, -1)
acc = -GM * x * ((x**2).sum())**-1.5
return np.hstack((v, acc))
def Hops_hop(theta, R, GM):
a = (1. + np.sin(0.5*theta)) * 0.5 * R
dv = np.sqrt(GM * (2./R - 1./a))
alpha = 0.25 * (pi - theta)
return a, dv, alpha
import numpy as np
from scipy.integrate import odeint as ODEint
import matplotlib.pyplot as plt
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
# standard gravitational parameter
GMe = 3.986E+14 # m^3/s^2
GMm = 4.283E+13 # m^3/s^2
Re = 6371000. # meters
Rm = 3389500. # meters
pairs = (Re, GMe), (Rm, GMm)
theta = halfpi # 90 degrees
answers = []
for R, GM in pairs:
a, dv, alpha = Hops_hop(theta, R, GM)
T = twopi * np.sqrt(a**3/GM)
time = np.linspace(0, 0.55*T, 500)
x0 = R * np.array([ np.sin(0.5*theta), np.cos(0.5*theta)])
v0 = dv * np.array([ np.cos(alpha), -np.sin(alpha) ])
X0 = np.hstack((x0, v0))
answer, info = ODEint(deriv, X0, time, full_output=True)
answers.append(answer)
theta = np.linspace(0, twopi, 361)
unit_circle = [f(theta) for f in (np.cos, np.sin)]
sqrt2 = np.sqrt(2.)
if True:
plt.figure()
for answer, (R, GM) in zip(answers, pairs):
x, y = answer.T[:2]
plt.plot(x, y)
plt.plot(x[:1], y[:1], 'ok')
for answer, (R, GM) in zip(answers, pairs):
x, y = [R*thing for thing in unit_circle]
plt.plot(x, y, '-k')
plt.plot([0, Re/sqrt2], [0, Re/sqrt2], '-k')
plt.plot([0, Re/sqrt2], [0, -Re/sqrt2], '-k')
plt.show()