Formule biciklističke snage

Matematička osnova metrike analitike bicikla

Vodič za implementaciju

Ova stranica nudi formule za kopiranje i lijepljenje i metode izračuna korak po korak za sve mjerne podatke Bike Analyticsa. Koristite ih za prilagođene implementacije, provjeru ili dublje razumijevanje obuke temeljene na snazi.

⚠️ Napomene o implementaciji

  • Sve vrijednosti snage u vatima (W), vrijeme u sekundama osim ako nije navedeno
  • FTP i CP su pragovi specifični za pojedinca—nema univerzalnih vrijednosti
  • Uvijek provjerite unose za razumne raspone (0-2000 W tipično)
  • Rukovanje rubnim slučajevima (dijeljenje s nulom, negativna snaga)
  • Za točnost podataka o snazi potrebni su intervali snimanja od 1 sekunde

Osnovne metrike performansi biciklizma

1. Ocjena stresa tijekom treninga (TSS)

Formula:

TSS = (trajanje_sekundi × NP × IF) / (FTP × 3600) × 100
gdje je IF = NP / FTP

Primjer rada:

Scenarij:2-satna vožnja, NP = 235 W, FTP = 250 W

  1. Izračunajte IF: IF = 235 / 250 = 0,94
  2. Trajanje u sekundama: 2 sata × 3600 = 7200 sekundi
  3. TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
  4. TSS = 1.590.720 / 900.000 × 100 =176.7 ZAŠTITI1X

Tumačenje: Teška trening vožnja (>150 TSS), očekujte 2-3 dana oporavka

Implementacija JavaScripta:

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. Normalizirana snaga (NP)

Algoritam (tekući prosjek od 30 sekundi):

1. Izračunajte tekući prosjek snage od 30 sekundi za cijelu vožnju
2. Podignite vrijednost svakih 30 sekundi na 4. potenciju
3. Uzmite prosjek svih ovih ^4 vrijednosti
4. Izvadite četvrti korijen tog prosjeka
NP = ⁴√ (prosjek [30s_prosjek^4])

Zašto 4. moć?

Kvartični (4. potencija) odnos odražava nelinearnu fiziološku cijenu varijabilnih napora. Vožnja s valovima i povratima košta više energije nego stalna snaga u istom prosjeku.

Primjer:

  • Stabilna vožnja: 200 W tijekom 1 sata → NP = 200 W, prosjek = 200 W
  • Varijabilna vožnja: naizmjenično 300W/100W → prosjek = 200W, NP = 225W

Ista prosječna snaga, ali promjenjiva vožnja ima 12% veći NP zbog fizioloških troškova prenapona

Implementacija JavaScripta:

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 intenziteta (IF)

Formula:

IF = NP / FTP

Rasponi tumačenja:

Raspon IFRazina naporaPrimjer vježbanja
< 0,75Oporavak / JednostavanAktivna vožnja za oporavak, Zona 1-2
0,75 - 0,85IzdržljivostDuga mirna vožnja, aerobna baza
0,85 - 0,95TempoSweet spot trening, tempo intervali
0,95 - 1,05PragFTP intervali, trud u vožnji na vrijeme
1.05 - 1.15ZAŠTITI5XIntervali od 5 minuta, kriterijska utrka
> 1.15AnaerobniKratki sprintevi, napadi, MTB rafali

Primjer izračuna:

Scenarij:NP = 235W, FTP = 250W

ZAŠTITI15X = 235 / 250 =0,94

Tumačenje: Visok tempo / napor ispod praga, održiv 2-3 sata

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

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

4.Indeks varijabilnosti (VI)

Formula:

VI = NP / prosječna snaga

Tumačenje po disciplinama:

DisciplinaTipično VIZnačenje
Cesta TT / Steady Effort1.00 - 1.05Vrlo postojana snaga, optimalan tempo
Cestovne utrke1.05 - 1.10Neki udari, općenito stabilni
Kriterij1.10 - 1.20Česta ubrzanja i napadi
Brdski bicikl XC1,15 - 1,30+Vrlo promjenjivi, konstantni valovi

Primjer izračuna:

Cestovna utrka:NP = 240 W, prosječna snaga = 230 W

VI = 240 / 230 =1.04(ujednačen tempo)

MTB utrka:NP = 285 W, prosječna snaga = 235 W

VI = 285 / 235 =1.21(vrlo promjenjivi, rafalni napori)

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

Kritična snaga & W' (anaerobni kapacitet)

5. Kritična snaga (CP) - linearni model

Formula:

Vrijeme = W' / (snaga - CP)
Preuređeno: snaga × vrijeme = CP × vrijeme + W'

Izračun iz više napora:

Zahtijeva 2-4 maksimalna napora u različitim trajanjima (npr. 3, 5, 12, 20 minuta)

Primjer podataka:

