Skip to content
Vamshi Jandhyala

Books · The Fiddler: Solutions

Chapter 100

Can You Eclipse via Ellipse?

Two congruent ellipses together cover a unit circle (radius 11). The ellipses may have any eccentricity, as long as they are congruent to each other. What is the smallest possible area of one such ellipse?

The Fiddler, Zach Wissner-Gross, April 12, 2024(original post)

Solution

Split the disc along a diameter. By symmetry the two congruent ellipses should share the work evenly, one to each half-disc, and a half-disc is convex, so an ellipse covers it the moment it contains the bounding diameter and the semicircular arc. Centre a candidate on the axis of symmetry, x2a2+(yk)2b2=1,\frac{x^2}{a^2}+\frac{(y-k)^2}{b^2}=1, and minimise its area πab\pi a b subject to covering the upper half-disc. The minimum sits at a=23,b=23,k=13,a=\frac{2}{\sqrt3},\qquad b=\frac23,\qquad k=\frac13, a wide, shallow ellipse that hugs the flat diameter while just cresting the arc. Its area is πab=π2323\pi a b=\pi\cdot\frac{2}{\sqrt3}\cdot\frac23:  4π39 2.418.\boxed{\ \frac{4\pi\sqrt3}{9}\ }\approx2.418.

The computation

Encode the covering condition directly: sample the half-disc densely (arc, diameter, centre) and minimise πab\pi a b over the ellipse parameters under the constraint that every sampled point lies inside. The optimum matches 4π39\tfrac{4\pi\sqrt3}{9}.

import numpy as np, math
from scipy.optimize import minimize
th = np.linspace(0, math.pi, 400)
pts = np.vstack([np.c_[np.cos(th), np.sin(th)], [[1, 0], [-1, 0], [0, 0]]])
def contains(p):                                   # half-disc inside ellipse?
    a, b, k = p
    return 1 - ((pts[:, 0] / a) ** 2 + ((pts[:, 1] - k) / b) ** 2).max()
r = minimize(lambda p: math.pi * p[0] * p[1], [1.2, 0.7, 0.3],
             constraints=[{'type': 'ineq', 'fun': contains}],
             bounds=[(.5, 3), (.3, 3), (-1, 1)], method='SLSQP')
print(r.fun, 4 * math.pi * math.sqrt(3) / 9)       # 2.4184  2.4184

Extra Credit

What is the smallest area when three congruent ellipses cover the unit circle?

Solution

Now divide the disc into three 120120^\circ sectors, one per ellipse, each sector again convex. Place the ellipse symmetrically on its sector’s bisector. The smallest one passes through the sector’s three corners, the apex at the centre and the two ends of the arc at (12,±32)(\tfrac12,\pm\tfrac{\sqrt3}{2}): its centre lands at (12,0)(\tfrac12,0) with semi-axes a=12 (across the bisector),b=32 (along it).a=\tfrac12\ \text{(across the bisector)},\qquad b=\tfrac{\sqrt3}{2}\ \text{(along it)} . A short check confirms this ellipse also clears the curved edge and the two straight edges, so it covers the whole sector, with area π1232\pi\cdot\tfrac12\cdot\tfrac{\sqrt3}{2}:  3π4 1.360.\boxed{\ \frac{\sqrt3\,\pi}{4}\ }\approx1.360 . Three of them, rotated by 120120^\circ, cover the disc, and as expected sharing the work among more ellipses lets each be smaller.

The computation

The same optimisation over a 120120^\circ sector, with its bisector along the +x+x axis, recovers the semi-axes and the area.

import numpy as np, math
from scipy.optimize import minimize
th = np.linspace(-math.pi / 3, math.pi / 3, 200)
arc = np.c_[np.cos(th), np.sin(th)]
t = np.linspace(0, 1, 80)[:, None]
edges = np.vstack([t * [math.cos(math.pi/3),  math.sin(math.pi/3)],
                   t * [math.cos(math.pi/3), -math.sin(math.pi/3)]])
rr, aa = np.meshgrid(np.linspace(0, 1, 40), np.linspace(-math.pi/3, math.pi/3, 40))
interior = np.c_[(rr * np.cos(aa)).ravel(), (rr * np.sin(aa)).ravel()]
pts = np.vstack([arc, edges, interior])
def contains(p):                                   # sector inside ellipse on the x-axis?
    a, b, k = p
    return 1 - (((pts[:, 0] - k) / a) ** 2 + (pts[:, 1] / b) ** 2).max()
r = minimize(lambda p: math.pi * p[0] * p[1], [0.5, 0.9, 0.5],
             constraints=[{'type': 'ineq', 'fun': contains}],
             bounds=[(.1, 2), (.1, 2), (-1, 1)], method='SLSQP')
print(round(r.fun, 4), round(math.sqrt(3) * math.pi / 4, 4))   # 1.360  1.360