Here's a problem from Oxford's Numerical Analysis Group Problem Solving Squad in October 2011. A $2\times1$ ellipse is lined up touching a $3\times1$ ellipse tip-to-tip, and then the little ellipse rolls around the big one with boundaries touching and not slipping. How long is the trajectory of the center of the little ellipse from the starting point to when it completes a full 360-degree revolution?

For convenience, since the geometry is 2D, let's use complex variables $z_1(t)$ and $z_2(t)$ to track the contact points on the two ellipse boundaries as a function of time $t$, assuming motion at speed $1$. It is convenient to let $\theta_1(t)$ be the argument of $z_1(t)$ if it is scaled down to the unit circle: $$ z_1 = \frac12 L_1 \cos\theta_1 + \frac12 i \sin\theta_1 . $$

That is, $$ \theta_1 = \arctan \left( \frac{\mathrm{imag}(z_1)}{L_1 \mathrm{real}(z_1)} \right). $$

We have

$$ \frac{dz_1}{d\theta_1} = -\frac12 L_1 \sin(\theta_1) + \frac12 i \cos(\theta_1) \qquad\qquad (1) $$

and since $t$ is the same as arc length,

$$ \frac{dt}{d\theta_1} = \frac12 \sqrt{L_1^2 \sin^2(\theta_1) + \cos^2(\theta_1)}. \qquad\qquad (2) $$

Dividing (1) by (2) gives us an ODE for $\frac{dz_1}{dt}$. Similarly, on the small ellipse a particle starts at the left tip and moves clockwise at speed $1$: $z_2(t)$. The equations are the same with $1$ replaced by $2$ and with a minus sign introduced in (2) since $\theta_2$ is decreasing with $t$ rather than increasing.

Here is a Chebfun computation of the two ellipses from time $0$ to $t_{max}=7.5$. The functions $z_1(t)$ and $z_2(t)$ trace out the ellipses.

tic L1 = 3; theta1 = @(z1) atan2(imag(z1),real(z1)/L1); L2 = 2; theta2 = @(z2) atan2(imag(z2),real(z2)/L2); ode1 = @(t,z1) (-L1*sin(theta1(z1))+1i*cos(theta1(z1)))/... sqrt(L1^2*sin(theta1(z1))^2+cos(theta1(z1))^2); ode2 = @(t,z2) (L2*sin(theta2(z2))-1i*cos(theta2(z2)))/... sqrt(L2^2*sin(theta2(z2))^2+cos(theta2(z2))^2); opts = odeset('abstol',1e-13,'reltol',1e-13); tmax = 7.5; z1 = chebfun.ode113(ode1,[0,tmax], L1/2,opts); z2 = chebfun.ode113(ode2,[0,tmax],-L2/2,opts);

Now what about the trajectory traced by the midpoint, $w(t)$? A little geometric thought reveals the right formula. Here is a calculation and a plot:

w = z1 - z2*diff(z1)/diff(z2); plot(w,'k'), grid on, axis(3*[-1 1 -1 1]), axis square

To find the answer to the problem posed, we need to know the time at which $\mathrm{imag}(w(t))=0$:

format long, tfinal = roots(imag(w{5,7.5}))

tfinal = 6.781868737249928

The length of the trajectory is the $1$-norm of the derivative of $w$ from $t=0$ to $t=t_{final}$:

trajectory_length = norm(diff(w{0,tfinal}),1)

trajectory_length = 11.755625978672949

The total computer time for the computations up to this point is as follows:

toc

Elapsed time is 1.339572 seconds.

Now let's plot the motion, using an anonymous function `ell2`

which returns a chebfun of the position of ellipse 2 at time $t$. We plot the big ellipse together with a succession of small ellipses:

ell2 = @(t) w(t) + z2*(z1(t)-w(t))/z2(t); fill(real(z1),imag(z1),'b'), hold on, axis(3*[-1 1 -1 1]), axis square for t = 0:1:6 plot(ell2(t),'r'), plot(w(t),'.k','markersize',12) end plot(w,'k')

(The imperfection in the blue fill is a bug in MATLAB, not Chebfun.) Or we can make a movie, like this:

hold off, fill(real(z1),imag(z1),'b'), hold on axis(3*[-1 1 -1 1]), axis square, plot(w,'k') for t = 0:.05:tmax h1 = plot(ell2(t),'r'); h2 = plot(w(t),'.k','markersize',18); pause(.01) if t<tmax, delete(h1(1)), delete(h2), end end

Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters Couldn't create JOGL canvas--using painters