Référence Technique et Formules

Implémentation Mathématique Complète

Guide d'Implémentation

Cette page fournit des formules prêtes à copier-coller, ainsi que des méthodes de calcul pas à pas pour toutes les métriques de Swim Analytics. Utilisez-les pour des implémentations personnalisées, la vérification ou une compréhension plus approfondie.

⚠️ Notes d'Implémentation

  • Tous les temps doivent être convertis en secondes pour les calculs
  • L'allure de natation est inversée (pourcentage plus élevé = allure plus lente)
  • Validez toujours les entrées pour des plages raisonnables
  • Gérez les cas limites (division par zéro, valeurs négatives)

Vous voulez éviter les calculs manuels ? Lisez notreGuide de charge d’entraînementou utilisez l'application gratuite Swim Analytics.

Métriques de Performance Principales

Vitesse Critique de Nage (VCN)

Formule :

VCN (m/s) = (D₂ - D₁) / (T₂ - T₁)
Allure VCN/100m (secondes) = (T₄₀₀ - T₂₀₀) / 2

🧪 Calculatrice Interactive - Testez la Formule

Allure VCN par 100m :
1:49
Étapes du calcul :
VCN (m/s) = (400 - 200) / (368 - 150) = 0,917 m/s
Allure/100m = 100 / 0,917 = 109 secondes = 1:49

Implémentation en JavaScript :

function calculateCSS(distance1, time1, distance2, time2) {
  // Convert times to seconds if needed
  const t1 = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
  const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;

  // Calculate CSS in m/s
  const css_ms = (distance2 - distance1) / (t2 - t1);

  // Calculate pace per 100m in seconds
  const pace_per_100m = 100 / css_ms;

  // Convert to mm:ss format
  const minutes = Math.floor(pace_per_100m / 60);
  const seconds = Math.round(pace_per_100m % 60);

  return {
    css_ms: css_ms,
    pace_seconds: pace_per_100m,
    pace_formatted: `${minutes}:${seconds.toString().padStart(2, '0')}`
  };
}

// Example usage:
const result = calculateCSS(200, 150, 400, 368);
// Returns: { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }

Score de Stress d'Entraînement de Natation (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 du calcul :
NSS = 3000m / 55min = 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 en JavaScript :

function calculateSTSS(distance, timeMinutes, ftpMetersPerMin) {
  // Calculate Normalized Swim Speed
  const nss = distance / timeMinutes;

  // Calculate Intensity Factor
  const intensityFactor = nss / ftpMetersPerMin;

  // Calculate hours
  const hours = timeMinutes / 60;

  // Calculate sTSS using cubed intensity factor
  const stss = Math.pow(intensityFactor, 3) * hours * 100;

  return Math.round(stss);
}

// Example usage:
const stss = calculateSTSS(3000, 55, 64.5);
// Returns: 55

// Helper: Convert CSS to FTP
function cssToFTP(cssPacePer100mSeconds) {
  // FTP in m/min = 100m / (pace in minutes)
  return 100 / (cssPacePer100mSeconds / 60);
}

// Example: CSS of 1:33 (93 seconds)
const ftp = cssToFTP(93); // Returns: 64.5 m/min

SWOLF

Formule :

SWOLF = Temps de la Longueur (secondes) + Nombre de Mouvements
SWOLF₂₅ = (Temps × 25/Longueur Bassin) + (Mouvements × 25/Longueur Bassin)

🧪 Calculatrice Interactive - Testez la Formule

Score SWOLF :
35
Calcul :
SWOLF = 20s + 15 mouvements = 35

Implémentation en JavaScript :

function calculateSWOLF(timeSeconds, strokeCount) {
  return timeSeconds + strokeCount;
}

function calculateNormalizedSWOLF(timeSeconds, strokeCount, poolLength) {
  const normalizedTime = timeSeconds * (25 / poolLength);
  const normalizedStrokes = strokeCount * (25 / poolLength);
  return normalizedTime + normalizedStrokes;
}

