Steady State, Swim, 1k erg and some Math

This is going to be a very brief summary of the past three days of training, plus some math related to a big upgrade planned for


Steady state at the rowing club. As the others were doing some 10 minute intervals, with increasing intensity during the 10 minute, my steady state was reflecting that, at a milder intensity and a less steep power increase.

One hour in total.


A long day at work and meetings late into the evening. So I went swimming in the morning. I wore the Tickr X heart rate belt, which has an internal memory. Unfortunately, it doesn’t record heart rate well in the pool. The summary said total time 78 minutes (correct), maximum heart rate 161 bpm (could be right), average heart rate 109 bpm (definitely wrong). I think the average is somewhere around 140-145 bpm.


Another long day at work, then a quick dinner, followed by a 1k full out. Twenty five minutes of warming up. Ten minutes of cooling down. My volume is decreasing as a taper for Saturday’s race.

Funny heart rate values. I don’t believe them much.

Workout Summary - media/20180109-1905300o.csv
Workout Details

Well, that was better than expected. I aimed for 330-335W. Not bad for a regular weekday evening, after a long workday.

Finally, Some Math

In case you want to find the highest average power interval of a certain duration in a workout, or perhaps all “fastest” intervals for all interval lengths, you can use the following.

Your workout data is a series of metrics measured at equidistant times \bf{t} = [ t_1 \, t_2 \dots t_{n-1} \, t_n] . Similar to the time vector \bf{t} there is a power vector \bf{P}. Calculate the vector \bf{G} given by:

G_j = \sum_{i=1}^{j-1} P_i

We then calculate a matrix \bf{D}:

D_{nm} = G_n - G_m

The average power for an interval starting at t_n and ending at t_m is then given by:

\bar{P}_{nm} = \frac{D_{nm}}{t_m - t_n}.

If \bar{P}_i represents the ith diagonal of \bf{\bar{P}}, counting from 0, the 0th diagonal being “the” diagonal

\bar{P}_0 = [\bar{P}_{00} \, \bar{P}_{11} \dots \bar{P}_{n,n} \, \bar{P}_{n+1,n+1}],


\bar{P}_1 = [\bar{P}_{10} \, \bar{P}_{21} \dots \bar{P}_{n,n-1} \, \bar{P}_{n+1,n}]

then this vector represents all values of the average power for a time segment of duration i \Delta t. Then you simply take maximum value of this vector.

When written like this, the calculation is just a few lines of code, with the help of the numpy library.

So now you know what we do to your rowing data.

The short URL of the present article is: