Dviračių jėgos formulės

Matematinis dviračių analizės metrikos pagrindas

Įgyvendinimo vadovas

Šiame puslapyje pateikiamos visos Bike Analytics metrikos kopijavimo ir įklijavimo formulės ir nuoseklūs skaičiavimo metodai. Naudokite juos tinkintam diegimui, patikrinimui ar gilesniam galia pagrįsto mokymo supratimui.

⚠️ Diegimo pastabos

  • Visos galios vertės vatais (W), laikas sekundėmis, jei nenurodyta
  • FTP ir CP yra individualūs slenksčiai – nėra universalių verčių
  • Visada patvirtinkite įvestis protingiems diapazonams (paprastai 0–2000 W)
  • Tvarkyti kraštinius atvejus (dalijimas iš nulio, neigiama galia)
  • Galios duomenų tikslumui reikia 1 sekundės įrašymo intervalų

Pagrindinės dviračių našumo metrikos

1. Treniruotės streso balas (TSS)

Formulė:

TSS = (trukmė_sekundės × NP × IF) / (FTP × 3600) × 100
kur IF = NP / FTP

Veikęs pavyzdys:

Scenarijus:2 valandos važiavimo, NP = 235 W, FTP = 250 W

  1. Apskaičiuokite IF: IF = 235 / 250 = 0,94
  2. Trukmė sekundėmis: 2 valandos × 3600 = 7200 sekundžių
  3. TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
  4. TSS = 1 590 720 / 900 000 × 100 =176.7 TSS

Aiškinimas: Sunkus treniruočių važiavimas (>150 TSS), tikimasi 2-3 dienų atsigavimo

„JavaScript“ diegimas:

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. Normalizuota galia (NP)

Algoritmas (30 sekundžių slenkamasis vidurkis):

1. Apskaičiuokite 30 sekundžių vidutinę viso važiavimo galią
2. Kiekvieną 30 sekundžių reikšmę padidinkite iki 4 laipsnio
3. Paimkite visų šių ^4 reikšmių vidurkį
4. Paimkite 4-ąją šio vidurkio šaknį
NP = ⁴√ ([30s_avg^4] vidurkis)

Kodėl 4-oji galia?

Kvartinis (4 laipsnio) ryšys atspindi netiesinę fiziologinę kintamų pastangų kainą. Važiavimas su viršįtampiais ir atsistatymais kainuoja daugiau energijos nei pastovi galia esant tokiam pačiam vidurkiui.

Pavyzdys:

  • Pastovus važiavimas: 200 W 1 valandą → NP = 200 W, vidutinė = 200 W
  • Kintamasis važiavimas: kintamoji 300 W / 100 W → vidutinė = 200 W, NP = 225 W

Ta pati vidutinė galia, bet kintamo važiavimo NP yra 12% didesnis dėl fiziologinių viršįtampių sąnaudų

„JavaScript“ diegimas:

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. Intensity Factor (IF)

Formulė:

IF = NP / FTP

Interpretacijos diapazonai:

IF diapazonasPastangų lygisTreniruotės pavyzdys
< 0,75Atkūrimas / LengvasAktyvus atsigavimo važiavimas, 1-2 zona
0,75 - 0,85IštvermėIlgas pastovus važiavimas, aerobinė bazė
0,85 - 0,95TempasSweet spot treniruotės, tempo intervalai
0,95 - 1,05SlenkstisFTP intervalai, laiko bandymo pastangos
1,05 - 1,15VO₂max5 minučių intervalai, kriterinės lenktynės
> 1.15AnaerobinisTrumpi sprintai, atakos, MTB sprogimai

Skaičiavimo pavyzdys:

Scenarijus:NP = 235 W, FTP = 250 W

IF = 235 / 250 =0,94

Aiškinimas: Didelis tempas / pastangos žemiau slenksčio, išliekančios 2-3 valandas

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

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

4.Kintamumo indeksas (VI)

Formulė:

VI = NP / vidutinė galia

Interpretacija pagal discipliną:

DrausmėTipiškas VIReikšmė
Kelių TT / Stabilios pastangos1.00 - 1.05 valLabai pastovi galia, optimalus tempas
Plento lenktynės1,05 - 1,10Kai kurie šuoliai, paprastai pastovūs
Kriterijus1,10 - 1,20Dažni pagreičiai ir atakos
Kalnų dviratis XC1,15 - 1,30+Labai kintantys, nuolatiniai šuoliai

Skaičiavimo pavyzdys:

Plento lenktynės:NP = 240 W, vidutinė galia = 230 W

VI = 240 / 230 =1.04(tolygus tempas)

MTB lenktynės:NP = 285 W, vidutinė galia = 235 W

VI = 285 / 235 =1.21(labai kintamos, intensyvios pastangos)

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

Kritinė galia ir W' (anaerobinis pajėgumas)

5. Kritinė galia (CP) – tiesinis modelis

Formulė:

Laikas = W' / (galia – CP)
Pertvarkyta: galia × laikas = CP × laikas + W'

Skaičiavimas iš kelių pastangų:

Reikia 2–4 maksimalių pastangų skirtingomis trukmėmis (pvz., 3, 5, 12, 20 minučių)

