codexpast-exam-of-the-mathematics-course-of-the-university-of-cambridge2002iapaper-2-direction-field.py
past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2002/ia/paper-2-direction-field.py
"""Original figure; Python 3.14, NumPy 2.3.5, Matplotlib 3.10.7. Output to caller CWD."""
import os
import tempfile
if 'MPLCONFIGDIR' not in os.environ:
os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp(prefix='ia2-direction-mpl-')
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5.6, 5), layout='constrained')
x, y = np.meshgrid(np.linspace(0, .97, 17), np.linspace(0, 1, 18))
m = x*np.sqrt((1-y*y)/(1-x*x))
dx = .023/np.sqrt(1+m*m)
dy = m*dx
for a,b,c,d in zip(x.flat,y.flat,dx.flat,dy.flat):
ax.plot([a-c,a+c],[b-d,b+d],color='#87919e',lw=.9)
t = np.linspace(0, 1, 1500, endpoint=False)
ax.plot(t,np.sin(1-np.sqrt(1-t*t)),color='#1664ba',lw=2.4,label='Solution from (0, 0)')
ax.plot(0,0,'o',color='#1664ba',ms=5)
ax.plot(1,np.sin(1),'o',mfc='white',mec='#1664ba',ms=6,clip_on=False)
ax.plot([.93,1],[np.sin(1)]*2,alpha=0)
ax.annotate('Vertical limiting tangent',xy=(.997,np.sin(1)),xytext=(.36,.90),arrowprops={'arrowstyle':'->'},fontsize=9)
ax.annotate('Horizontal tangent',xy=(0,0),xytext=(.17,.10),arrowprops={'arrowstyle':'->'},fontsize=9)
ax.set(xlim=(-.035,1.035),ylim=(-.035,1.045),xlabel='x',ylabel='y',title='Positive square-root direction field')
ax.set_aspect('equal'); ax.legend(loc='center left',fontsize=9)
fig.savefig('paper-2-direction-field.png',dpi=125,facecolor='white',transparent=False)