codexpast-exam-of-the-physics-a-course-of-the-university-of-cambridge2010paper-1-pa2010-cornu-vectors.py
past-exam-of-the-physics-a-course-of-the-university-of-cambridge/2010/paper-1-pa2010-cornu-vectors.py
"""Original teaching plot. Python3.14, NumPy and Matplotlib. Writes basename PNG to cwd."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
positive=np.linspace(0,7,80001);phase=np.pi*positive**2/2;ds=positive[1]-positive[0]
C=np.r_[0,np.cumsum((np.cos(phase[:-1])+np.cos(phase[1:]))*ds/2)]
S=np.r_[0,np.cumsum((np.sin(phase[:-1])+np.sin(phase[1:]))*ds/2)]
def F(w):
return np.sign(w)*np.array([np.interp(abs(w),positive,C),np.interp(abs(w),positive,S)])
w=np.linspace(-5,5,12001);curve=np.array([F(v) for v in w]);wg=.5/np.sqrt(.01*16/2)
fig,ax=plt.subplots(figsize=(7.2,7),layout='constrained');ax.plot(curve[:,0],curve[:,1],color='#b0b0b0',lw=1)
vectors=[(np.array([-.5,-.5]),np.array([.5,.5]),'#555555','No fence'),(F(0),F(wg),'#296ea1','Existing grazing gap'),(F(-1.209378),F(1.209378),'#b34d29','Freely selected optimum'),(F(-1.215779),F(2.340538),'#28815d','Optimum retaining existing gap')]
for start,end,color,label in vectors:
ax.annotate('',xy=end,xytext=start,arrowprops={'arrowstyle':'->','color':color,'lw':2});ax.plot([],[],color=color,label=label)
ax.scatter([0],[0],color='black',s=14)
ax.set(xlabel='C(w)',ylabel='S(w)',title='Received fields as computed Fresnel chords',xlim=(-.88,.88),ylim=(-.88,.88),aspect='equal');ax.legend(fontsize=9,loc='upper left');ax.grid(alpha=.2)
fig.savefig(Path.cwd()/(Path(__file__).stem+'.png'),dpi=140,facecolor='white')