Minimalistic fitness training

“Simplicity, simplicity, simplicity! I say your things are one, two, three, and up to a hundred or a thousand. We are happy in proportion to what we can do without.” (Henry David Thoreau)

“Simplicity is the ultimate in sophistication.” (Leonardo da Vinci)

“Simplify” (Martin Nilsson)

Why minimalistic?

By minimalistic training I mean a simple and concise program based on simple movements, low risk for injuries, and minimal investment in time and equipment. I think such minimalism is critical for the motivation to start and keep up the training.

A minimalistic scheme for fitness training at home is especially useful when one’s ordinary gym, sports club, or running track is unavaliable, for example due to vacation, quarantine, or bad weather. I developed and tested the scheme described below for approximately two years–mainly during the Corona pandemic–and in my case, the training worked out very well.<

This scheme assumes that you are healthy and fit enough that you can exert yourself to very high heart rates without health hazard. For comprehensive recommendations on health-related issues when exercising, please see sect. 1–4 of the European Society of Cardiology’s guidelines on sports cardiology and exercise.

The logic

The basis of my training scheme is the well-established Cooper fitness test, where you first measure how far you can run within 12 minutes, and then determine your fitness level from a table indexed by age and gender.

The principle of specificity says that you become good at what you practice. A logical conclusion of this is that you can improve your fitness by training to run as far as possible within 12 minutes.

Fig. 1: A simple foldable exercise bike can be very effective for minimalistic high-intensity fitness training. Standing up while cycling can raise heart rate to running levels. The red arrow indicates a prop up tilting the bike so the knees don’t hit the handlebar.

Stand-up cycling on an exercise bike

Foldable exercise bike and prop-up in folded stateFig. 2: Foldable exercise bike and prop-up in folded state.

Running is a very efficient way to improve your fitness, because intensive running can raise the heart rate to near maximum. However, running at home is hard unless you have a treadmill, which is expensive and bulky, and doesn’t usually allow high ruuning speeds anyway. An inexpensive and stowable alternative is a foldable exercise bike (figs. 1, 2).

Unfortunately, working out sitting on an exercise bike will not be as strenuous as a Cooper test in terms of heart rate. On the exercise bike, you will typically be limited by your leg muscles, not by your overall fitness. Unless you are an elite cyclist, this limit appears at a much lower heart rate than when you are running.

A trick to raise your pulse on the exercise bike is to stand up instead of sitting down when cycling (fig. 1). You may have to tilt the exercise bike forward a little to avoid hitting your knees on the handlebar. I have successfully used the foldable prop-up shown in fig. 2. Any sturdy box will do as long as you can attach it to the bike so it doesn’t come off while cycling.

Set the pace with a metronome app

A metronome app for the mobile phoneFig. 3: A metronome app can be used for keeping the pace.

Several methods for regulating the power of the training bike are possible. A method that has worked well for me is to set the bike’s resistance to a high, fixed value, and then adjust the pedaling pace (cadence) to achieve the desired pulse rate.

A metronome app for the mobile phone can be used to assist keeping the pace. A nice app is Metronome Beats, available in a free version for both iOS and Android (fig. 3).



Measure performance with a pulse band

Pulse band to measure heart rateFig. 4: A pulse band can be used to record the heart rate during exercise.

The heart reate needs to be monitored to make sure it stays in the proper training zone. Although pulse clocks are inexpensive and have become popular, their measurements are not very reliable. I suggest using a pulse band because they produce more reliable measurements.

The Wahoo Tickr X pulse band in fig. 4 has a companion app that allows uploading the log file to the computer. This file is in the garmin “.fit” standrad format and can be parsed with a simple Python program. Another common format is the “.tcx” format. An example of a program that parses both file types is shown in listing 1 below.

# Print heart rate log file /Martin Nilsson

import fitdecode # Fitdecode is available on Github
import xml.etree.ElementTree as ET
import os
import matplotlib.pyplot as plt

def loadHRData(infile, totalSeconds = 720):
    """load HR data from heart rate data file (.FIT/.TCX)."""
    fname, ext = os.path.splitext(infile)
    if ext == '.fit':   # Garmin .FIT formatted data
        with fitdecode.FitReader(infile) as fit:
            hrlist = [frame.get_value("heart_rate") for frame in fit
                      if (isinstance(frame, fitdecode.FitDataMessage) and
                          frame.name == "record" and
                          frame.has_field("heart_rate"))]
    elif ext == '.tcx': # XML formatted data
        with open(infile, "r", encoding="utf-8") as fit:
            xml = fit.read()
        p1 = xml.find('<TrainingCenterDatabase')
        p2 = xml.find('<Activities>')
        xml = xml[:p1] + '<TrainingCenterDatabase>' + xml[p2:]
        root =  ET.fromstring(xml)
        hrlist = [int(x.text) for x in root.findall('.//HeartRateBpm/Value')]
    else:
        raise Exception("Cannot parse this file type: " + ext)
    return  hrlist[:totalSeconds]
   
def plotHRData(files, symbols, labels, xlabel, ylabel, 
               totalSeconds = 720, skipSeconds = 0):
    """Estimate and plot HR data."""
    plt.figure(figsize=(15,9.3))
    plt.ylabel(ylabel)
    plt.xlabel(xlabel)
    plt.grid()
    plt.minorticks_on()
    plt.grid(which='minor', alpha=0.2)
    handles = []
    for n in range(len(files)):
        hrlist = loadHRData(files[n], totalSeconds)
        hrlist2 = hrlist[skipSeconds:totalSeconds]
        xlist = [x/60.0 for x in range(skipSeconds,len(hrlist))]
        handles.append(plt.plot(xlist, hrlist2, symbols[n], label=labels[n])[0])
    plt.legend(handles=handles, loc='lower right')

Listing 1: Python program for parsing and printing heart rate log files in .fit or .tcx formats.

Listing 2 shows an example how the program is called.

plotHRData([".//data//2021-10-09-153509-UBERDROID0D30-54-0-MotCykel-162takt.fit",
            ".//data//2021-10-13-194056-UBERDROID0D30-55-0-MotCykel-164takt.fit",
            ".//data//2021-10-15-161423-UBERDROID0D30-56-0-MotCykel-166takt.fit"],
           ['-','-','-'],
           ['Exercise bike 2021-10-09, 162 BPM',
            'Exercise bike 2021-10-13, 164 BPM',
            'Exercise bike 2021-10-15, 166 BPM'],
           "Time [min]",
           "Heart rate [beats/min]", totalSeconds = 720)

Listing 2: Sample call printing three log files.

The result is shown in fig. 5.

Fig. 5: Heart rate diagrams printed by the call in listing 2 using the program in listing 1.

Training schedule

The final question is how often the training session should be repeated. For me, an effective schedule has been to repeat the 12-minute session once every three days. Doing it twice a week will probably yield similar results. As always, your mileage may vary. Good luck!

Back to main page