Tom Norton

Using Math to Predict My First Half Marathon

By Tom Norton

June 7th, 2026 · 8 min read

It's time for another edition of nerding out on sports data!

On a whim, I signed up for the Lausanne Half Marathon this October. The longest I have ever run in one go is 13 km. So I have an obvious question to answer before training starts: what is a realistic target?

I am a cyclist by default. I know how to look at a course, look at my power numbers, and work out what I should do on race day. For running I have nothing equivalent. Pace charts and "just train at your goal pace" advice felt like guesswork. I wanted the same thing I have on the bike, a model that takes my actual numbers and the actual course and gives me a defensible target.

I could not find a free tool that did all of it in one place. So I built one. This post is me running my own data through it for Lausanne, including the bits where the model says I am being optimistic.

The tool#

I built it here. It takes one or more recent race times and fits three models side by side:

On top of that it computes Jack Daniels' VDOT from your strongest race, the five Daniels training paces (Easy, Marathon, Threshold, Interval, Repetition), and two course adjustments: elevation gain via Minetti's 1.31 mL O₂ per kg per metre climbed, and race-day temperature via the El Helou et al. (2012) marathon heat curve.

Everything runs in the browser. No signup, no data leaves your machine.

My numbers#

My recent times, both run as standalone efforts on flat-ish loops:

I am writing them down because the rest of this post is meaningless without context, and posting a half marathon prediction without showing the inputs feels like cheating.

The first thing the tool does with these is compute VDOT from each one. The Daniels-Gilbert formula:

VO2cost(v) = -4.60 + 0.182258·v + 0.000104·v² %VO2max(t) = 0.8 + 0.1894393·e^(-0.012778·t) + 0.2989558·e^(-0.1932605·t) VDOT = VO2cost(v) / %VO2max(t)

v is velocity in m/min, t is race duration in minutes. The first line is the oxygen cost of running at a given speed. The second is how much of your VO2max you can hold for a given duration (longer events let you sit at a lower percentage). VDOT is the ratio, a pseudo-VO2max that bakes in both your engine size and how efficiently you run.

For my 5 km at 22:38 that comes out to VDOT 43.1. For the 10 km at 48:17 the model lands at 41.7. The tool picks the higher of the two as the anchor, which means my 5 km is the reference race for the predictions that follow.

There is something interesting in that gap. If you take Riegel forward from my 5 km, the predicted 10 km is 1358 × 2^1.06 ≈ 47:12. My actual 10 km is 65 seconds slower. About 2.3%. So I am already falling off the textbook curve between 5K and 10K, and the half marathon is twice as far again.

What the formulas predict#

Three predictors, three answers for a 21.1 km target:

ModelPredicted half
Riegel from 5K (E=1.06)1:44:07
Cameron from 5K1:43:57
Personal fit (E=1.093)1:49:10

Riegel and Cameron agree within ten seconds. That is what you would expect from two formulae fit to different data sets, applied near the source distance. The personal fit is the interesting one. With both my 5 km and 10 km on the chart, ordinary least squares in log-log space recovers a fatigue exponent of 1.093, well above Riegel's 1.06.

The interpretation: I slow down faster than the textbook runner as distance grows. That is consistent with being a cyclist who has done a lot of high-intensity work over short distances and very little aerobic base. The 5K-to-10K drop-off is already steeper than someone with a deeper endurance background, so the model extrapolates a steeper drop-off out to 21 km. The 65-second gap at 10 km becomes a 5-minute gap at the half.

This is the insight Riegel-only calculators miss. The 1.06 default would tell me 1:44. The personal fit tells me 1:49 and explains why.

Adjusting for Lausanne#

The Lausanne course is not a flat oval. It runs along the lake, eastward from Place de Milan through Pully, Paudex, and Lutry to a turnaround near Cully at about 10.5 km, then back to finish at Place Bellerive in Ouchy. Total elevation gain is around 56 m and loss is around 93 m, so the net is a 37 m descent.

Late October on Lake Geneva typically lands around 10 to 14 °C at the morning start. I am going to assume 12 °C.

Both adjustments are layered on top of the base prediction.

Elevation. Minetti et al. (2002) measured the metabolic cost of running uphill at 1.31 mL of oxygen per kilogram per metre climbed, on top of the horizontal-running cost. For a net descent of 37 m at my race-pace VO2 cost (about 34.5 mL/kg/min for me at projected half-marathon pace):

extra seconds = 60 · (1.31 · Δh) / C = 60 · (1.31 · -37) / 34.5 ≈ -84 seconds (raw)

The tool then halves the descent benefit, because braking forces and gait limits mean descending is not the mirror image of climbing. So the final elevation credit is around -42 seconds. Useful but not huge.

Heat. El Helou et al. (2012) fit a U-shaped pace-versus-temperature curve to 1.8 million finish times from six major marathons. The optimum sits near 10 °C. For 12 °C, the slowdown is 0.00034 · (12 - 10)² = 0.14%. Effectively nothing. Lausanne in October is just about the easiest possible weather day for me.

Combine them on top of the 1:49:10 personal-fit prediction:

1:49:10 - 0:42 + 0.14% = 1:48:35

So the headline number my own tool gives me, on real numbers, for the real course, in expected weather, is 1:48:35. Roughly 5:09 per kilometre. About a 20-second drop from my 10K pace of 4:50 carried twice as far.

The big caveat#

There is a problem the math does not see: I have never run further than 13 km.

The three formulae assume your training supports the target distance. The model has no way to know whether you have done the long-run work to hold race pace through km 18, 19, 20. Hitting the wall is not in the equations. Bonking is not in the equations. The polite term researchers use is "endurance reserve". The 1:49 personal fit prediction is what someone with my 5K and 10K times should be able to do if they have built the aerobic base to back it up.

Right now I have not. So 1:48:35 is the right answer to a different question. It is the right answer to: if I do the training, what is realistic? It is not the answer to: what will I run on race day if I keep training the way I have been? For that one, I expect a 5 to 15 minute drift slower as my legs run out of glycogen and form. Anyone telling you they predicted their first half marathon to the minute without a long-run block first was lucky, not right.

This is the same trap that catches first-time marathoners who try to extrapolate from a 10 km PB. The model is honest, you just have to read the small print on it.

What the tool also gives me#

The other useful output is the training paces. Daniels' system gives five intensities, each as a percentage of VDOT:

Zone% VDOTMy pace (/km)
Easy / Long65–79%5:14–6:07
Marathon80%5:11
Threshold (T)88%4:48
Interval (I)98%4:24
Repetition (R)105%4:09

These are the anchors for the next 16 weeks. Most of the mileage at easy pace, a weekly threshold session at 4:48/km, one VO2max session at 4:24/km, and progressively longer easy long runs. The goal between now and October is to push the long run out from 13 km to 18-19 km, which is the standard "long run goes to 90% of race distance" rule for first-time half marathoners.

If I do that work, the VDOT 43 prediction holds. If I do not, the model says one thing and my legs say another, and the legs win.

Bottom line#

The math says 1:48:35 for Lausanne, give or take, conditional on actually doing the training.

What I find useful is not the headline number. It is the personal-fit exponent of 1.093 telling me my drop-off curve is steeper than the textbook. That is a training prescription disguised as a prediction. The path from 1.093 down to 1.06 is more easy-paced mileage and longer long runs. Get the exponent down and the half marathon time drops with it, even if the 5 km PB stays the same.

I will run this again in late September on whatever fresher times I have, and see where the personal exponent has moved. If it is still at 1.09 I have not done the work. If it is closer to 1.06 then the model is telling me I am ready.

If you want to do the same, the tool is here. One race result is enough to start. Two gets you the personal fit. Drop in your course's elevation gain and expected race-day temperature and you have a defensible target you can train towards. And if your personal exponent comes out wildly different from mine, I would be curious to hear about it.

Tom Norton

Hi, I'm Tom Norton. I'm an engineering leader based in Switzerland, passionate about great products. When I'm not doing that, I'm making music.

Feel free to say hi via the contact page.