Nel resistance training ci sono tre esercizi che vengono considerati “fondamentali” e sono diventati l’emblema della pesistica: squat, panca e stacco. Focalizzandoci più sull’aspetto di strength training, quindi dell’aumento della forza, dovremo considerare metodiche, programmazioni, percentuali di sovraccarico, e tempi di recupero ben precisi. Il primo passo, più semplice, è quello di tracciare i progressi e avere un obiettivo oggettivo: deve aumentare il peso spostato!

Ci sono un’infinità di benefici nell’allenare la forza, molti dei quali ho già trattato in un articolo:

Alla base dell’allenamento, uno dei fattori più importanti, è il sovraccarico progressivo, ovvero il peso deve aumentare di seduta in seduta altrimenti gli esercizi non saranno più allenanti. È quindi necessario, oltre che buona abitudine, tenere traccia dei progressi.

Esercizi fondamentali

Lo squat è uno degli esercizi principe dell’allenamento con i pesi. È un esercizio multiarticolare per lo sviluppo degli arti inferiori che va a coinvolgere anche l’addome e il busto. Principalmente sono coinvolti glutei e quadricipiti a cui fanno seguito i bicipiti femorali, parete addominale, medio e piccolo gluteo, gastrocnemio e sacrospinale. Il movimento inizia da una posizione eretta portando indietro i fianchi, piegando quindi le ginocchia abbassando il busto. Questo chiaramente senza flettere la schiena. Uno squat a regola d’arte arriva sotto al parallelo ma ne esistono diverse varianti. Discorso analogo per il sovraccarico, tipicamente si utilizza un bilanciere posto sui trapezi ma ne esistono tantissime varianti.

squat


Un altro esercizio fondamentali sono le distensioni su panca, meglio noto come bench press. Usato in diversi ambiti dell’allenamento è anche una delle tre alzate fondamentali del powerlifting. L’esercizio si focalizza sul gran pettorale facendo lavorare anche i deltoidi anteriori, dentati anteriori e i tricipiti. Il sovraccarico viene abbassato a livello del petto e poi spinto finché il braccio non è completamente disteso.

C’è poi lo stacco da terra, un esercizio veramente completo che coinvolge gran parte dei muscoli del corpo. Il deadlift tradizionale può essere diviso in tre fasi. Si parte con il posizionamento dove ci si posiziona con il bilanciere dovanti quasi toccandolo con le gambe. La colonna vertebrale rimane dritta. C’è poi il movimento in cui c’è il massimo sforzo per alzare il peso. Infine, la fase di blocco, dove si è nella posizione eretta impegnando i muscoli della colonna lombare e dell’addome, all’unisono con i glutei. L’esercizio termina svolgendo le tre fasi al contrario e posizionando nuovamente il sovraccarico a terra.

A questi tre esercizi è bene aggiungere anche il lento avanti e un lavoro di trazione verticale, quale lat machine o meglio ancora le trazioni con zavorra, e i piegamenti alle parellele.

Esistono un’infinità di esercizi ma questi sono quelli che ritengo più utili e di cui vorrò tracciare i dati nel seguito.

Un caso pratico

Esistono tantissime informazioni in letteratura su come, quali e quanti esercizi fare a seconda del proprio obiettivo. Esistono diverse scuole di pensiero ma la maggior parte dei principi sono condivisi. Ci sono tante variabili da tenere in conto per ottimizzare e rendere efficace ed efficiente un percorso di allenamento.

In questo caso ho provato a mettere in pratica alcuni di tali principi tenendo traccia dei progressi. Per questa prima parte mi sono limitato a tenere traccia del sovraccarico e dei set (serie e ripetizioni) di ogni seduta. Per farlo ho implementato un piccolo algoritmo in Matlab che permette di graficare questi dati rendendo visibili le informazioni più importanti che spesso si nascondo dietro una tabella di numeri. Inoltre, l’algoritmo cerca anche un modello di crescita ma questo va letto con attenzione poichè per essere realistico deve portare in conto diversi fattori. Soprattutto risente fortemente della quantità dei dati e del livello di preparazione atletica del soggetto.

Per avere un riscontro pratico di tutta questa teoria ho deciso di testarlo io stesso.

Codice

