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:
Spracovaný príklad:
Scenár:2-hodinová jazda, NP = 235W, FTP = 250W
- Vypočítajte IF: IF = 235 / 250 = 0,94
- Trvanie v sekundách: 2 hodiny × 3600 = 7200 sekúnd
- TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
- 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: 1772. Normalizovaný výkon (NP)
Algoritmus (30-sekundový kĺzavý priemer):
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 watts3. Faktor intenzity (IF)
Vzorec:
Interpretačné rozsahy:
| IF rozsah | Úroveň úsilia | Príklad cvičenia |
|---|---|---|
| < 0,75 | Obnova / Jednoduché | Aktívna zotavovacia jazda, zóna 1-2 |
| 0,75 - 0,85 | Vytrvalosť | Dlhá stabilná jazda, aeróbny základ |
| 0,85 - 0,95 | Tempo | Tréning na sladkých miestach, tempové intervaly |
| 0,95 - 1,05 | Prahová hodnota | FTP intervaly, časová námaha |
| 1,05 - 1,15 | VO₂max | 5-minútové intervaly, pretek s kritériami |
| > 1,15 | Anaeróbne | Krá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.944.Index variability (VI)
Vzorec:
Výklad podľa disciplíny:
| Disciplína | Typický VI | Význam |
|---|---|---|
| Road TT / Steady Effort | 1,00 - 1,05 | Veľmi konzistentný výkon, optimálne tempo |
| Cestné preteky | 1.05 - 1.10 | Niektoré rázy, vo všeobecnosti stabilné |
| Kritérium | 1,10 - 1,20 | Časté zrýchlenie a útoky |
| Horský bicykel XC | 1,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.21Critical Power & W' (Anaeróbna kapacita)
5. Kritický výkon (CP) - Lineárny model
Vzorec:
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:
| Trvanie | Výkon (W) | Celková práca (kJ) |
|---|---|---|
| 3 minúty (180 s) | 400 W | 72 kJ |
| 5 minút (300 s) | 365 W | 109,5 kJ |
| 12 minút (720 s) | 310 W | 223,2 kJ |
| 20 minút (1200 s) | 285 W | 342 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:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
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 timeTabuľka riadenia výkonnosti (PMC) pre cyklistiku
7. CTL, ATL, TSB výpočty
Vzorce (exponenciálne vážené kĺzavé priemery):
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ň | TSS | CTL | ATL | TSB | Stav |
|---|---|---|---|---|---|
| Po | 100 | 75,0 | 80,0 | -5,0 | Školenie |
| Ut | 50 | 74,4 | 75,7 | -1.3 | zotavenie |
| St | 120 | 75,5 | 82,0 | -6.5 | Tvrdý tréning |
| Št | 0 | 73,7 | 70,3 | +3,4 | Deň odpočinku |
| Pia | 80 | 73,8 | 71,7 | +2,1 | Mierne |
| So | 150 | 75,6 | 82,9 | -7.3 | Dlhá jazda |
| Slnko | 40 | 74,8 | 76,8 | -2,0 | zotavenie |
Výklad TSB:
| Rozsah TSB | Stav | Akcia |
|---|---|---|
| < -30 | Vysoké riziko | Upozornenie na pretrénovanie – znížte záťaž |
| -30 až -10 | Ťažký tréning | Budovanie kondície, sledovanie regenerácie |
| -10 až +5 | Optimálne | Normálna tréningová zóna |
| +5 až +15 | Pripravené na preteky | Špičková forma – preteky tento víkend |
| > +25 | Detréning | Strata 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 dayMetriky pomeru výkonu k hmotnosti a stúpania
8.Pomer výkonu a hmotnosti
Vzorec:
FTP W/kg Referenčné hodnoty:
| úroveň | Muži W/kg | Žena W/kg | Kategória |
|---|---|---|---|
| Rekreačné | 2,5 - 3,5 | 2,0 - 3,0 | Fitness jazdec |
| Konkurenčné | 3,5 - 4,5 | 3,0 - 4,0 | Mačka 3-4, pretekár vekovej kategórie |
| Pokročilé | 4,5 - 5,5 | 4,0 - 5,0 | Mačka 1-2, silný amatér |
| Elitný amatér | 5,5 - 6,0 | 5,0 - 5,5 | národnej úrovni |
| Profesionálny | 6,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.939. VAM (Velocità Ascensionale Media)
Vzorec:
VAM benchmarky:
| VAM (m/h) | úroveň | Príklad |
|---|---|---|
| 600 – 900 | Rekreačné | Klubový jazdec na miestnom stúpaní |
| 900 – 1200 | Konkurenčné | Dobrý amatér na Alpe d'Huez |
| 1200 – 1500 | Elitný amatér | Horolezec na národnej úrovni |
| 1500 – 1800 | Profesionálny | Domáce svetové turné |
| > 1800 | Víťaz Grand Tour | Pogač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/h10. Odhad VAM na W/kg
Vzorec:
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.36Aerodynamická rovnica výkonu
11. Celkové požiadavky na energiu
Kompletný vzorec:
Vzorce komponentov:
P_aero = CdA × 0,5 × ρ × V³
P_gravitácia = m × g × sin (θ) × V
P_rolling = Crr × m × g × cos (θ) × V
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:
- P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185 W
- P_gravitácia= 0W (rovná cesta)
- P_rolling= 0,004 × 83 × 9,81 × 11,11 =36 W
- P_kinetický= 0W (konštantná rýchlosť)
- 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é
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
