home

posts

notes

rss

Target power to predicted race time

For both training and racing, I use a Stryd pod: a running power meter that allows me to base my running on my power output, instead of looking at my pace or heart rate (which are both influenced by elevation). The Stryd running pod calculates my Critical Power (CP), which is similar to Functional Threshold Power (FTP). My CP is currently 3.490 W/kgData from intervals.icu (and was 3.75 W/kg at the time of writing) — something that I want to keep improving as I’m planning to run my second marathon mid-September.

Predicting finish time with Stryd

The Stryd app has two handy features: one predicts race calculations for a set of fixed distances (1 mile, 5k, 10k, HM, and full marathon) and the other returns a target power + predicted race time based on CP for a given GPX. I was wondering how they calculate these predicted race times, and stumbled upon a blog post by Stryd themselves.

Their simplified formula — specifically meant for a flat course with no air resistance — is rather straightforward: $T = \frac{1.04 * d}{TP / m}$, where $T$ is the predicted race time in seconds, $TP$ is the target power for the race in watts, $m$ is the runner’s body weight in kilograms, and $d$ is the distance in meters:

from datetime import timedelta
 
def predicted_time(d, TP, m):
seconds = 1.04 * d / (TP / m)
return str(timedelta(seconds=seconds))

“In Flanders Fields” marathon prediction

For my next marathon, I am trying to go for a time under 4 hours. As my target power is ~250 W, I would finish my next marathon in 3 hours and 51 minutes, in the best case scenarioFlat course, but weather can have a big impact .

d = 42195 # marathon distance in m
TP = 250 # target power in W
m = 79 # weight in kg
 
>>> predicted_time(d, TP, m)
'3:51:06.964800'

This is pretty similar to the Stryd app’s estimated time based on the provided GPX of the marathon course, which predicts I will run the marathon in around 3 hours and 50 minutes — if I can maintain an average power output of ~252 W. Using the simplified formula directly, however, gives me a bit more flexibility to see what my predicted time would be if I increase my target power or lose weight, but retain my CP:

weight = range(80, 74, -1)
time = [predicted_time(d, TP, w) for w in weight]
 
>>> for w, t in zip(weight, time):
... print(f"{w} kg — {t}")
 
'80 kg — 3:54:02.496000'
'79 kg — 3:51:06.964800'
'78 kg — 3:48:11.433600'
'77 kg — 3:45:15.902400'
'76 kg — 3:42:20.371200'
'75 kg — 3:39:24.840000'

Stryd also just released a blog post about Clayton Young and his preparation for the Olympic Marathon in Paris, in which he finished 9th: Stryd predicted his finish time at 2:09:54, and he ultimately ran 2:08:44.