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ė:
Veikęs pavyzdys:
Scenarijus:2 valandos važiavimo, NP = 235 W, FTP = 250 W
- Apskaičiuokite IF: IF = 235 / 250 = 0,94
- Trukmė sekundėmis: 2 valandos × 3600 = 7200 sekundžių
- TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
- 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: 1772. Normalizuota galia (NP)
Algoritmas (30 sekundžių slenkamasis 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 watts3. Intensity Factor (IF)
Formulė:
Interpretacijos diapazonai:
| IF diapazonas | Pastangų lygis | Treniruotės pavyzdys |
|---|---|---|
| < 0,75 | Atkūrimas / Lengvas | Aktyvus atsigavimo važiavimas, 1-2 zona |
| 0,75 - 0,85 | Ištvermė | Ilgas pastovus važiavimas, aerobinė bazė |
| 0,85 - 0,95 | Tempas | Sweet spot treniruotės, tempo intervalai |
| 0,95 - 1,05 | Slenkstis | FTP intervalai, laiko bandymo pastangos |
| 1,05 - 1,15 | VO₂max | 5 minučių intervalai, kriterinės lenktynės |
| > 1.15 | Anaerobinis | Trumpi 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.944.Kintamumo indeksas (VI)
Formulė:
Interpretacija pagal discipliną:
| Drausmė | Tipiškas VI | Reikšmė |
|---|---|---|
| Kelių TT / Stabilios pastangos | 1.00 - 1.05 val | Labai pastovi galia, optimalus tempas |
| Plento lenktynės | 1,05 - 1,10 | Kai kurie šuoliai, paprastai pastovūs |
| Kriterijus | 1,10 - 1,20 | Dažni pagreičiai ir atakos |
| Kalnų dviratis XC | 1,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.21Kritinė galia ir W' (anaerobinis pajėgumas)
5. Kritinė galia (CP) – tiesinis modelis
Formulė:
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) | 400W | 72 kJ |
| 5 min (300 sek.) | 365W | 109,5 kJ |
| 12 min (720 sek.) | 310W | 223,2 kJ |
| 20 min (1200 sek.) | 285W | 342 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:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
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 timeNašumo valdymo diagrama (PMC), skirta važiavimui dviračiu
7. CTL, ATL, TSB skaičiavimai
Formulės (eksponentiškai svertiniai slenkamieji vidurkiai):
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):
| Diena | TSS | CTL | ATL | TSB | Būsena |
|---|---|---|---|---|---|
| Pirm | 100 | 75,0 | 80,0 | -5.0 | Treniruotės |
| antradienis | 50 | 74.4 | 75.7 | -1.3 | Atsigavimas |
| trečia | 120 | 75.5 | 82,0 | -6.5 | Sunkus mokymas |
| Ketvirtadienis | 0 | 73.7 | 70.3 | +3.4 | Poilsio diena |
| penk | 80 | 73.8 | 71.7 | +2.1 | Vidutinis |
| Šešt | 150 | 75.6 | 82.9 | -7.3 | Ilgas važiavimas |
| Saulė | 40 | 74.8 | 76.8 | -2,0 | Atsigavimas |
TSB aiškinimas:
| TSB diapazonas | Būsena | Veiksmas |
|---|---|---|
| < -30 | Didelė rizika | Perspėjimas apie pervargimą – sumažinkite krūvį |
| -30 iki -10 | Sunkios treniruotės | Kurkite fitnesą, stebėkite atsigavimą |
| -10 iki +5 | Optimalus | Įprasta treniruočių zona |
| +5 iki +15 | Pasiruošę lenktynėms | Aukščiausia forma – lenktynės šį savaitgalį |
| > +25 | Treniravimasis | Fizinė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 dayGalios ir svorio ir laipiojimo metrika
8.Galios ir svorio santykis
Formulė:
FTP W/kg gairės:
| Lygis | Vyras W/kg | Moteris W/kg | Kategorija |
|---|---|---|---|
| Poilsio | 2,5 - 3,5 | 2,0 - 3,0 | Fitneso motociklininkas |
| Konkurencinga | 3,5 - 4,5 | 3,0 - 4,0 | 3-4 katės, amžiaus grupės lenktynininkas |
| Išplėstinė | 4,5 - 5,5 | 4,0 - 5,0 | Katė 1-2, stiprus mėgėjas |
| Elitinis mėgėjas | 5,5 - 6,0 | 5,0 - 5,5 | Nacionalinis lygis |
| Profesionalus | 6,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.939. VAM (Velocità Ascensionale Media)
Formulė:
VAM etalonas:
| VAM (m/h) | Lygis | Pavyzdys |
|---|---|---|
| 600–900 | Poilsio | Klubo motociklininkas vietiniame laipiojime |
| 900–1200 | Konkurencinga | Geras Alpe d'Huez mėgėjas |
| 1200–1500 | Elitinis mėgėjas | Nacionalinio lygio alpinistas |
| 1500–1800 | Profesionalus | Pasaulio turas šalies viduje |
| > 1800 | Didžiojo turo nugalėtojas | Pogač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/h10. VAM iki W/kg įvertinimas
Formulė:
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.36Aerodinaminė galios lygtis
11. Bendrieji galios reikalavimai
Pilna formulė:
Komponentų formulės:
P_aero = CdA × 0,5 × ρ × V³
P_gravitacija = m × g × sin(θ) × V
P_rolling = Crr × m × g × cos(θ) × V
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:
- P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185W
- P_gravitacija= 0 W (lygus kelias)
- P_rolling= 0,004 × 83 × 9,81 × 11,11 =36W
- P_kinetinis= 0 W (pastovus greitis)
- 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
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
