Cyklistické výkonové vzorce

Matematické základy metrík analýzy bicyklov

Implementačná príručka

Táto stránka poskytuje vzorce kopírovania a vkladania a podrobné metódy výpočtu pre všetky metriky Bike Analytics. Použite ich na vlastné implementácie, overenie alebo hlbšie pochopenie tréningu založeného na výkone.

⚠️ Poznámky k implementácii

  • Všetky hodnoty výkonu vo wattoch (W), čas v sekundách, pokiaľ nie je uvedené inak
  • FTP a CP sú individuálne špecifické prahy – žiadne univerzálne hodnoty
  • Vždy overte vstupy pre primerané rozsahy (typicky 0-2000 W)
  • Rukoväť okrajových puzdier (delenie nulou, záporná mocnina)
  • Údaje o výkone vyžadujú pre presnosť 1-sekundové intervaly záznamu

Základné metriky výkonu na bicykli

1. Skóre tréningového stresu (TSS)

Vzorec:

TSS = (duration_seconds × NP × IF) / (FTP × 3600) × 100
kde IF = NP / FTP

Spracovaný príklad:

Scenár:2-hodinová jazda, NP = 235W, FTP = 250W

  1. Vypočítajte IF: IF = 235 / 250 = 0,94
  2. Trvanie v sekundách: 2 hodiny × 3600 = 7200 sekúnd
  3. TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
  4. TSS = 1 590 720 / 900 000 × 100 =176,7 TSS

Výklad: Ťažká tréningová jazda (>150 TSS), očakávajte 2-3 dni zotavenia

Implementácia JavaScriptu:

function calculateTSS(durationSeconds, normalizedPower, ftp) {
  const intensityFactor = normalizedPower / ftp;
  const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
  return Math.round(tss);
}

// Example usage:
const tss = calculateTSS(7200, 235, 250);
// Returns: 177

2. Normalizovaný výkon (NP)

Algoritmus (30-sekundový kĺzavý priemer):

1. Vypočítajte 30-sekundový kĺzavý priemerný výkon pre celú jazdu
2. Zvýšte každú 30-sekundovú hodnotu na 4. mocninu
3. Vezmite priemer všetkých týchto ^4 hodnôt
4. Vezmite 4. odmocninu tohto priemeru
NP = ⁴√ (priemer [30s_avg^4])

Prečo 4. moc?

Kvartický vzťah (4. mocnina) odráža nelineárne fyziologické náklady na variabilné úsilie. Jazda s nárazmi a rekuperáciou stojí viac energie ako stály výkon pri rovnakom priemere.

Príklad:

  • Stabilná jazda: 200 W na 1 hodinu → NP = 200 W, Priemer = 200 W
  • Variabilná jazda: Striedavý 300W/100W → Priemer = 200W, NP = 225W

Rovnaký priemerný výkon, ale variabilná jazda má o 12% vyšší NP kvôli fyziologickým nákladom na prepätia

Implementácia JavaScriptu:

function calculateNormalizedPower(powerData) {
  // powerData is array of 1-second power values

  // Step 1: Calculate 30-second rolling averages
  const rollingAvgs = [];
  for (let i = 29; i < powerData.length; i++) {
    const window = powerData.slice(i - 29, i + 1);
    const avg = window.reduce((sum, p) => sum + p, 0) / 30;
    rollingAvgs.push(avg);
  }

  // Step 2: Raise to 4th power
  const powered = rollingAvgs.map(p => Math.pow(p, 4));

  // Step 3: Average of 4th powers
  const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;

  // Step 4: Take 4th root
  const np = Math.pow(avgPowered, 0.25);

  return Math.round(np);
}

// Example usage:
const powerData = [/* 1-second power array */];
const np = calculateNormalizedPower(powerData);
// Returns: NP in watts

3. Faktor intenzity (IF)

Vzorec:

IF = NP / FTP

Interpretačné rozsahy:

IF rozsahÚroveň úsiliaPríklad cvičenia
< 0,75Obnova / JednoduchéAktívna zotavovacia jazda, zóna 1-2
0,75 - 0,85VytrvalosťDlhá stabilná jazda, aeróbny základ
0,85 - 0,95TempoTréning na sladkých miestach, tempové intervaly
0,95 - 1,05Prahová hodnotaFTP intervaly, časová námaha
1,05 - 1,15VO₂max5-minútové intervaly, pretek s kritériami
> 1,15AnaeróbneKrátke šprinty, útoky, MTB výbuchy

Príklad výpočtu:

Scenár:NP = 235W, FTP = 250W

IF = 235 / 250 =0,94