TrajanjeSnaga (W)Ukupni rad (kJ)
3 min (180 s)400 W72 kJ
5 min (300 s)365 W109,5 kJ
12 min (720 s)310 W223,2 kJ
20 min (1200 s)285 W342 kJ

Korištenje linearne regresije (rad = CP × vrijeme + W'):

  • CP = 270W(nagib regresijske linije)
  • W' = 18,5 kJ(y-odsječak)

Implementacija JavaScripta:

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' bilanca (W'bal) - model diferencijalne jednadžbe

Formule:

Rashod (kada je P > CP):
W'exp(t) = ∫(P(t) - CP) dt
Oporavak (kada je P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
gdje je τ = 546 × e^(-0,01 × ΔCP) + 316
i ΔCP = (CP - P(t))

Primjer iz stvarnog svijeta:

Specifikacije biciklista:CP = 270W, W' = 18,5 kJ

Scenarij 1 - Teški napad:

  • Vozač raste na 400 W na 30 sekundi
  • Potrošnja W': (400 - 270) × 30 = 3900 J = 3,9 kJ
  • Preostalo W'bal: 18,5 - 3,9 =14,6 kJ

Scenarij 2 - Oporavak:

  • Nakon napada, pada na 200 W (70 W ispod CP) na 2 minute
  • ΔCP = 270 - 200 = 70W
  • τ = 546 × e^(-0,01 × 70) + 316 = 588 sekundi
  • Oporavak u 120 s: 18,5 × (1 - e^(-120/588)) =Oporavljeno je 3,5 kJ
  • Novi W'bal: 14,6 + 3,5 =18,1 kJ

Implementacija JavaScripta:

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

Tablica upravljanja učinkom (PMC) za biciklizam

7. CTL, ATL, TSB izračuni

Formule (eksponencijalno ponderirani pomični prosjeci):

CTL_danas = CTL_jučer + (TSS_danas - CTL_jučer) / 42
ATL_danas = ATL_jučer + (TSS_danas - ATL_jučer) / 7
TSB_danas = CTL_jučer - ATL_jučer

Definicije mjernih podataka:

  • CTL (kronično opterećenje tijekom treninga):42-dnevni eksponencijalno ponderirani prosjek - predstavlja fitness
  • ATL (akutno opterećenje tijekom treninga):7-dnevni eksponencijalno ponderirani prosjek - predstavlja umor
  • TSB (Ravnoteža stresa pri vježbanju):Forma = kondicija - umor

Primjer rada (7-dnevni blok obuke):

danZAŠTITI1XCTLATLTSBStatus
pon10075.080.0-5,0Trening
uto5074.475.7-1.3Oporavak
sri12075.582.0-6.5Težak trening
čet073.770.3+3,4Dan odmora
pet8073.871.7+2,1Umjereno
sub15075.682.9-7.3Duga vožnja
sunce4074.876.8-2,0Oporavak

TSB tumačenje:

Raspon TSBStatusAkcija
< -30Visoki rizikUpozorenje na pretreniranost - smanjite opterećenje
-30 do -10Naporan treningIzgradnja kondicije, praćenje oporavka
-10 do +5OptimalnoNormalna zona treninga
+5 do +15Spreman za utrkuVrhunac forme - utrka ovog vikenda
> +25DetreniranjeGubitak kondicije - povećanje opterećenja

Implementacija JavaScripta:

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

Mjerni podaci o omjeru snage i težine i penjanja

8.Omjer snage i težine

Formula:

W/kg = snaga (vati) / tjelesna masa (kg)

FTP W/kg Referentne vrijednosti:

RazinaMuški W/kgŽenski W/kgKategorija
Rekreativno2,5 - 3,52,0 - 3,0Kondicijski jahač
Natjecateljski3,5 - 4,53,0 - 4,0Cat 3-4, dobna skupina trkač
Napredno4,5 - 5,54,0 - 5,0Mačka 1-2, jaki amater
Elitni amater5,5 - 6,05,0 - 5,5Nacionalna razina
Profesionalni6,0 - 7,0+5,5 - 6,5+Svjetska turneja, Velika turneja GC

Primjer izračuna:

Scenarij:Biciklist s FTP = 275 W, tjelesna masa = 70 kg

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

Tumačenje: Natjecateljska razina, sposoban za brdske utrke

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

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

9. VAM (Velocità Ascensionale Media)

Formula:

VAM (m/h) = uspon (m) / vrijeme (sati)

VAM referentne vrijednosti:

VAM (m/h)RazinaPrimjer
600 - 900 (prikaz, stručni).RekreativnoKlubski vozač na lokalnom usponu
900 - 1200 (prikaz, stručni).NatjecateljskiDobar amater na Alpe d'Huez
1200 - 1500 (prikaz, stručni).Elitni amaterNacionalni penjač
1500 - 1800 (prikaz, stručni).ProfesionalniDomaća svjetska turneja
> 1800Pobjednik Grand TouraPogačar, Vingegaard na ključnim usponima

Primjer izračuna:

Scenarij:Uspon na Alpe d'Huez

  • Visinska razlika: 1100 metara
  • Vrijeme: 55 minuta = 0,917 sati
  • VAM = 1100 / 0,917 =1200 m/h

Tumačenje: Penjačka izvedba na natjecateljskoj razini

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

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

10. Procjena VAM u W/kg

Formula:

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

Primjer izračuna:

Scenarij:Uspon s prosječnim usponom od 8%, VAM = 1200 m/h

W/kg = 1200 / 100 / (8 + 3)

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

Unakrsna provjera: s vozačem od 70 kg → 305 W stalne snage pri usponu

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

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

Jednadžba aerodinamičke snage

11. Ukupni zahtjevi za napajanje

Kompletna formula:

P_ukupno = P_aero + P_gravitacija + P_kotrljanje + P_kinetika

Formule komponenti:

Aerodinamički otpor:
P_aero = CdA × 0,5 × ρ × V³
Gravitacijski (penjanje):
P_gravitacija = m × g × sin(θ) × V
Otpor kotrljanja:
P_kotrljanje = Crr × m × g × cos(θ) × V
Kinetičko (ubrzanje):
P_kinetički = m × a × V

Konstante i varijable:

  • CdA= Koeficijent otpora × čeona površina (m²)
    • Tipične nape za cestovne bicikle: 0,35-0,40 m²
    • Kapljice: 0,32-0,37 m²
    • TT položaj: 0,20-0,25 m²
  • ρ= Gustoća zraka (1,225 kg/m³ na razini mora, 15°C)
  • V= Brzina (m/s)
  • m= Ukupna masa (vozač + bicikl, kg)
  • g= Gravitacija (9,81 m/s²)
  • θ= Kut gradijenta (radijani ili stupnjevi pretvoreni)
  • Crr= Koeficijent otpora kotrljanja (~0,004 za dobre cestovne gume)
  • a= Ubrzanje (m/s²)

Primjer rada (ravna cesta TT):

Scenarij:

  • Brzina: 40 km/h = 11,11 m/s
  • CdA: 0,22 m² (dobar TT položaj)
  • Ukupna masa: 75 kg (vozač) + 8 kg (bicikl) = 83 kg
  • Ravna cesta (nagib = 0°)
  • Konstantna brzina (ubrzanje = 0)

Izračun:

  1. P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185W
  2. P_gravitacija= 0W (ravna cesta)
  3. P_kotrljanje= 0,004 × 83 × 9,81 × 11,11 =36W
  4. P_kinetički= 0W (konstantna brzina)
  5. P_ukupno= 185 + 0 + 36 + 0 =221W

Tumačenje: Potrebno je 221W za održavanje 40 km/h u TT položaju na ravnoj cesti

Implementacija JavaScripta:

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 }

