Référence technique et formules
Implémentation mathématique complète
Guide de mise en œuvre
Cette page fournit des formules de copier-coller et des méthodes de calcul étape par étape pour toutes les métriques Run Analytics. Utilisez-les pour des implémentations personnalisées, une vérification ou une compréhension plus approfondie.
⚠️ Notes de mise en œuvre
- Tous les temps doivent être convertis en secondes pour les calculs
- Le rythme de course est inversé (% plus élevé = rythme plus lent)
- Validez toujours les entrées pour des plages raisonnables
- Gérer les cas extrêmes (division par zéro, valeurs négatives)
Indicateurs de performance de base
Vitesse d'exécution critique (CRS)
Formule:
CRS (m/s) = (D₂ - D₁) / (T₂ - T₁)
CRS Allure/100 m (secondes) = (T₄₀₀ - T₂₀₀) / 2
🧪 Calculatrice interactive - Testez la formule
CRS Allure par 100 m :
1:49
Étapes de calcul :
CRS (m/s) = (400 - 200) / (368 - 150) = 0,917 m/s
Allure/100 m = 100 / 0,917 = 109 secondes = 1:49
CRS (m/s) = (400 - 200) / (368 - 150) = 0,917 m/s
Allure/100 m = 100 / 0,917 = 109 secondes = 1:49
Implémentation JavaScript :
fonction calculerCRS (distance1, temps1, distance2, temps2) {
// Convertir les temps en secondes IF nécessaire
const t1 = type de temps1 === 'string' ? timeToSeconds(time1) : time1;
const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;
// Calculer CRS en m/s
const css_ms = (distance2 - distance1) / (t2 - t1);
// Calculer le rythme par 100 m en secondes
const pace_per_100m = 100 / css_ms ;
// Convertir au format mm:ss
const minutes = Math.floor(pace_per_100m / 60);
const secondes = Math.round(pace_per_100m % 60);
retourner {
css_ms : css_ms,
rythme_secondes : rythme_per_100m,
Pace_formatted : `${minutes}:${seconds.toString().padStart(2, '0')}`
} ;
}
// Exemple d'utilisation :
résultat const = calculerCRS(200, 150, 400, 368);
// Renvoie : { css_ms : 0,917, rythme_secondes : 109, rythme_formatté : "1:49" }
Score de stress d'entraînement à la course à pied (sTSS)
Formule complète :
sTSS = (IF³) × Durée (heures) × 100
IF = NSS / FTP
NSS = Distance totale / Temps total (m/min)
🧪 Calculatrice interactive - Testez la formule
sTSS calculé :
55
Étapes de calcul :
NSS = 3 000 m / 55 min = 54,5 m/min
FTP = 100 / (93/60) = 64,5 m/min
IF = 54,5 / 64,5 = 0,845
sTSS = 0,845³ × (55/60) × 100 = 55
NSS = 3 000 m / 55 min = 54,5 m/min
FTP = 100 / (93/60) = 64,5 m/min
IF = 54,5 / 64,5 = 0,845
sTSS = 0,845³ × (55/60) × 100 = 55
Implémentation JavaScript :
fonction calculateSTSS (distance, timeMinutes, ftpMetersPerMin) {
// Calculer la vitesse d'exécution normalisée
const nss = distance / tempsMinutes ;
// Calculer le facteur d'intensité
const IntensityFactor = nss / ftpMetersPerMin ;
// Calculer les heures
heures const = timeMinutes / 60 ;
// Calculez sTSS en utilisant le facteur d'intensité au cube
const sTSS = Math.pow(intensityFactor, 3) * heures * 100 ;
retourner Math.round(sTSS);
}
// Exemple d'utilisation :
const sTSS = calculerSTSS(3000, 55, 64,5);
// Renvoie : 55
// Aide : Convertir CRS en FTP
fonction cssToFTP (cssPacePer100mSeconds) {
// FTP en m/min = 100m / (allure en minutes)
renvoyer 100 / (cssPacePer100mSeconds / 60) ;
}
// Exemple : CRS de 1:33 (93 secondes)
const FTP = cssVersFTP(93); // Retours : 64,5 m/min
Efficacité de fonctionnement
Formule:
Efficacité de course = temps kilométrique (secondes) + nombre de foulées
Efficacité de course₂₅ = (Temps × 25/longueur de la piste) + (foulées × 25/longueur de la piste)
🧪 Calculatrice interactive - Testez la formule
Score d'efficacité de fonctionnement :
35
Calcul:
Efficacité de course = 20 s + 15 foulées = 35
Efficacité de course = 20 s + 15 foulées = 35
Implémentation JavaScript :
function calculateRunning Efficiency (timeSeconds, strideCount) {
retourner timeSeconds + strideCount ;
}
function calculateNormalizedRunning Efficiency (timeSeconds, strideCount, trackLength) {
const normalizedTime = timeSeconds * (25 / trackLength);
const normalizedStrides = strideCount * (25 / trackLength);
return normalizedTime + normalizedStrides ;
}
// Exemple :
const swolf = calculer l'efficacité de fonctionnement (20, 15);
// Renvoie : 35
const swolf50m = calculer l'efficacité de fonctionnement normale (40, 30, 50);
// Renvoie : 35 (normalisé à 25 m)
Mécanique de foulée
Fréquence de foulée (SR)
Formule:
SR = 60 / Temps de cycle (secondes)
SR = (Nombre de foulées / Temps en secondes) × 60
🧪 Calculatrice interactive - Testez la formule
Fréquence de foulée (SPM) :
72
Calcul:
SR = (30/25) × 60 = 72 SPM
SR = (30/25) × 60 = 72 SPM
Implémentation JavaScript :
fonction calculateStrideRate (strideCount, timeSeconds) {
return (strideCount / timeSeconds) * 60 ;
}
// Exemple :
const sr = calculateStrideRate(30, 25);
// Renvoie : 72 SPM
Distance par foulée (DPS)
Formule:
DPS = Distance / Nombre de foulées
DPS = Distance / (SR / 60)
Implémentation JavaScript :
fonction calculateDPS (distance, strideCount, pushoffDistance = 0) {
const effectiveDistance = distance - pushoffDistance ;
retourner effectiveDistance / strideCount ;
}
// Exemple (piste de 25 m, poussée de 5 m) :
const dps = calculerDPS(25, 12, 5);
// Retours : 1,67 m/foulée
// Pour plusieurs segments :
const dps100m = calculerDPS(100, 48, 4 * 5);
// Retours : 1,67 m/foulée (4 segments × poussée de 5 m)
Vitesse de SR et DPS
Formule:
Vitesse (m/s) = (SR / 60) × DPS
Implémentation JavaScript :
fonction calculerVelocity(strideRate, dps) {
retour (strideRate / 60) * dps ;
}
// Exemple :
vitesse const = calculateVelocity(70, 1.6);
// Retours : 1,87 m/s
Indice de foulée (SI)
Formule:
SI = Vitesse (m/s) × DPS (m/foulée)
Implémentation JavaScript :
fonction calculateStrideIndex (vitesse, dps) {
vitesse de retour * dps ;
}
// Exemple :
const si = calculateStrideIndex(1.5, 1.7);
// Renvoie : 2,55
Tableau de gestion des performances (PMC)
CTL, ATL, TSB Calculs
Formules :
CTL aujourd'hui = CTL hier + (TSS aujourd'hui - CTL hier) × (1/42)
ATL aujourd'hui = ATL hier + (TSS aujourd'hui - ATL hier) × (1/7)
TSB = CTL hier - ATL hier
Implémentation JavaScript :
fonction updateCTL (previousCTL, aujourd'huiTSS) {
return previousCTL + (aujourd'huiTSS - previousCTL) * (1/42);
}
fonction updateATL (précédentATL, aujourd'huiTSS) {
return previousATL + (aujourd'huiTSS - previousATL) * (1/7);
}
fonction calculateTSB (hierCTL, hierATL) {
retourner hierCTL - hierATL ;
}
// Calculez PMC pour une série d'entraînements
fonction calculerPMC (entraînements) {
soit CTL = 0, ATL = 0 ;
const résultats = [];
workouts.forEach(workout => {
CTL = updateCTL(CTL, workout.TSS);
ATL = updateATL(ATL, entraînement.TSS);
const TSB = calculateTSB(CTL, ATL);
résultats.push({
date : entraînement.date,
TSS : entraînement.TSS,
CTL : Math.round(CTL * 10) / 10,
ATL : Math.round(ATL * 10) / 10,
TSB : Math.round(TSB * 10) / 10
});
});
renvoyer les résultats ;
}
// Exemple d'utilisation :
const entraînements = [
{date : '2025-01-01', TSS : 50 },
{date : '02/01/2025', TSS : 60 },
{date : '03/01/2025', TSS : 45 },
// ... plus d'entraînements
];
const PMC = calculatePMC (entraînements);
// Renvoie un tableau avec CTL, ATL, TSB pour chaque jour
Calculs avancés
CRS à partir de plusieurs distances (méthode de régression)
Implémentation JavaScript :
fonction calculerCRSRegression (distances, temps) {
// Régression linéaire : distance = a + b*temps
const n = distances.longueur ;
const sumX = times.reduce((a, b) => a + b, 0);
const sumY = distances.reduce((a, b) => a + b, 0);
const sumXY = times.reduce((sum, x, i) => sum + x * distances[i], 0);
const sumXX = times.reduce((sum, x) => sum + x * x, 0);
const pente = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX) ;
const intercept = (sumY - pente * sumX) / n;
retourner {
css : pente, // Vitesse de course critique (m/s)
anaerobic_capacity : interception // Capacité de distance anaérobie (m)
} ;
}
// Exemple avec plusieurs distances de test :
distances constantes = [100, 200, 400, 800] ;
const fois = [65, 150, 340, 720] ; // en secondes
résultat const = calculateCRSRegression (distances, temps);
// Renvoie : { css : 1,18, capacité_anaérobie : 15,3 }
Facteur d'intensité du rythme
Implémentation JavaScript :
fonction calculateIntensityFactor (actualPace100m, seuilPace100m) {
// Convertit l'allure en vitesse (m/s)
const actualSpeed = 100 / actualPace100m ;
const seuilVitesse = 100 / seuilPace100m ;
renvoie la vitesse réelle / la vitesse seuil ;
}
// Exemple :
const if_value = calculateIntensityFactor(110, 93);
// Renvoie : 0,845 (à 84,5 % du seuil)
Analyse de la cohérence du rythme
Implémentation JavaScript :
fonction analysePaceConsistency (segments) {
const Paces = segments.map(kilometer => kilometer.distance / kilometer.time);
const avgPace = Paces.reduce((a, b) => a + b) / Paces.length;
const variance = rythmes.reduce((somme, rythme) =>
somme + Math.pow(pace - avgPace, 2), 0) /paces.length;
const stdDev = Math.sqrt(variance);
const coefficientOfVariation = (stdDev / avgPace) * 100 ;
retourner {
rythme moyen,
développement standard,
coefficientDeVariation,
cohérence : coefficientOfVariation < 5 ? "Excellent" :
coefficientOfVariation < 10 ? "Bien" :
coefficientOfVariation < 15 ? "Modéré" : "Variable"
} ;
}
// Exemple :
segments const = [
{ distance : 100, temps : 70 },
{ distance : 100, temps : 72 },
{ distance : 100, temps : 71 },
//...
];
const analyse = analysePaceConsistency(segments);
// Renvoie : { avgPace : 1,41, stdDev : 0,02, coefficientOfVariation : 1,4, cohérence : "Excellent" }
Détection de la fatigue à partir du nombre de foulées
Implémentation JavaScript :
fonction détecterFatigue (segments) {
const firstThird = segments.slice(0, Math.floor(segments.length/3));
const lastThird = segments.slice(-Math.floor(segments.length/3));
const firstThirdAvg = firstThird.reduce((somme, kilomètre) =>
somme + kilomètre.strideCount, 0) / firstThird.length ;
const lastThirdAvg = lastThird.reduce((somme, kilomètre) =>
somme + kilomètre.strideCount, 0) / lastThird.length ;
const strideCountIncrease = ((lastThirdAvg - firstThirdAvg) / firstThirdAvg) * 100;
retourner {
firstThirdAvg : Math.round(firstThirdAvg * 10) / 10,
lastThirdAvg : Math.round(lastThirdAvg * 10) / 10,
percentIncrease : Math.round(strideCountIncrease * 10) / 10,
fatigueLevel : strideCountIncrease < 5 ? "Minime" :
strideCountIncrease < 10 ? "Modéré" :
strideCountIncrease < 20 ? "Important" : "Sévère"
} ;
}
// Exemple :
segments const = [
{ strideCount : 14 }, { strideCount : 14 }, { strideCount : 15 },
{ strideCount : 15 }, { strideCount : 16 }, { strideCount : 16 },
{ strideCount : 17 }, { strideCount : 18 }, { strideCount : 18 }
];
const fatigue = détecterFatigue(segments);
// Renvoie : { firstThirdAvg : 14,3, lastThirdAvg : 17,7, percentIncrease : 23,8, fatigueLevel : "Severe" }
Validation des données
Contrôles de qualité des données d'entraînement
Implémentation JavaScript :
fonction validateWorkoutData (entraînement) {
problèmes const = [];
// Vérifiez les plages de rythme raisonnables (1h00-5h00 par 100 m)
const avgPace = (workout.totalTime / workout.totalDistance) * 100 ;
IF (allure moyenne < 60 || allure moyenne > 300) {
issues.push(`Rythme moyen inhabituel : ${Math.round(avgPace)}s par 100 m`);
}
// Vérifiez le nombre de foulées raisonnable (10-50 par 25 m)
const avgStridesPer25m = (workout.totalStrides / workout.totalDistance) * 25 ;
IF (avgStridesPer25m < 10 || avgStridesPer25m > 50) {
issues.push(`Nombre de foulées inhabituelles : ${Math.round(avgStridesPer25m)} par 25 m`);
}
// Vérifiez une fréquence de foulée raisonnable (30-150 SPM)
const avgSR = calculateStrideRate(workout.totalStrides, workout.totalTime);
IF (moySR < 30 || moySR > 150) {
issues.push(`Tréquence de foulée inhabituelle : ${Math.round(avgSR)} SPM`);
}
// Vérification des segments manquants (intervalles de temps)
IF (workout.segments && workout.segments.length > 1) {
pour (soit i = 1; i < workout.segments.length; i++) {
const écart = entraînement.segments[i].startTime -
(workout.segments[i-1].startTime + workout.segments[i-1].duration);
IF (écart > 300) { // intervalle de 5 minutes
issues.push(`Grand écart détecté entre les segments ${i} et ${i+1}`);
}
}
}
retourner {
isValid : issues.length === 0,
problèmes
} ;
}
// Exemple :
const entraînement = {
Distance totale: 2000,
durée totale : 1 800, // 30 minutes
foulées totales : 800,
segments : [/* données kilométriques */]
} ;
const validation = validateWorkoutData(workout);
// Renvoie : { isValid : true, issues : [] }
Fonctions d'assistance
Utilitaires de conversion de temps
Implémentation JavaScript :
// Convertit mm:ss en secondes
fonction timeToSeconds (timeString) {
const parts = timeString.split(':');
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
// Convertit les secondes en mm:ss
fonction secondesVersTemps(secondes) {
const minutes = Math.floor(secondes / 60);
const secs = Math.round(secondes % 60);
return `${minutes}:${secs.toString().padStart(2, '0')}` ;
}
// Convertit les secondes en hh:mm:ss
fonction secondesToTimeDetailed(secondes) {
heures const = Math.floor(secondes / 3600);
const minutes = Math.floor((secondes % 3600) / 60);
const secs = Math.round(secondes % 60);
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}
// Exemples :
timeToSeconds("1:33"); // Renvoie : 93
secondesVersTemps(93); // Renvoie : "1:33"
secondesToTimeDetailed(3665); // Renvoie : "1:01:05"
Ressources de mise en œuvre
Toutes les formules de cette page sont prêtes pour la production et validées par la littérature scientifique. Utilisez-les pour des outils d'analyse personnalisés, une vérification ou une compréhension plus approfondie des calculs de performances en cours d'exécution.
💡 Meilleures pratiques
- Validez les entrées :Vérifiez les plages raisonnables avant de calculer
- Gérer les cas extrêmes :Division par zéro, valeurs négatives, données nulles
- Arrondissez convenablement :CTL/ATL/TSB à 1 décimale, sTSS à un entier
- Précision du magasin :Conserver une précision totale dans la base de données, arrondir pour l'affichage
- Testez minutieusement :Utiliser des données connues pour vérifier les calculs