codexpast-exam-of-the-physics-a-course-of-the-university-of-cambridge2014paper-2-fence-diffraction.py
past-exam-of-the-physics-a-course-of-the-university-of-cambridge/2014/paper-2-fence-diffraction.py
"""Original scalar knife-edge calculation, including spherical spreading."""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
z,w=np.polynomial.legendre.leggauss(240)
def transmission(d):
d=np.asarray(d);u=.5*np.sqrt(20*(.2+1/d))
q=(z+1)*u[...,None]/2
integ=(np.exp(1j*np.pi*q*q/2)*w).sum(axis=-1)*u/2
return np.abs((.5+.5j)-integ)**2/2
d=np.geomspace(.12,45,900);tr=transmission(d);init=float(transmission(45));absolute=tr/(5+d)**2/(init/50**2)
fig=plt.figure(figsize=(10,6),layout="constrained")
gs=fig.add_gridspec(2,2,height_ratios=[.8,1])
ax=fig.add_subplot(gs[0,:]);ax.set(xlim=(-1,51),ylim=(4.3,6.2));ax.axis("off")
ax.plot([0,50],[5,5],"--",color=".5")
ax.plot([0,5,50],[5,5.5,5],color="#b2602c")
ax.add_patch(Rectangle((4.8,4.3),.4,1.2,facecolor="#8e9ca8"))
ax.plot([0,50],[5,5],"o",color="#245d84")
ax.plot(5,5.5,"o",color="#b2602c",ms=4)
for x,lab in [(0,"S"),(5,"O"),(50,"P")]:ax.text(x,4.85,lab,ha="center")
ax.text(2.5,5.1,"a = 5 m",ha="center",fontsize=9)
ax.text(27.5,5.1,"b = 45 m initially",ha="center",fontsize=9)
ax.text(6.2,5.62,"Q at x = h = 0.5 m above direct ray",fontsize=9)
ax.set_title("Long opaque fence: one transverse knife edge; ground reflection omitted")
ax=fig.add_subplot(gs[1,0]);ax.plot(d,tr,color="#245d84",lw=2)
ax.plot(45,init,"o",color="#b2602c")
ax.set(xlabel="Receiver distance d from fence (m)",ylabel=r"$I_{\rm fence}/I_{\rm free}(d)$",title="Transmission ratio falls toward fence")
bx=fig.add_subplot(gs[1,1]);bx.plot(d,absolute,color="#245d84",lw=2)
j=np.argmax(absolute);bx.plot(d[j],absolute[j],"o",color="#b2602c")
bx.annotate(f"Peak near {d[j]:.2f} m",xy=(d[j],absolute[j]),xytext=(13,14),arrowprops=dict(arrowstyle="->"),fontsize=9)
bx.set(xlabel="Receiver distance d from fence (m)",ylabel="Absolute intensity / initial intensity",title="Absolute signal includes inverse-square gain")
for a in [ax,bx]:
a.axvspan(0,.5,color=".8",alpha=.6)
a.grid(alpha=.2)
fig.suptitle("Paraxial prediction; shaded d < 0.5 m is outside its reliable geometry")
fig.savefig("paper-2-fence-diffraction.png",dpi=150,facecolor="white")