Výklad: Vysoké tempo / podprahové úsilie, udržateľné 2-3 hodiny

function calculateIF(normalizedPower, ftp) {
  return (normalizedPower / ftp).toFixed(2);
}

// Example:
const if_value = calculateIF(235, 250);
// Returns: 0.94

4.Index variability (VI)

Vzorec:

VI = NP / Priemerný výkon

Výklad podľa disciplíny:

DisciplínaTypický VIVýznam
Road TT / Steady Effort1,00 - 1,05Veľmi konzistentný výkon, optimálne tempo
Cestné preteky1.05 - 1.10Niektoré rázy, vo všeobecnosti stabilné
Kritérium1,10 - 1,20Časté zrýchlenie a útoky
Horský bicykel XC1,15 - 1,30+Vysoko variabilné, konštantné rázy

Príklad výpočtu:

Cestné preteky:NP = 240W, Priemerný výkon = 230W

VI = 240/230 =1.04(stále tempo)

MTB preteky:NP = 285 W, priemerný výkon = 235 W

VI = 285/235 =1.21(veľmi variabilné, nárazové úsilie)

function calculateVI(normalizedPower, averagePower) {
  return (normalizedPower / averagePower).toFixed(2);
}

// Example:
const vi_road = calculateVI(240, 230);  // Returns: 1.04
const vi_mtb = calculateVI(285, 235);   // Returns: 1.21

Critical Power & W' (Anaeróbna kapacita)

5. Kritický výkon (CP) - Lineárny model

Vzorec:

Čas = W' / (výkon - CP)
Preusporiadané: Výkon × Čas = CP × Čas + W'

Výpočet z viacerých snáh:

Vyžaduje 2-4 maximálne úsilie v rôznych časoch (napr. 3, 5, 12, 20 minút)

Príklad údajov:

TrvanieVýkon (W)Celková práca (kJ)
3 minúty (180 s)400 W72 kJ
5 minút (300 s)365 W109,5 kJ
12 minút (720 s)310 W223,2 kJ
20 minút (1200 s)285 W342 kJ

Použitie lineárnej regresie (práca = CP × čas + W):

  • CP = 270 W(sklon regresnej priamky)
  • W' = 18,5 kJ(y-prierez)

Implementácia JavaScriptu:

function calculateCP_Linear(efforts) {
  // efforts = [{duration: seconds, power: watts}, ...]

  const times = efforts.map(e => e.duration);
  const work = efforts.map(e => e.power * e.duration / 1000); // kJ

  // Linear regression: work = CP * time + W'
  const n = efforts.length;
  const sumT = times.reduce((a, b) => a + b, 0);
  const sumW = work.reduce((a, b) => a + b, 0);
  const sumTW = times.reduce((sum, t, i) => sum + t * work[i], 0);
  const sumTT = times.reduce((sum, t) => sum + t * t, 0);

  const CP = (n * sumTW - sumT * sumW) / (n * sumTT - sumT * sumT);
  const Wprime = (sumW - CP * sumT) / n;

  return {
    CP: Math.round(CP * 10) / 10,      // watts
    Wprime: Math.round(Wprime * 10) / 10  // kJ
  };
}

// Example usage:
const efforts = [
  {duration: 180, power: 400},
  {duration: 300, power: 365},
  {duration: 720, power: 310},
  {duration: 1200, power: 285}
];

const result = calculateCP_Linear(efforts);
// Returns: { CP: 270.0, Wprime: 18.5 }

6. W' Balance (W'bal) - Model diferenciálnej rovnice

Vzorce:

Výdavky (keď P > CP):
W'exp(t) = ∫(P(t) - CP) dt
Obnova (keď P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
kde τ = 546 × e^(-0,01 × ΔCP) + 316
a ΔCP = (CP - P(t))

Príklad zo skutočného sveta:

Špecifikácie pre cyklistov:CP = 270 W, W' = 18,5 kJ

Scenár 1 – tvrdý útok:

  • Rider sa zvýši na 400 W na 30 sekúnd
  • Výdaj W': (400 - 270) × 30 = 3 900 J = 3,9 kJ
  • Zostávajúci W'bal: 18,5 - 3,9 =14,6 kJ

Scenár 2 – Obnova:

  • Po útoku klesne na 200 W (70 W pod CP) na 2 minúty
  • ΔCP = 270 - 200 = 70 W
  • τ = 546 × e^(-0,01 × 70) + 316 = 588 sekúnd
  • Obnova za 120 s: 18,5 × (1 - e^(-120/588)) =Získaných 3,5 kJ
  • Nový W'bal: 14,6 + 3,5 =18,1 kJ

Implementácia JavaScriptu:

function calculateWbalance(powerData, CP, Wprime) {
  // powerData = array of {time: seconds, power: watts}
  let wbal = Wprime * 1000; // Convert to joules
  const wbalHistory = [];

  for (let i = 1; i < powerData.length; i++) {
    const dt = powerData[i].time - powerData[i-1].time;
    const power = powerData[i].power;

    if (power > CP) {
      // Expenditure above CP
      const expenditure = (power - CP) * dt;
      wbal -= expenditure;
    } else {
      // Recovery below CP
      const deltaCP = CP - power;
      const tau = 546 * Math.exp(-0.01 * deltaCP) + 316;
      const recovery = (Wprime * 1000 - wbal) * (1 - Math.exp(-dt / tau));
      wbal += recovery;
    }

    // Ensure W'bal doesn't exceed max or go negative
    wbal = Math.max(0, Math.min(wbal, Wprime * 1000));

    wbalHistory.push({
      time: powerData[i].time,
      wbal: wbal / 1000, // kJ
      percent: (wbal / (Wprime * 1000)) * 100
    });
  }

  return wbalHistory;
}

// Example usage:
const powerData = [
  {time: 0, power: 200},
  {time: 1, power: 210},
  // ... rest of ride data
];

const wbalHistory = calculateWbalance(powerData, 270, 18.5);
// Returns array of W'bal values over time

Tabuľka riadenia výkonnosti (PMC) pre cyklistiku

7. CTL, ATL, TSB výpočty

Vzorce (exponenciálne vážené kĺzavé priemery):

CTL_today = CTL_včera + (TSS_dnes - CTL_včera) / 42
ATL_today = ATL_yesterday + (TSS_today - ATL_yesterday) / 7
TSB_today = CTL_včera – ATL_včera

Definície metrík:

  • CTL (chronická tréningová záťaž):42-dňový exponenciálne vážený priemer – predstavuje kondíciu
  • ATL (Akútna tréningová záťaž):7-dňový exponenciálne vážený priemer – predstavuje únavu
  • TSB (tréningová rovnováha stresu):Forma = Fitness – Únava

Pracovný príklad (7-dňový tréningový blok):

deňTSSCTLATLTSBStav
Po10075,080,0-5,0Školenie
Ut5074,475,7-1.3zotavenie
St12075,582,0-6.5Tvrdý tréning
Št073,770,3+3,4Deň odpočinku
Pia8073,871,7+2,1Mierne
So15075,682,9-7.3Dlhá jazda
Slnko4074,876,8-2,0zotavenie

Výklad TSB:

Rozsah TSBStavAkcia
< -30Vysoké rizikoUpozornenie na pretrénovanie – znížte záťaž
-30 až -10Ťažký tréningBudovanie kondície, sledovanie regenerácie
-10 až +5OptimálneNormálna tréningová zóna
+5 až +15Pripravené na pretekyŠpičková forma – preteky tento víkend
> +25DetréningStrata kondície – zvýšenie záťaže

Implementácia JavaScriptu:

function calculatePMC(workouts) {
  // workouts = [{date: "YYYY-MM-DD", tss: number}, ...]
  let ctl = 0, atl = 0;
  const results = [];

  workouts.forEach(workout => {
    // Update CTL (42-day time constant)
    ctl = ctl + (workout.tss - ctl) / 42;

    // Update ATL (7-day time constant)
    atl = atl + (workout.tss - atl) / 7;

    // Calculate TSB (yesterday's CTL - today's ATL for traditional calculation)
    // For simplicity here using current values
    const tsb = 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,
      status: getTSBStatus(tsb)
    });
  });

  return results;
}

function getTSBStatus(tsb) {
  if (tsb < -30) return "High Risk";
  if (tsb < -10) return "Training Hard";
  if (tsb < 5) return "Optimal";
  if (tsb < 15) return "Race Ready";
  return "Detraining";
}

// Example usage:
const workouts = [
  {date: "2025-01-01", tss: 100},
  {date: "2025-01-02", tss: 50},
  {date: "2025-01-03", tss: 120},
  // ... more workouts
];

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

Metriky pomeru výkonu k hmotnosti a stúpania

8.Pomer výkonu a hmotnosti

Vzorec:

W/kg = výkon (watty) / telesná hmotnosť (kg)

FTP W/kg Referenčné hodnoty:

úroveňMuži W/kgŽena W/kgKategória
Rekreačné2,5 - 3,52,0 - 3,0Fitness jazdec
Konkurenčné3,5 - 4,53,0 - 4,0Mačka 3-4, pretekár vekovej kategórie
Pokročilé4,5 - 5,54,0 - 5,0Mačka 1-2, silný amatér
Elitný amatér5,5 - 6,05,0 - 5,5národnej úrovni
Profesionálny6,0 - 7,0+5,5 - 6,5+Svetové turné, Grand Tour GC

