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

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

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

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

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