Is the JWST halo orbit period sync'd with earth's elliptical orbit about sun?
Wow, It's surprisingly close!
At first I figured it would be closer to 6.5 or 7 months due to past information and questions and answers based on an earlier JWST trajectory, but wow, trying to define the period of a complicated 3 or 4 body orbit (including the Moon's effect) in a simple way, I've come up with 180 days!
I took the new predicted orbit for JWST in Horizons
Revised: Jan 28, 2022
2Y_SCHEDULE_2022027000000_01U.OEM.V0.1 2022-Jan-27 00:01 2024-Jan-27 00:01
downloaded the heliocentric positions of JWST and Earth, subtracted Earth/Moon barycenter from JWST then rotated by Earth's angle to be in a pseudo-synodic frame (it rotates with EM/Bary angle, not steadily), and got the following (data starts
The offset in X is the average distance from Earth, close to the 1.5 million km of the classical L2 distance.
If I pick off the maxima and calculate a period for X, Y and Z motion I get 179.3, 180.0, and 180.7 days!
As this is an ad hoc method, I'll say that these periods are *currently indistinguishable from a half year so my answer is a qualified but quite surprised "yes!"
import numpy as np
import matplotlib.pyplot as plt
fnames = ('Earth orbit heliocentric horizons_results.txt',
'JWST orbit heliocentric horizons_results.txt')
JDs, datas = , 
for fname in fnames:
n_offset = 10
with open(fname, 'r') as infile:
lines = infile.readlines()
a = [i for (i, line) in enumerate(lines) if 'SOE' in line]
b = [i for (i, line) in enumerate(lines) if 'EOE' in line]
lines = lines[a+1+n_offset: b]
info = [line.split(',') for line in lines]
JD = np.array([float(line) for line in info])
data = np.array([ [float(thing) for thing in line[2:8]] for line in info])
JD = JDs
Earth, JWST = [thing.T.copy() for thing in datas]
dJWST = JWST - Earth
z = dJWST
th = np.arctan2(Earth, Earth)
s, c = [f(-th) for f in (np.sin, np.cos)]
x = dJWST * c - dJWST * s
y = dJWST * c + dJWST * s
fig, axes = plt.subplots(3, 1)
for thing, name, ax in zip([x, y, z], 'XYZ', axes):
ax.plot((JD - JD) / 365.2564, thing)
ax.set_ylabel(name + ' (km)')
maxima = [np.where((p[2:] < p[1:-1]) * (p[1:-1] >= p[:-2])) for p in (x, y, z)]
maxima = [thing for thing in maxima]
periods = [(m[-1] - m) / (len(m) - 1) for m in maxima]