Should You Train at a Constant Rate...or Accelerate?

Riddler Express

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?

Solution

First Run: Constant 9 min/mile

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}$$

Second Run: Continously accelerating from 10 min/mile to 8 min/mile

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)$:

$$\Delta X = \int_{}^{} S dt$$


$$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}$$

Plot

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.

In [1]:
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);    

Answer

The second run was faster by a mere $0.744$ minutes, $\approx 44.6$ seconds

Rohan Lewis

2020.11.09