Last weekend’s New York City Marathon was canceled. But runners from Des Linden — one of the top American marathoners — to FiveThirtyEight’s own Santul Nerkar — my number one editor — still went out there and braved the course. Santul finished in a time of 3:41:43 (3 hours, 41 minutes, 43 seconds), which averaged to 8 minutes, 27 seconds per mile.
Suppose, while training, Santul completed two 20-mile runs on a treadmill. For the first run, he set the treadmill to a constant speed so that he ran every mile in 9 minutes.
The second run was a little different. He started at a 10 minute-per-mile pace and accelerated continuously until he was running at an 8-minute-per mile pace at the end. Moreover, Santul’s minutes-per-mile pace (i.e., not his speed) changed linearly over time. So a quarter of the way through the duration (in time, not distance) of the run, his pace was 9 minutes, 30 seconds per mile, halfway through it was 9 minutes per mile, etc.
Which training run was faster (i.e., took less time) overall? And what were Santul’s times for the two runs?
Change in position is the integral of speed over time:
$$\Delta X = \int_{}^{} S dt$$Santul's total time for 20 miles at a rate $R(t) = 9$:
$$20 =\int_{0}^{T} \frac{1}{9} dt$$
$$= \frac{T}{9}$$
$$T = 20 \textrm{ miles} * \frac{9 \textrm{ minutes}}{\textrm{mile}} = 180 \textrm{ minutes}$$
Using $(0, 10)$ and $(T, 8)$:
$$R(t) = - \frac{2}{T} t + 10 = \frac{10T- 2t}{T}$$
Santul's total time for 20 miles at this varying rate $R(t)$:
$$20 = \int_{0}^{T} \frac{dt}{R(t)}$$
$$ = \int_{0}^{T} \frac{Tdt}{10T- 2t}$$
$$ = \frac{-T}{2} \int_{0}^{T} \frac{-1 \cdot dt}{5T - t}$$
$$ = \frac{-T}{2} \ln{(5T - t)}\big]_{0}^{T}$$
$$ = \frac{-T}{2} \big(\ln{(4T)} - \ln{(5T)}\big)$$
$$ = \frac{T \cdot ln{\frac{5}{4}}}{2}$$
$$T = \frac{20 \cdot 2}{ln{\frac{5}{4}}} \approx 179.256 \textrm{ minutes}$$
Knowing $T$, we can now solve for $t$:
$$d = \frac{-T}{2} \cdot \ln{\bigg(\frac{5T-t}{5T}\bigg)}$$
$$d = \frac{T}{2} \cdot \ln{\bigg(\frac{5T-t}{5T}\bigg)}$$
$$\frac{2d}{T} = \ln{\bigg(\frac{5T-t}{5T}\bigg)}$$
$$e^{\frac{2d}{T}} = \frac{5T}{5T-t}$$
$$5T - t = 5T \cdot e^{\frac{-2d}{T}}$$
$$- t = 5T \cdot e^{\frac{-2d}{T}} - 5T$$
$$t = 5T (1 - e^{\frac{-2d}{T}})$$
To visualize how very similar his trainings were, graphs are shown below.
Note that for both trainings, Santul had run ~$19.23$ miles in ~$173.073$ minutes.
import math
import matplotlib.pyplot as plt
#Set constants.
e = math.exp(1)
T = 40 / math.log(1.25, e)
#Define domain and ranges.
x = [d / 100 for d in range(2001)]
y1 = [9 * d for d in x]
y2 = [5 * T * (1 - math.exp(-2 * d / T)) for d in x]
#Graph helper
def training_graph(axis, title, xticks, yticks, xlim, ylim) :
#Lines.
axis.plot(x, y1, lw = 3, color = 'b', label = "First Run", zorder = 1)
axis.plot(x, y2, lw = 3, color = 'g', label = "Second Run", zorder = 2)
#Subtitle.
axis.set_title(title, fontsize = 24)
#Axes.
axis.set_xlabel("d (miles)", fontsize = 18)
axis.set_ylabel("t (minutes)", fontsize = 18)
plt.setp(axis, xticks = xticks, yticks = yticks)
axis.set(xlim = xlim, ylim = ylim)
#Full graph.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (16, 8))
training_graph(ax1,
"Santul's Full Trainings, Compared",
[0, 5, 10, 15, 20],
[0, 45, 90, 135, 180],
(0, 20),
(0, 180))
training_graph(ax2,
"Last Miles and Minutes",
[18, 19, 20],
[162, 168, 174, 180],
(18, 20),
(162, 180))
#Intersection.
ax2.scatter(19.23, 173.073, c = 'purple', lw = 6, zorder = 3)
ax2.annotate('(19.23, 173.073)',
xy = (19.23, 173.5),
xytext = (18.5, 175),
fontsize = 12,
arrowprops = dict(facecolor = 'purple',
connectionstyle = "angle3, angleA = 0, angleB = 90"))
ax2.legend(title = "Training", fontsize = 12).get_title().set_fontsize(18);
The second run was faster by a mere $0.744$ minutes, $\approx 44.6$ seconds