Il codice parte dal leggere una semplice tabella .csv facilmente ottenibile da qualsiasi foglio di calcolo ed editabile anche da smartphone. Questo permette di aggiornare i dati anche in remoto e durante l’allenamento stesso. È sufficiente chiamare la funzione palestra('file.csv') passandogli la tabella per ottenere quanto descritto nel seguito. La tabella deve essere struttura come segue in modo tale da ottimizzare l’algoritmo.

DataSxRSerie 1Serie n
DATASETxREPREPxPESOREPxPESO
gg-mm-aa5×55×1005×100

Le tabelle possono essere tranquillamente gestite in un foglio di calcolo (Excel, Numbers, ecc) ed esportate in csv (Matlab si adatta abbastanza bene alle diverse codifiche tabellari) oppure direttamente in Matlab.

L’algoritmo inizia caricando la tabella nel workspace. Tiene in memoria anche il nome del file, senza estensione.

T = readtable(filex);
name_temp=strread(dir(filex).name,'%s','delimiter','.');
name=string(name_temp(1));

Successivamente va dividere la colonna SETxREP in due vettori contenenti i relativi valori indicizzati. Fa lo stesso anche per le singole serie dove i dati sono inseriti come RIPETIZIONIxPESO. Questo permette di avere sia una stima di massimo considerando ripetizioni e serie come programmate da scheda (es 3×10) sia di portare in conto eventuali serie fallite o fuori scheda. Questo risulterà utile nel calcolo del tonnellaggio.

sxr=string(table2array(T(1:numel(T.Giorno),strmatch('SxR',T.Properties.VariableNames))));
SR=split(sxr,'x');
for i=1:numel(T.Giorno)
SET(i)=str2num(SR(i,1));
REP(i)=str2num(SR(i,2));
end
%...
 for k=1:strlength(name)
    if k==1 
        name{1}(k)=upper(name{1}(k));
    else
        name{1}(k)=lower(name{1}(k));
    end
 end
for i=1:numel(T.Giorno)
datevec(i)=datetime(T.Giorno{i},'Format','dd-MM-uuuu');
end
T.Date=datevec';
datigrezzi=table2array(T(1:numel(T.Giorno),strmatch('Serie',T.Properties.VariableNames)));
datigrezzi_2=split(datigrezzi,'x');
%---> convertire in numeri 
datigrezzirep=datigrezzi_2(:,:,1);
datigrezzirep(cellfun('isempty',datigrezzirep))={'NaN'};
datigrezzipeso=datigrezzi_2(:,:,2);
datigrezzipeso(cellfun('isempty',datigrezzipeso))={'NaN'};
for i=1:numel(datigrezzirep(:,1))
    for j=1:numel(datigrezzirep(1,:))
   datirep(i,j)=str2num(cell2mat(datigrezzirep(i,j)));
datipeso(i,j)=str2num(cell2mat(datigrezzipeso(i,j)));
    end
end

Nella stessa inizializzazione del codice viene anche standardizzato il nome del file che rispecchia quello dell’esercizio. E convertite le date in datetime in modo tale che Matlab possa farci effettivamente delle operazioni. Poi le variabili vengono convertire in matrici e vettori così da poterci fare operazioni algebriche.

Grafici e statistiche

Successivamente viene graficato un diagramma scatole e baffi. La funzione boxplot() va a leggere i valori dalla matrice contenente il sovraccarico per la serie e le singole giornate, datipeso(serie, giorno).