Duomenų pavyzdys:

TrukmėGalia (W)Visas darbas (kJ)
3 min (180s)400W72 kJ
5 min (300 sek.)365W109,5 kJ
12 min (720 sek.)310W223,2 kJ
20 min (1200 sek.)285W342 kJ

Naudojant tiesinę regresiją (darbas = CP × laikas + W'):

  • CP = 270W(regresijos linijos nuolydis)
  • W' = 18,5 kJ(y pertrauka)

„JavaScript“ diegimas:

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) – diferencialinės lygties modelis

Formulės:

Išlaidos (kai P > CP):
W'exp(t) = ∫(P(t) - CP) dt
Atkūrimas (kai P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
kur τ = 546 × e^(-0,01 × ΔCP) + 316
ir ΔCP = (CP – P(t))

Realaus pasaulio pavyzdys:

Dviratininko specifikacijos:CP = 270 W, W' = 18,5 kJ

1 scenarijus – sunkus puolimas:

  • Rider padidina galią iki 400 W 30 sekundžių
  • W' išlaidos: (400–270) × 30 = 3 900 J = 3,9 kJ
  • Likęs W'bal: 18,5 - 3,9 =14,6 kJ

2 scenarijus – atkūrimas:

  • Po atakos nukrenta iki 200 W (70 W žemiau CP) 2 minutes
  • ΔCP = 270 - 200 = 70 W
  • τ = 546 × e^(-0,01 × 70) + 316 = 588 sekundės
  • Atkūrimas per 120 sek.: 18,5 × (1 - e^(-120/588)) =Atsigavo 3,5 kJ
  • Naujas W'bal: 14,6 + 3,5 =18,1 kJ

„JavaScript“ diegimas:

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

Našumo valdymo diagrama (PMC), skirta važiavimui dviračiu

7. CTL, ATL, TSB skaičiavimai

Formulės (eksponentiškai svertiniai slenkamieji vidurkiai):

CTL_today = CTL_yesterday + (TSS_today - CTL_yesterday) / 42
ATL_today = ATL_vakar + (TSS_today - ATL_yesterday) / 7
TSB_today = CTL_yesterday - ATL_yesterday

Metrikos apibrėžimai:

  • CTL (lėtinė treniruočių apkrova):42 dienų eksponentinis svertinis vidurkis – rodo tinkamumą
  • ATL (ūmi treniruočių apkrova):7 dienų eksponentiškai svertinis vidurkis – rodo nuovargį
  • TSB (treniruočių streso balansas):Forma = Fitnesas – Nuovargis

Veiktas pavyzdys (7 dienų mokymo blokas):

DienaTSSCTLATLTSBBūsena
Pirm10075,080,0-5.0Treniruotės
antradienis5074.475.7-1.3Atsigavimas
trečia12075.582,0-6.5Sunkus mokymas
Ketvirtadienis073.770.3+3.4Poilsio diena
penk8073.871.7+2.1Vidutinis
Šešt15075.682.9-7.3Ilgas važiavimas
Saulė4074.876.8-2,0Atsigavimas

TSB aiškinimas:

TSB diapazonasBūsenaVeiksmas
< -30Didelė rizikaPerspėjimas apie pervargimą – sumažinkite krūvį
-30 iki -10Sunkios treniruotėsKurkite fitnesą, stebėkite atsigavimą
-10 iki +5OptimalusĮprasta treniruočių zona
+5 iki +15Pasiruošę lenktynėmsAukščiausia forma – lenktynės šį savaitgalį
> +25TreniravimasisFizinės būklės praradimas - padidinkite apkrovą

„JavaScript“ diegimas:

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

Galios ir svorio ir laipiojimo metrika

8.Galios ir svorio santykis

Formulė:

W/kg = galia (vatais) / kūno masė (kg)

FTP W/kg gairės:

LygisVyras W/kgMoteris W/kgKategorija
Poilsio2,5 - 3,52,0 - 3,0Fitneso motociklininkas
Konkurencinga3,5 - 4,53,0 - 4,03-4 katės, amžiaus grupės lenktynininkas
Išplėstinė4,5 - 5,54,0 - 5,0Katė 1-2, stiprus mėgėjas
Elitinis mėgėjas5,5 - 6,05,0 - 5,5Nacionalinis lygis
Profesionalus6,0–7,0+5,5–6,5+Pasaulio turas, Grand Tour GC

Skaičiavimo pavyzdys:

Scenarijus:Dviratininkas su FTP = 275W, kūno masė = 70kg

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

Aiškinimas: Konkurencingas lygis, galintis kalvotose lenktynėse

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

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

9. VAM (Velocità Ascensionale Media)

Formulė:

VAM (m/h) = aukščio padidėjimas (m) / laikas (valandomis)

VAM etalonas:

VAM (m/h)LygisPavyzdys
600–900PoilsioKlubo motociklininkas vietiniame laipiojime
900–1200KonkurencingaGeras Alpe d'Huez mėgėjas
1200–1500Elitinis mėgėjasNacionalinio lygio alpinistas
1500–1800ProfesionalusPasaulio turas šalies viduje
> 1800Didžiojo turo nugalėtojasPogačaras, Vingegaardas ant pagrindinių kopimų

Skaičiavimo pavyzdys:

Scenarijus:Alpe d'Huez kopimas

  • Aukščio padidėjimas: 1100 metrų
  • Laikas: 55 minutės = 0,917 valandos
  • VAM = 1100 / 0,917 =1200 m/val

Aiškinimas: varžybinio lygio laipiojimo pasirodymas

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

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

10. VAM iki W/kg įvertinimas

Formulė:

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

Skaičiavimo pavyzdys:

Scenarijus:Lipkite esant 8% vidutiniam nuolydžiui, VAM = 1200 m/val

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

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

Kryžminis patikrinimas: su 70 kg sveriančiu motociklininku → 305 W nuolatinė galia pakilimo metu

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

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

Aerodinaminė galios lygtis

11. Bendrieji galios reikalavimai

Pilna formulė:

P_viso = P_aero + P_gravitacija + P_riedėjimas + P_kinetika

Komponentų formulės:

Aerodinaminis pasipriešinimas:
P_aero = CdA × 0,5 × ρ × V³
Gravitacinė (laipiojimas):
P_gravitacija = m × g × sin(θ) × V
Pasipriešinimas riedėjimui:
P_rolling = Crr × m × g × cos(θ) × V
Kinetika (pagreitis):
P_kinetika = m × a × V

Konstantos ir kintamieji:

  • CdA= pasipriešinimo koeficientas × priekinis plotas (m²)
    • Tipiški plento dviračių gaubtai: 0,35-0,40 m²
    • Lašai: 0,32-0,37 m²
    • TT padėtis: 0,20-0,25 m²
  • ρ= Oro tankis (1,225 kg/m³ jūros lygyje, 15°C)
  • V= greitis (m/s)
  • m= bendra masė (vairuotojas + dviratis, kg)
  • g= gravitacija (9,81 m/s²)
  • θ= gradiento kampas (radianais arba laipsniais perskaičiuotas)
  • Crr= Pasipriešinimo riedėjimui koeficientas (~0,004 geroms kelio padangoms)
  • a= Pagreitis (m/s²)

Paveiktas pavyzdys (Plokštas kelias TT):

Scenarijus:

  • Greitis: 40 km/h = 11,11 m/s
  • CdA: 0,22 m² (gera TT padėtis)
  • Bendra masė: 75 kg (raitininkas) + 8 kg (dviratis) = 83 kg
  • Lygus kelias (nuolydis = 0°)
  • Pastovus greitis (pagreitis = 0)

Skaičiavimas:

  1. P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185W
  2. P_gravitacija= 0 W (lygus kelias)
  3. P_rolling= 0,004 × 83 × 9,81 × 11,11 =36W
  4. P_kinetinis= 0 W (pastovus greitis)
  5. P_viso= 185 + 0 + 36 + 0 =221W

Aiškinimas: norint išlaikyti 40 km/h greitį TT padėtyje lygiame kelyje, reikia 221 W

„JavaScript“ diegimas:

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 }