Príklad výpočtu:

Scenár:Cyklista s FTP = 275W, telesná hmotnosť = 70kg

W/kg = 275 / 70 =3,93 W/kg

Výklad: Konkurenčná úroveň, schopný v kopcovitých pretekoch

function calculateWattsPerKg(power, bodyMassKg) {
  return (power / bodyMassKg).toFixed(2);
}

// Example:
const wpkg = calculateWattsPerKg(275, 70);
// Returns: 3.93

9. VAM (Velocità Ascensionale Media)

Vzorec:

VAM (m/h) = prevýšenie (m) / čas (hodiny)

VAM benchmarky:

VAM (m/h)úroveňPríklad
600 – 900RekreačnéKlubový jazdec na miestnom stúpaní
900 – 1200KonkurenčnéDobrý amatér na Alpe d'Huez
1200 – 1500Elitný amatérHorolezec na národnej úrovni
1500 – 1800ProfesionálnyDomáce svetové turné
> 1800Víťaz Grand TourPogačar, Vingegaard na kľúčových stúpaniach

Príklad výpočtu:

Scenár:Výstup na Alpe d'Huez

  • Prevýšenie: 1100 metrov
  • Čas: 55 minút = 0,917 hodiny
  • VAM = 1100 / 0,917 =1200 m/h

Výklad: Výkon lezenia na súťažnej úrovni

function calculateVAM(elevationGainMeters, timeMinutes) {
  const hours = timeMinutes / 60;
  return Math.round(elevationGainMeters / hours);
}

// Example:
const vam = calculateVAM(1100, 55);
// Returns: 1200 m/h

10. Odhad VAM na W/kg

Vzorec:

W/kg ≈ VAM (m/h) / 100 / (gradient % + 3)

Príklad výpočtu:

Scenár:Stúpanie s priemerným stúpaním 8 %, VAM = 1200 m/h

W/kg = 1 200 / 100 / (8 + 3)

W/kg = 12/11 =4,36 W/kg

Krížová kontrola: So 70 kg jazdcom → 305 W trvalý výkon pri stúpaní

function estimateWkgFromVAM(vam, gradientPercent) {
  return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}

// Example:
const wkg = estimateWkgFromVAM(1200, 8);
// Returns: 4.36

Aerodynamická rovnica výkonu

11. Celkové požiadavky na energiu

Kompletný vzorec:

P_total = P_aero + P_gravitácia + P_rolling + P_kinetic

Vzorce komponentov:

Aerodynamický odpor:
P_aero = CdA × 0,5 × ρ × V³
Gravitácia (lezenie):
P_gravitácia = m × g × sin (θ) × V
Valivý odpor:
P_rolling = Crr × m × g × cos (θ) × V
Kinetika (zrýchlenie):
P_kinetické = m × a × V

Konštanty a premenné:

  • CdA= koeficient aerodynamického odporu × čelná plocha (m²)
    • Typické kryty pre cestné bicykle: 0,35-0,40 m²
    • Poklesy: 0,32-0,37 m²
    • Poloha TT: 0,20-0,25 m²
  • ρ= Hustota vzduchu (1,225 kg/m³ na hladine mora, 15°C)
  • V= Rýchlosť (m/s)
  • m= Celková hmotnosť (jazdec + bicykel, kg)
  • g= Gravitácia (9,81 m/s²)
  • θ= Uhol prechodu (prevedené radiány alebo stupne)
  • Crr= Koeficient valivého odporu (~0,004 pre dobré cestné pneumatiky)
  • a= zrýchlenie (m/s²)

Spracovaný príklad (rovina TT):

Scenár:

  • Rýchlosť: 40 km/h = 11,11 m/s
  • CdA: 0,22 m² (dobrá poloha TT)
  • Celková hmotnosť: 75 kg (jazdec) + 8 kg (bicykel) = 83 kg
  • Rovná cesta (sklon = 0°)
  • Konštantná rýchlosť (zrýchlenie = 0)

Výpočet:

  1. P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185 W
  2. P_gravitácia= 0W (rovná cesta)
  3. P_rolling= 0,004 × 83 × 9,81 × 11,11 =36 W
  4. P_kinetický= 0W (konštantná rýchlosť)
  5. P_total= 185 + 0 + 36 + 0 =221 W

Výklad: Potrebujete 221 W na udržanie rýchlosti 40 km/h v polohe TT na rovnej ceste