figure()
boxplot(datipeso',datetime(datevec,'Format','dd-MM'),'MedianStyle','target')
value=max(max(datipeso))-min(min(datipeso));
ylim([min(min(datipeso))-value max(max(datipeso))+value/2])
hold on
plot(nanmedian(datipeso'),'--r')
hold off
title(name)

Il boxplot è un grafico statisticamente molto valido che in questo caso può risultare sprecato. Il punto centrale è la mediana e la scatola rappresenta i quartili (ovvero il 25mo e il 75mo percentile). I baffi invece rappresentano massimo e minimo. La statistica risulta piuttosto riduttiva su un numero di serie generalmente tra un minimo di 3 ad un massimo di 10 per esercizio. Tuttavia può dare l’idea se in una particolare giornata si è usato sempre lo stesso carico (scatola assente) oppure si è partiti da un sovraccarico molto basso per terminare la maggior parte con carico alto (punto centrale in alto e baffo inferiore lungo) o se le serie sono partite basse per terminare con carichi alti (scatola allungata con punto centrale).

sovraccarico squat

Queste stime possono aiutare nell’ottimizzare l’allenamento e la periodizzazione, nonchè permettono di affinare il programma di allenamento e di avere un riscontro visivo sui dati raccolti.

Successivamente vengono plottate anche la media per ogni singola giornata (considerando la media dei carichi) e una media pesata (considerando la media del sovraccarico pesata per il numero di ripetizioni).

meanweigth=nansum((datipeso.*datirep)')./nansum(datirep');
&...
figure()
plot(datevec,meanweigth,'or')
hold on 
plot(datevec,max(datipeso'),'^g')
plot(datevec,max(datipeso'),'--g')
plot(datevec,meanweigth,'--b')
ylim([min(min(datipeso))-value max(max(datipeso))+value/2])
title(name+' mean vs max','from '+string(datevec(1))+' to '+string(datevec(length(datevec))))
legend('Mean value', 'Max value')

Vengono prodotti un totale di 4 grafici (media, media pesata, massimi, confronto) e le medie vengono poi confrontate anche con i valori massimi.

Un parametro leggermente più raffinato è il tonnellaggio. Questo termine, nell’ambito del training, è un modo per rappresentare il volume di allenamento. Viene calcolato come serie x ripetizioni x sovraccarico. Inoltre vengono calcolati anche i tassi di incremento mensile.

for i=1:numel(datipeso(:,1))
ton(i)=nansum(datipeso(i,:).*datipeso(i,:));
end
figure()
plot(datevec,ton,'--k')
hold on 
plot(datevec,ton,'^r')
ylim([(min(ton)-(max(ton)-min(ton))/2) (max(ton)+(max(ton)-min(ton))/2)])
title(name+' ton')
indice=1:4:numel(day_val); %aumenta di 4 considerando le sedute a distanza di 4 settimane (1 mese)
maxpeso=max(datipeso');
pesoincremento=maxpeso(indice);
meseincremento=datetime(datevec(indice),'Format','MMMM');
for i=1:(numel(pesoincremento)-1)
    incremento(i)=(pesoincremento(i+1)-pesoincremento(i))/pesoincremento(i);
    testoincremento(i)=strcat('increment between'," ",string(meseincremento(i)),' -'," ",string(meseincremento(i+1)),' ='," ",string(incremento(i)*100),'%');
end
testoincremento' 

Questi parametri possono essere molto utili sia per l’atleta che per il preparato. Tipicamente vengono valutati nel mese ma preparatori più esperti possono fare valutazioni anche all’interno del mesociclo o del macrociclo.

ll codice termina esportando tutte le figure sia come file pdf che come .fig, formato che permette di trattarle ed elaborarle ulteriormente in Matlab.

Modello di crescita del sovraccarico

Vengono fatti anche diversi fit polinomiali. Vengo fatti due fit polinomiali, lineare e quadratico, che permettono di avere una prima stima di come stanno andando i carichi rispetto gli andamenti, lineare e quadratico, che meglio approssimano il sovraccarico progressivo.

for i=1:numel(datevec)
day_val(i)=days(datevec(i)-datevec(1));
end
f1=fit(day_val',meanweigth','poly1');
f1_max=fit(day_val',max(datipeso')','poly1');
f2=fit(day_val',meanweigth','poly2');
f2_max=fit(day_val',max(datipeso')','poly2');
figure()
subplot(2,1,1)
plot(linspace(min(day_val),max(day_val),100),f1(linspace(min(day_val),max(day_val),100)),'-r');
hold on
plot(linspace(min(day_val),max(day_val),100),f1_max(linspace(min(day_val),max(day_val),100)),'--g');
plot(day_val,meanweigth,'ob')
hold off
xlim([0 max(day_val)+10])
title(name+' linear growth model');
subplot(2,1,2)
plot(linspace(min(day_val),max(day_val),100),f2(linspace(min(day_val),max(day_val),100)),'-r');
hold on
plot(linspace(min(day_val),max(day_val),100),f2_max(linspace(min(day_val),max(day_val),100)),'--g');
plot(day_val,meanweigth,'ob')
xlabel('Days')
legend('Mean growth model','Max growth model','Mean value','Location','southeast')
xlim([0 max(day_val)+10])
title(name+' quadratic growth model');
%
degree=1; %grado del polinomio interpolante
fp=polyfit(day_val,meanweigth,degree);
plotfp = polyval(fp,linspace(min(day_val),max(day_val)*1.2,200));
figure()
plot(day_val,meanweigth,'or')
hold on
plot(linspace(min(day_val),max(day_val)*1.2,200),plotfp,'b')
    poly=''
for i=1:degree+1   
    if i==degree+1
    poly=strcat(poly,'+',string(fp(i)));
   elseif i==1
     poly=strcat(string(fp(i)),'\cdot x^',string(degree+1-i));
    else
        poly=strcat(poly,'+',string(fp(i)),'\cdot x^',string(degree+1-i));
    end
end
poly=strrep(poly,'x^1','x'); %sisitemiamo il polinomio
polynom=strcat('$',poly,'$');
title(name+', '+ degree + ' degree poly growth model :=',polynom);
subtitle(polynom,'Interpreter','latex')
% 2D interp
for i=1:numel(datipeso(1,:))
D1(:,i)=[day_val'];
end
for i=1:numel(datipeso(:,1))
    R1(i,:)=1:1:numel(datipeso(1,:));
end
D=D1(:);
R=R1(:);
dati=datipeso(:);
dati(isnan(dati))=0;
%
f=fit([D, R],dati(:),'linearinterp');
figure()
plot(f,[D, R],dati(:))
hold on
ylabel('Repetition')
xlabel('Days')
zlabel('Weigth')
zlim([mean(dati(:))-(max(dati(:))/2) mean(dati(:))+(max(dati(:))/2)])
title(name+' days vs repetition');

Viene fatto anche un fit polinomiale 2D che permette di avere un grafico bidimensionale e di confrontare l’andamento dei carichi sia nel dominio temporale sia nelle diverse serie. Stampato non ha molto valore, a meno di inquadrature molto valide, ma riuscendo ad interagire permette di avere una visione veramente completa.

C’è poi un fit con polinomio di ordine variabile (degree). Questo permette di scegliere l’ordine del polinomo che va ad approssimare i valori. Questo viene calcoalto e permette di avere una prima stima del modello di crescita vero e proprio. Sfruttando questo modello si potrebbero fare anche previsioni sull’avanzamento a breve/medio termine inserendo al suo interno i giorni passati dal primo girono registrato. Può essere un primo aiuto per stimare, non tanto i carichi di allenamento, quanto dei target ottimali sui cui programmare i mesocicli seguenti.

In particolare si ottiene un polinomio vero e proprio. Ad esempio:

\text{Squat growth model:=} 0.50478\cdot x+70.7626\\
\text{Pull up growth model:=} 0.1079\cdot x+8.7004

Su questo modello di crescita è meglio fare alcune precisazioni.

Innanzitutto, questo modello è variabile e richiede diversi mesi di raccolta dati per essere stabilito. Sulla base del solo modello non è possibile giungere ad alcuna conclusione tuttavia può essere integrato con le altre informazioni di un piano di allenamento rendendolo nel complesso ancora più valido.

Se da un lato il modello richiede molti dati dall’altro si va in contro alla fisiologia umana. Inizialmente, per un principiante gli incrementi possono essere anche molto alti. In letteratura sono indicati dal 30% al 70% in qualche mese. Questi incrementi scendono poi per atleti intermedi fino a ridursi a qualche punto percentuale all’anno per atleti molto avanzati. Quindi è molto difficile stimare un unico modello.

È anche vero che difficilmente si hanno set di dati così completi quindi è utile sfruttate il modello solamente sul set di riferimento per visualizzare il trend di crescita piuttosto che fare stime vere e proprie. Limitandosi ad un periodo di alcuni mesi il modello migliore risulta chiaramente quello lineare, o al massimo un andamento quadratico molto allargato.

Disclaimer

Il piano di allenamento non è riportato nell’articolo. Il piano è stato strutturato da un professionista valutando diversi aspetti quali il tempo a disposizione, ulteriori tipologie di allenamento, fisicità e obiettivi personali e diversi infortuni.

I set di dati dei vari esercizi coinvolgono periodi temporali diversi a causa di infortuni, quindi non è sensato, ne possibile, correlarli tra loro. La validità, eventuali correzioni nei modelli di crescita e i risultati finali saranno discussi in un altro articolo.

I grafici potrebbero essere stati aggiornati anche successivamente alla data di pubblicazione.

La maggior parte dei set di dati coinvolge carichi da principiante/intermedio in cui gli incrementi di sovraccarico sono molto più marcati rispetto ad un atleta professionista.

Codice

Il codice completo è disponibile su GitHub:

Reference