Pomoćne funkcije

Pomoćni programi za pretvorbu jedinica

Implementacija JavaScripta:

// 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)

Resursi za implementaciju

Sve formule na ovoj stranici spremne su za proizvodnju i provjerene prema znanstvenoj literaturi i podacima iz stvarnog svijeta mjerača snage. Upotrijebite ih za prilagođene analitičke alate, provjeru ili dublje razumijevanje kalkulacija na temelju snage.

💡 Najbolji primjeri iz prakse

  • Potvrdite unose:Provjerite razumne raspone snage (0-2000 W), pozitivna trajanja
  • Rukovati rubnim slučajevima:Dijeljenje s nulom, podaci nulti/nedefinirani, nedostaje FTP
  • Zaokruži na odgovarajući način:CTL/ATL/TSB na 1 decimalu, TSS na cijeli broj, W/kg na 2 decimale
  • Preciznost skladištenja:Održavajte punu preciznost u bazi podataka, zaokružite samo za prikaz
  • vremenske zone:Za višednevnu analizu dosljedno upravljajte UTC-om u odnosu na lokalno vrijeme
  • Kalibracija mjerača snage:Podsjetite korisnike na nulti pomak prije vožnje
  • Provjera valjanosti FTP:Označite sumnjive FTP vrijednosti (>500W ili <100W za odrasle)
  • Temeljito testirajte:Upotrijebite poznato ispravne datoteke za provjeru izračuna

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.

Formule Plivačkih Performansi: Izračuni CSS, TSS, CTL/ATL

Kompletne matematičke formule za plivačku analitiku. Naučite ručno izračunati FTP, sTSS, CTL, ATL, TSB. Uključuje riješene primjere, izvode i objašnjenje.

  • 2026-03-24
  • formule za plivanje · izračunavanje CSS · TSS formula · matematika treninga
  • Bibliografija