codexextreme-points-square-and-disk.py
extreme-points-square-and-disk.py
"""Original convex-set examples separating boundary from extremality."""
from pathlib import Path
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, Circle
import numpy as np
def main():
fig, axes = plt.subplots(1, 2, figsize=(10.2, 5.0), dpi=120, facecolor="white")
ax = axes[0]
ax.add_patch(Rectangle((-1,-1), 2, 2, facecolor="#e5eff4", edgecolor="#28738f", lw=2))
ax.plot([1,1], [-1,1], color="#a85200", lw=4, label="All maximize x")
corners=np.array([[-1,-1],[1,-1],[1,1],[-1,1]])
ax.scatter(*corners.T, color="#b2182b", s=55, zorder=5, label="Extreme points")
ax.scatter(1, 0, color="#a85200", marker="D", s=55, zorder=6)
ax.annotate(r"$(1,0)=\frac{1}{2}(1,-1)+\frac{1}{2}(1,1)$", (1,0), xytext=(-.95,.35),
fontsize=11, arrowprops=dict(arrowstyle="->",color="#a85200"))
ax.set_title("Square: only four corners are extreme", fontsize=13)
ax.text(-1.33,-1.27,"The right edge maximizes x",fontsize=11,color="#a85200")
ax = axes[1]
ax.add_patch(Circle((0,0), 1, facecolor="#e5eff4", edgecolor="#b2182b", lw=2.5))
theta=np.pi/3
p=np.array([np.cos(theta),np.sin(theta)])
tangent=np.array([-p[1],p[0]])
t=np.linspace(-1.3,1.3,101)
line=p+t[:,None]*tangent
ax.plot(*line.T, color="#a85200", lw=2)
ax.scatter(*p,color="#a85200",s=60,zorder=5)
ax.annotate(r"$p=(1/2,\sqrt{3}/2)$",p,xytext=(-1.25,1.33),fontsize=11,
arrowprops=dict(arrowstyle="->",color="#a85200"))
ax.text(-1.33,-1.27,r"$p\cdot z\leq1$; equality only at $z=p$",fontsize=11)
ax.set_title("Disk: every boundary point is extreme",fontsize=13)
for ax in axes:
ax.set_aspect("equal")
ax.set(xlim=(-1.55,1.55),ylim=(-1.5,1.55),xlabel=r"$x$",ylabel=r"$y$")
ax.set_xticks([-1,0,1]);ax.set_yticks([-1,0,1])
ax.grid(alpha=.18)
ax.spines[["top","right"]].set_visible(False)
fig.suptitle("Boundary points need not be extreme; extreme points need not look like corners",
fontsize=15,weight="bold",y=.97)
fig.text(.5,.025,"Orange marks an optimizing supporting line; red marks the extreme points.",ha="center",fontsize=11)
fig.subplots_adjust(left=.07,right=.98,top=.82,bottom=.24,wspace=.27)
fig.savefig(Path(__file__).stem+".png",facecolor="white",transparent=False)
plt.close(fig)
if __name__=="__main__":
main()