codexpast-exam-of-the-physics-b-course-of-the-university-of-cambridge2015paper-1-binary-orbits.py
past-exam-of-the-physics-b-course-of-the-university-of-cambridge/2015/paper-1-binary-orbits.py
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.rcParams.update({'font.size':10,'axes.spines.top':False,'axes.spines.right':False})
w=np.linspace(0,2*np.pi,900);a=2/3;e=.5
r=np.array([a*(e+np.cos(w)),a*np.sqrt(1-e*e)*np.sin(w)])
t=(w+e*np.sin(w))/np.sqrt(2/a**3);R=np.array([np.zeros_like(t),t/2])
fig,ax=plt.subplots(1,2,figsize=(9,4.5))
for j,lab in enumerate(['Center-of-mass frame','Laboratory frame: center of mass drifts']):
c=np.zeros_like(R) if j==0 else R
for sign,name,color in [(-1,'A','tab:blue'),(1,'B','tab:orange')]:
xy=c+sign*r/2
ax[j].plot(*xy,label=name,color=color,lw=2)
ax[j].scatter(*xy[:,0],color=color,s=40,marker='o')
i=np.argmin(abs(w-np.pi));ax[j].scatter(*xy[:,i],color=color,s=48,marker='s')
ax[j].plot(*c,color='gray',ls=':',lw=1.5)
ax[j].set(xlabel=r'$x/a_1$',ylabel=r'$y/a_1$',title=lab,aspect='equal');ax[j].grid(alpha=.2);ax[j].legend()
ax[0].scatter(0,0,color='black',s=18);ax[0].text(.03,-.08,'CM',fontsize=9)
fig.suptitle('Dots: initial positions; squares: first closest approach',y=1.02)
fig.tight_layout()
fig.savefig(Path(__file__).stem+'.png',dpi=140,facecolor='white',bbox_inches='tight')
plt.close(fig)