// Example:
const swolf = calculateSWOLF(20, 15);
// Returns: 35

const swolf50m = calculateNormalizedSWOLF(40, 30, 50);
// Returns: 35 (normalized to 25m)

Mécanique de Nage

Fréquence de Mouvements (FM)

Formule :

FM = 60 / Temps de Cycle (secondes)
FM = (Nombre de Mouvements / Temps en secondes) × 60

🧪 Calculatrice Interactive - Testez la Formule

Fréquence de Mouvements (MPM) :
72
Calcul :
FM = (30 / 25) × 60 = 72 MPM

Implémentation en JavaScript :

function calculateStrokeRate(strokeCount, timeSeconds) {
  return (strokeCount / timeSeconds) * 60;
}

// Exemple :
const fm = calculateStrokeRate(30, 25);
// Retourne : 72 MPM

Distance par Mouvement (DPS)

Formule :

DPS = Distance / Nombre de Mouvements
DPS = Distance / (SR / 60)

Implémentation en JavaScript :

function calculateDPS(distance, strokeCount, pushoffDistance = 0) {
  const effectiveDistance = distance - pushoffDistance;
  return effectiveDistance / strokeCount;
}

// Exemple (bassin 25m, 5m de coulée) :
const dps = calculateDPS(25, 12, 5);
// Retourne : 1,67 m/mouvement

// Pour plusieurs longueurs :
const dps100m = calculateDPS(100, 48, 4 * 5);
// Retourne : 1,67 m/mouvement (4 longueurs × 5m de coulée)

Vitesse à partir de SR et DPS

Formule :

Vitesse (m/s) = (SR / 60) × DPS

Implémentation en JavaScript :

function calculateVelocity(strokeRate, dps) {
  return (strokeRate / 60) * dps;
}

// Exemple :
const velocity = calculateVelocity(70, 1.6);
// Retourne : 1,87 m/s

Indice de Nage (SI)

Formule :

SI = Vitesse (m/s) × DPS (m/mouvement)

Implémentation en JavaScript :

function calculateStrokeIndex(velocity, dps) {
  return velocity * dps;
}

// Exemple :
const si = calculateStrokeIndex(1.5, 1.7);
// Retourne : 2,55

Graphique de Gestion de la Performance (PMC)

Calculs de CTL, ATL, TSB

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 en JavaScript :

function updateCTL(previousCTL, todayTSS) {
  return previousCTL + (todayTSS - previousCTL) * (1/42);
}

function updateATL(previousATL, todayTSS) {
  return previousATL + (todayTSS - previousATL) * (1/7);
}

function calculateTSB(yesterdayCTL, yesterdayATL) {
  return yesterdayCTL - yesterdayATL;
}

// Calculate PMC for series of workouts
function calculatePMC(workouts) {
  let ctl = 0, atl = 0;
  const results = [];

  workouts.forEach(workout => {
    ctl = updateCTL(ctl, workout.tss);
    atl = updateATL(atl, workout.tss);
    const tsb = calculateTSB(ctl, atl);

    results.push({
      date: workout.date,
      tss: workout.tss,
      ctl: Math.round(ctl * 10) / 10,
      atl: Math.round(atl * 10) / 10,
      tsb: Math.round(tsb * 10) / 10
    });
  });

  return results;
}

// Example usage:
const workouts = [
  { date: '2025-01-01', tss: 50 },
  { date: '2025-01-02', tss: 60 },
  { date: '2025-01-03', tss: 45 },
  // ... more workouts
];

const pmc = calculatePMC(workouts);
// Returns array with CTL, ATL, TSB for each day

Calculs Avancés

VCN à partir de Plusieurs Distances (Méthode de Régression)

Implémentation en JavaScript :

