codex/past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2013/iii/paper-75-ising-dispersion.py

past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2013/iii/paper-75-ising-dispersion.py
"""Original Ising-chain dispersion sketches; PNG output goes to caller cwd.
Tested with Python3.14.4, NumPy2.3.5, Matplotlib3.10.7.
"""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
k=np.linspace(-np.pi,np.pi,1001)
fig,axes=plt.subplots(1,3,figsize=((1080+1e-6)/100,(360+1e-6)/100),dpi=100)
fig.patch.set_facecolor('white')
fig.suptitle('Ising quasiparticle spectrum: flat, field-gapped and critical',fontsize=13,y=.985)
for ax,g,title,top in zip(axes,[0,6,1],['Zero field: g = 0','Large field: g = 6 (representative)','Critical field: g = 1'],[3.2,15,5]):
    energy=2*np.sqrt(1+g*g-2*g*np.cos(k))
    ax.plot(k,energy,color='#1f77b4',linewidth=2)
    ax.set_title(title,fontsize=11)
    ax.set_ylim(0,top)
    ax.set_xlim(-np.pi,np.pi)
    ax.set_xticks([-np.pi,0,np.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
    ax.set_xlabel('Wavenumber k (unit lattice spacing)')
    ax.set_ylabel(r'$\epsilon_k/J$')
    ax.grid(alpha=.18)
axes[0].annotate('Flat branch at 2J',xy=(.8,2),xytext=(-2.7,2.65),arrowprops={'arrowstyle':'->','color':'#444'},fontsize=10)
axes[1].plot(k,12-2*np.cos(k),'--',color='#d95f02',linewidth=1,label='Leading large-g form')
axes[1].legend(loc='lower right',fontsize=9)
axes[2].annotate('Gap closes; slope 2J',xy=(.1,.2),xytext=(-2.8,2),arrowprops={'arrowstyle':'->','color':'#444'},fontsize=10)
fig.subplots_adjust(left=.055,right=.98,bottom=.18,top=.80,wspace=.32)
fig.savefig(Path.cwd()/'paper-75-ising-dispersion.png',dpi=100,facecolor='white',transparent=False)
plt.close(fig)