Pagalbinės funkcijos

Vienetų konvertavimo paslaugos

„JavaScript“ diegimas:

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

Įgyvendinimo ištekliai

Visos šiame puslapyje pateiktos formulės yra paruoštos gamybai ir patvirtintos pagal mokslinę literatūrą ir realius galios matuoklio duomenis. Naudokite juos pasirinktiniams analizės įrankiams, patikrinimui arba gilesniam galia pagrįstų treniruočių skaičiavimų supratimui.

💡 Geriausia praktika

  • Patvirtinkite įvestis:Patikrinkite pagrįstus galios diapazonus (0–2000 W), teigiamą trukmę
  • Rankenos kraštinės dėžės:Padalijimas iš nulio, nuliniai / neapibrėžti duomenys, trūksta FTP
  • Tinkamai suapvalinkite:CTL / ATL / TSB iki 1 dešimtosios dalies, TSS iki sveikojo skaičiaus, W/kg iki 2 dešimtųjų
  • Parduotuvės tikslumas:Duomenų bazėje išsaugokite visą tikslumą, apvalinkite tik rodymui
  • Laiko juostos:Kelių dienų analizei nuosekliai tvarkykite UTC ir vietos laiką
  • Galios matuoklio kalibravimas:Prieš važiuojant priminkite naudotojams nulinį poslinkį
  • FTP patvirtinimas:Pažymėkite įtartinas FTP vertes (>500 W arba <100 W suaugusiems)
  • Kruopščiai išbandykite:Skaičiavimams patikrinti naudokite gerai žinomus važiavimo failus

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.

Plaukimo našumo formulės: CSS, TSS, CTL/ATL skaičiavimai

Išsamios matematinės formulės plaukimo analitikai. Sužinokite, kaip rankiniu būdu skaičiuoti FTP, sTSS, CTL, ATL, TSB. Apima išspręstus pavyzdžius, išvedimus ir

  • 2026-03-24
  • plaukimo formulės · CSS skaičiavimas · TSS formulė · treniruočių matematika
  • Bibliografija