function calculateCSSRegression(distances, times) {
  // Linear regression: distance = a + b*time
  const n = distances.length;
  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 slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
  const intercept = (sumY - slope * sumX) / n;

  return {
    css: slope, // Critical swimming velocity (m/s)
    anaerobic_capacity: intercept // Anaerobic distance capacity (m)
  };
}

// Example with multiple test distances:
const distances = [100, 200, 400, 800];
const times = [65, 150, 340, 720]; // in seconds
const result = calculateCSSRegression(distances, times);
// Returns: { css: 1.18, anaerobic_capacity: 15.3 }

Facteur d'Intensité à partir de l'Allure

Implémentation en JavaScript :

function calculateIntensityFactor(actualPace100m, thresholdPace100m) {
  // Convert pace to speed (m/s)
  const actualSpeed = 100 / actualPace100m;
  const thresholdSpeed = 100 / thresholdPace100m;
  return actualSpeed / thresholdSpeed;
}

// Example:
const if_value = calculateIntensityFactor(110, 93);
// Returns: 0.845 (swimming at 84.5% of threshold)

Analyse de Cohérence de l'Allure

Implémentation en JavaScript :

function analyzePaceConsistency(laps) {
  const paces = laps.map(lap => lap.distance / lap.time);
  const avgPace = paces.reduce((a, b) => a + b) / paces.length;

  const variance = paces.reduce((sum, pace) =>
    sum + Math.pow(pace - avgPace, 2), 0) / paces.length;
  const stdDev = Math.sqrt(variance);
  const coefficientOfVariation = (stdDev / avgPace) * 100;

  return {
    avgPace,
    stdDev,
    coefficientOfVariation,
    consistency: coefficientOfVariation < 5 ? "Excellente" :
                 coefficientOfVariation < 10 ? "Bonne" :
                 coefficientOfVariation < 15 ? "Modérée" : "Variable"
  };
}

// Example:
const laps = [
  { distance: 100, time: 70 },
  { distance: 100, time: 72 },
  { distance: 100, time: 71 },
  // ...
];
const analysis = analyzePaceConsistency(laps);
// Returns: { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, consistency: "Excellente" }

Détection de Fatigue par le Nombre de Mouvements

Implémentation en JavaScript :

function detectFatigue(laps) {
  const firstThird = laps.slice(0, Math.floor(laps.length/3));
  const lastThird = laps.slice(-Math.floor(laps.length/3));

  const firstThirdAvg = firstThird.reduce((sum, lap) =>
    sum + lap.strokeCount, 0) / firstThird.length;
  const lastThirdAvg = lastThird.reduce((sum, lap) =>
    sum + lap.strokeCount, 0) / lastThird.length;

  const strokeCountIncrease = ((lastThirdAvg - firstThirdAvg) / firstThirdAvg) * 100;

  return {
    firstThirdAvg: Math.round(firstThirdAvg * 10) / 10,
    lastThirdAvg: Math.round(lastThirdAvg * 10) / 10,
    percentIncrease: Math.round(strokeCountIncrease * 10) / 10,
    fatigueLevel: strokeCountIncrease < 5 ? "Minimale" :
                  strokeCountIncrease < 10 ? "Modérée" :
                  strokeCountIncrease < 20 ? "Significative" : "Sévère"
  };
}

// Example:
const laps = [
  { strokeCount: 14 }, { strokeCount: 14 }, { strokeCount: 15 },
  { strokeCount: 15 }, { strokeCount: 16 }, { strokeCount: 16 },
  { strokeCount: 17 }, { strokeCount: 18 }, { strokeCount: 18 }
];
const fatigue = detectFatigue(laps);
// Returns: { firstThirdAvg: 14.3, lastThirdAvg: 17.7, percentIncrease: 23.8, fatigueLevel: "Sévère" }

Validation des Données

Vérification de la Qualité des Données d'Entraînement

Implémentation en JavaScript :