Implementácia JavaScriptu:

function calculatePowerRequired(params) {
  const {
    velocityKph,
    CdA = 0.32,              // m²
    rho = 1.225,             // kg/m³
    mass = 83,               // kg (rider + bike)
    gradientPercent = 0,     // %
    Crr = 0.004,             // rolling resistance
    accelerationMps2 = 0     // m/s²
  } = params;

  // Convert velocity to m/s
  const V = velocityKph / 3.6;

  // Convert gradient to angle
  const theta = Math.atan(gradientPercent / 100);

  // Calculate each component
  const P_aero = CdA * 0.5 * rho * Math.pow(V, 3);
  const P_gravity = mass * 9.81 * Math.sin(theta) * V;
  const P_rolling = Crr * mass * 9.81 * Math.cos(theta) * V;
  const P_kinetic = mass * accelerationMps2 * V;

  return {
    total: Math.round(P_aero + P_gravity + P_rolling + P_kinetic),
    aero: Math.round(P_aero),
    gravity: Math.round(P_gravity),
    rolling: Math.round(P_rolling),
    kinetic: Math.round(P_kinetic)
  };
}

// Example: TT at 40 km/h
const power_tt = calculatePowerRequired({
  velocityKph: 40,
  CdA: 0.22,
  mass: 83,
  gradientPercent: 0
});
// Returns: { total: 221, aero: 185, gravity: 0, rolling: 36, kinetic: 0 }

// Example: 8% climb at 15 km/h
const power_climb = calculatePowerRequired({
  velocityKph: 15,
  CdA: 0.38,
  mass: 75,
  gradientPercent: 8
});
// Returns: { total: 265, aero: 27, gravity: 244, rolling: 11, kinetic: 0 }

Pomocné funkcie

Pomôcky na konverziu jednotiek

Implementácia JavaScriptu:

// Time conversions
function hoursToSeconds(hours) {
  return hours * 3600;
}

function minutesToSeconds(minutes) {
  return minutes * 60;
}

function secondsToHours(seconds) {
  return seconds / 3600;
}

function formatDuration(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')}`;
}

// Speed conversions
function kphToMps(kph) {
  return kph / 3.6;
}

function mpsToKph(mps) {
  return mps * 3.6;
}

// Energy conversions
function joulesTo kJ(joules) {
  return joules / 1000;
}

function kJToJoules(kJ) {
  return kJ * 1000;
}

function wattsToKJ(watts, durationSeconds) {
  return (watts * durationSeconds) / 1000;
}

// Examples:
formatDuration(7265);        // Returns: "2:01:05"
kphToMps(40);                // Returns: 11.11 m/s
wattsToKJ(250, 3600);        // Returns: 900 kJ (1 hour at 250W)

Implementačné zdroje

Všetky vzorce na tejto stránke sú pripravené na výrobu a overené na základe vedeckej literatúry a skutočných údajov merača výkonu. Použite ich na vlastné analytické nástroje, overenie alebo hlbšie pochopenie tréningových výpočtov založených na výkone.

💡 Osvedčené postupy

  • Overiť vstupy:Skontrolujte primerané rozsahy výkonu (0-2000 W), kladné trvanie
  • Puzdrá na okraje rukoväte:Delenie nulou, údaje null/nedefinované, chýba FTP
  • Vhodne zaokrúhlite:CTL/ATL/TSB na 1 desatinné miesto, TSS na celé číslo, W/kg na 2 desatinné miesta
  • Presnosť obchodu:Zachovajte plnú presnosť v databáze, zaokrúhlite iba na zobrazenie
  • Časové pásma:Pri viacdennej analýze dôsledne zaobchádzajte s časom UTC a miestnym časom
  • Kalibrácia merača výkonu:Pripomeňte používateľom pred jazdou nulový posun
  • Overenie FTP:Označte podozrivé hodnoty FTP (>500 W alebo <100 W pre dospelých)
  • Dôkladne otestujte:Na overenie výpočtov použite súbory jázd, o ktorých viete, že sú dobré

Expertly Reviewed by

This content has been written and reviewed by a sports data metrics expert to ensure technical accuracy and adherence to the latest sports science methodologies.

Vzorce pre výkon v plávaní: Výpočty CSS, TSS, CTL/ATL

Kompletné matematické vzorce pre plaveckú analytiku. Naučte sa ručne vypočítavať FTP, sTSS, CTL, ATL, TSB. Obsahuje vyriešené príklady, odvodenia a vysvetlenie

  • 2026-03-24
  • vzorce plávania · výpočet CSS · vzorec TSS · tréningová matematika
  • Bibliografia