codex/past-exam-of-the-physics-b-course-of-the-university-of-cambridge/2016/paper-1-imperfect-beam.py

past-exam-of-the-physics-b-course-of-the-university-of-cambridge/2016/paper-1-imperfect-beam.py
"""Original teaching diagram. Tested with Python 3.14, numpy, matplotlib.
Run in the desired output directory; PNG is written as a basename in cwd.
"""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

f=np.linspace(0,.94,600)
fig,ax=plt.subplots(figsize=(7,4.5),layout="constrained")
ax.plot(f,1/(1-f),lw=2,color="#326a97",label="total maximum displacement / Y")
ax.plot(f,f/(1-f),lw=2,color="#b77327",label="additional maximum displacement / Y")
ax.axvline(1,ls="--",color="#aa3939");ax.text(.75,13,"linear-model pole\nat Euler load",fontsize=10)
ax.set(xlim=(0,1.06),ylim=(0,16),xlabel="Compressive load F / Fc",ylabel="Midspan displacement / Y",title="Sinusoidal imperfection amplifies continuously below buckling")
ax.grid(alpha=.2);ax.legend(loc="upper left",fontsize=9)
fig.savefig("paper-1-imperfect-beam.png",dpi=155,facecolor="white")