codex/past-exam-of-the-mathematical-and-computational-biology-course-of-the-university-of-cambridge/2024/paper-2-multistart-optimization.py

past-exam-of-the-mathematical-and-computational-biology-course-of-the-university-of-cambridge/2024/paper-2-multistart-optimization.py
"""Original objective plot, with independently computed optimization landmarks."""
from pathlib import Path
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import brentq
f=lambda x:1+np.exp(-np.asarray(x)**2/5)*np.sin(5*np.asarray(x))
df=lambda x:5*np.cos(5*x)-.4*x*np.sin(5*x)
global_x=brentq(df,-.5,-.1);local_min=brentq(df,-1.8,-1.3);local_max=brentq(df,-1.1,-.7);constrained=brentq(df,2,2.4)
x=np.linspace(-4,4,1800)
fig,ax=plt.subplots(figsize=(8,4.7),layout='constrained',facecolor='white')
ax.plot(x,f(x),color='#245c9f',lw=2)
ax.axvspan(1.5,4,color='#e3f3e8',zorder=0);ax.axvline(1.5,color='.5',ls=':',lw=1)
for xx,label,pos in [(global_x,'Global minimum',(-2.1,.07)),(local_min,'Local minimum',(-3.4,.55)),(local_max,'Local maximum',(-3.4,1.8)),(constrained,'Minimum for x ≥ 1.5',(2.05,.25))]:
 ax.scatter([xx],[f(xx)],s=27,color='black',zorder=4)
 ax.annotate(label,(xx,float(f(xx))),pos,arrowprops={'arrowstyle':'->','color':'.4'},fontsize=10)
ax.set(xlim=(-4,4),ylim=(-.04,2.1),xlabel='x',ylabel='f(x)',title=r'$f(x)=1+e^{-x^2/5}\sin(5x)$')
ax.spines[['top','right']].set_visible(False)
fig.savefig(Path('paper-2-multistart-optimization.png'),dpi=125,facecolor='white');plt.close(fig)