function validateWorkoutData(workout) {
  const issues = [];

  // Check for reasonable pace ranges (1:00-5:00 per 100m)
  const avgPace = (workout.totalTime / workout.totalDistance) * 100;
  if (avgPace < 60 || avgPace > 300) {
    issues.push(`Allure moyenne inhabituelle : ${Math.round(avgPace)}s par 100m`);
  }

  // Check for reasonable stroke counts (10-50 per 25m)
  const avgStrokesPer25m = (workout.totalStrokes / workout.totalDistance) * 25;
  if (avgStrokesPer25m < 10 || avgStrokesPer25m > 50) {
    issues.push(`Nombre de mouvements inhabituel : ${Math.round(avgStrokesPer25m)} par 25m`);
  }

  // Check for reasonable stroke rate (30-150 SPM)
  const avgSR = calculateStrokeRate(workout.totalStrokes, workout.totalTime);
  if (avgSR < 30 || avgSR > 150) {
    issues.push(`Fréquence de nage inhabituelle : ${Math.round(avgSR)} MPM`);
  }

  // Check for missing laps (gaps in time)
  if (workout.laps && workout.laps.length > 1) {
    for (let i = 1; i < workout.laps.length; i++) {
      const gap = workout.laps[i].startTime -
                  (workout.laps[i-1].startTime + workout.laps[i-1].duration);
      if (gap > 300) { // 5 minute gap
        issues.push(`Grande interruption détectée entre les longueurs ${i} et ${i+1}`);
      }
    }
  }

  return {
    isValid: issues.length === 0,
    issues
  };
}

// Example:
const workout = {
  totalDistance: 2000,
  totalTime: 1800, // 30 minutes
  totalStrokes: 800,
  laps: [/* lap data */]
};
const validation = validateWorkoutData(workout);
// Returns: { isValid: true, issues: [] }

Fonctions Auxiliaires

Utilitaires de Conversion de Temps

Implémentation en JavaScript :

// Convert mm:ss to seconds
function timeToSeconds(timeString) {
  const parts = timeString.split(':');
  return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}

// Convert seconds to mm:ss
function secondsToTime(seconds) {
  const minutes = Math.floor(seconds / 60);
  const secs = Math.round(seconds % 60);
  return `${minutes}:${secs.toString().padStart(2, '0')}`;
}

// Convert seconds to hh:mm:ss
function secondsToTimeDetailed(seconds) {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.round(seconds % 60);
  return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

// Examples:
timeToSeconds("1:33"); // Returns: 93
secondsToTime(93); // Returns: "1:33"
secondsToTimeDetailed(3665); // Returns: "1:01:05"

Ressources d'Implémentation

Toutes les formules sur cette page sont prêtes pour la production et validées contre la littérature scientifique. Utilisez-les pour des outils d'analyse personnalisés, la vérification ou une compréhension plus approfondie des calculs de performance en natation.

💡 Meilleures Pratiques

  • Validez les entrées : Vérifiez les plages raisonnables avant de calculer
  • Gérez les cas limites : Division par zéro, valeurs négatives, données nulles
  • Arrondissez correctement : CTL/ATL/TSB à 1 décimale, sTSS à un entier
  • Stockez la précision : Conservez la précision complète en base de données, arrondissez pour l'affichage
  • Testez exhaustivement : Utilisez des données connues et correctes pour vérifier les calculs

Données probantes et méthode éditoriale

AnalyticsZone explique des modèles publiés en sciences du sport, présente les formules et hypothèses, et relie les sources primaires ou officielles afin de vérifier la méthode.

Formules de Performance en Natation: CSS, TSS, Calculs...

Formules complètes de performance en natation avec des exemples de code JavaScript. Calculez CSS, sTSS, CTL/ATL/TSB, SWOLF, fréquence d'AVC. Implémentations...

  • 2026-02-20
  • formules natation · formule CSS · calcul TSS · métriques natation · Javascript
  • Bibliographie