Велосипедні формули потужності
Математична основа показників аналітики велосипедів
Посібник із впровадження
Ця сторінка містить формули копіювання та вставлення та покрокові методи розрахунку для всіх показників Bike Analytics. Використовуйте їх для індивідуальних реалізацій, перевірки або глибшого розуміння навчання на основі потужності.
⚠️ Примітки щодо впровадження
- Усі значення потужності у ватах (Вт), час у секундах, якщо не вказано
- FTP і CP є індивідуальними пороговими значеннями, універсальних значень немає
- Завжди перевіряйте вхідні дані для розумних діапазонів (0-2000 Вт типово)
- Обробка граничних випадків (ділення на нуль, негативний ступінь)
- Для точності даних про потужність потрібні 1-секундні інтервали запису
Велосипедні основні показники ефективності
1. Оцінка тренувального стресу (TSS)
формула:
Спрацьований приклад:
Сценарій:2 години їзди, NP = 235 Вт, FTP = 250 Вт
- Обчисліть IF: IF = 235 / 250 = 0,94
- Тривалість у секундах: 2 години × 3600 = 7200 секунд
- TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
- TSS = 1 590 720 / 900 000 × 100 =176.7 ЗАХИСТИТИ1X
Інтерпретація: важка тренувальна поїздка (>150 TSS), очікуйте 2-3 дні відновлення
Реалізація JavaScript:
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. Нормована потужність (NP)
Алгоритм (30-секундне ковзне середнє):
Чому 4-та влада?
Квартичне співвідношення (4-й ступінь) відображає нелінійну фізіологічну вартість змінних зусиль. Поїздка зі скачками та відновленням потребує більше енергії, ніж постійна потужність у середньому.
приклад:
- Постійна їзда: 200 Вт протягом 1 години → NP = 200 Вт, середнє значення = 200 Вт
- Змінна їзда: чергування 300 Вт/100 Вт → Середнє = 200 Вт, NP = 225 Вт
Така сама середня потужність, але змінна їзда має на 12% вищий NP через фізіологічну вартість стрибків
Реалізація JavaScript:
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. Коефіцієнт інтенсивності (IF)
формула:
Діапазон інтерпретації:
| Асортимент IF | Рівень зусиль | Приклад тренування |
|---|---|---|
| < 0,75 | Відновлення / Легко | Активно відновлювальна їзда, зона 1-2 |
| 0,75 - 0,85 | Витривалість | Довга рівномірна їзда, аеробна основа |
| 0,85 - 0,95 | Темп | Sweet spot тренування, темпові інтервали |
| 0,95 - 1,05 | Поріг | Інтервали FTP, спроби на час |
| 1,05 - 1,15 | VO₂max | 5-хвилинні інтервали, критеріальна гонка |
| > 1,15 | Анаеробний | Короткі спринти, атаки, горні ривки |
Приклад розрахунку:
Сценарій:NP = 235 Вт, FTP = 250 Вт
ЗАХИСТИТИ15X = 235 / 250 =0,94
Інтерпретація: високий темп / підпорогове зусилля, тривале протягом 2-3 годин
function calculateIF(normalizedPower, ftp) {
return (normalizedPower / ftp).toFixed(2);
}
// Example:
const if_value = calculateIF(235, 250);
// Returns: 0.944.Індекс мінливості (VI)
формула:
Інтерпретація за дисциплінами:
| Дисциплінованість | Типовий VI | Значення |
|---|---|---|
| Road TT / Steady Effort | 1.00 - 1.05 | Дуже постійна потужність, оптимальний темп |
| Шосейні гонки | 1.05 - 1.10 | Деякі сплески, загалом стабільні |
| Критерій | 1,10 - 1,20 | Часті прискорення і напади |
| Гірський велосипед XC | 1,15 - 1,30+ | Дуже мінлива, постійні сплески |
Приклад розрахунку:
Шосейні гонки:NP = 240 Вт, середня потужність = 230 Вт
VI = 240 / 230 =1.04(рівний крок)
Гонка MTB:NP = 285 Вт, середня потужність = 235 Вт
VI = 285 / 235 =1.21(дуже мінливі, вибухові зусилля)
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Критична потужність і W' (анаеробна ємність)
5. Критична потужність (CP) - лінійна модель
формула:
Обчислення з кількох зусиль:
Вимагає 2-4 максимальних зусиль різної тривалості (наприклад, 3, 5, 12, 20 хвилин)
Приклад даних:
| Тривалість | Потужність (Вт) | Загальна робота (кДж) |
|---|---|---|
| 3 хв (180 с) | 400 Вт | 72 кДж |
| 5 хв (300 с) | 365 Вт | 109,5 кДж |
| 12 хв (720 с) | 310 Вт | 223,2 кДж |
| 20 хв (1200 с) | 285 Вт | 342 кДж |
Використання лінійної регресії (Робота = CP × Час + W'):
- CP = 270 Вт(нахил лінії регресії)
- W' = 18,5 кДж(у-перетин)
Реалізація JavaScript:
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) - модель диференціального рівняння
Формули:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
і ΔCP = (CP - P(t))
Приклад реального світу:
Характеристики велосипедиста:CP = 270 Вт, W' = 18,5 кДж
Сценарій 1 - жорстка атака:
- Райдер зростає до 400 Вт на 30 секунд
- Витрати W': (400 - 270) × 30 = 3900 Дж = 3,9 кДж
- Залишок W'bal: 18,5 - 3,9 =14,6 кДж
Сценарій 2 - Відновлення:
- Після атаки падає до 200 Вт (70 Вт нижче CP) протягом 2 хвилин
- ΔCP = 270 - 200 = 70 Вт
- τ = 546 × e^(-0,01 × 70) + 316 = 588 секунд
- Відновлення за 120 с: 18,5 × (1 - e^(-120/588)) =Відновлено 3,5 кДж
- Новий W'bal: 14,6 + 3,5 =18,1 кДж
Реалізація JavaScript:
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Таблиця управління продуктивністю (PMC) для велоспорту
7. Обчислення CTL, ATL, TSB
Формули (експоненціально зважені ковзні середні):
Визначення показників:
- CTL (хронічне навантаження під час тренувань):42-денне експоненціально зважене середнє – відображає придатність
- ATL (Гостре тренувальне навантаження):7-денне експоненціально зважене середнє – означає втому
- TSB (Баланс тренувального стресу):Форма = Фітнес - Втома
Приклад роботи (7-денний навчальний блок):
| День | ЗАХИСТИТИ1X | CTL | ATL | TSB | Статус |
|---|---|---|---|---|---|
| Пн | 100 | 75,0 | 80,0 | -5,0 | Навчання |
| Вт | 50 | 74.4 | 75.7 | -1,3 | Відновлення |
| ср | 120 | 75.5 | 82,0 | -6,5 | Важкі тренування |
| чт | 0 | 73.7 | 70.3 | +3,4 | День відпочинку |
| пт | 80 | 73.8 | 71.7 | +2,1 | Помірний |
| сб | 150 | 75.6 | 82.9 | -7,3 | Довга поїздка |
| сонце | 40 | 74.8 | 76.8 | -2,0 | Відновлення |
Інтерпретація TSB:
| Асортимент TSB | Статус | Дія |
|---|---|---|
| < -30 | Високий ризик | Попередження про перетренованість - зменшіть навантаження |
| -30 до -10 | Наполегливі тренування | Побудова фітнесу, моніторинг відновлення |
| від -10 до +5 | Оптимальний | Нормальна тренувальна зона |
| від +5 до +15 | Гонка готова | Пік форми - гонка цими вихідними |
| > +25 | Детренування | Втрата фізичної форми - збільшення навантаження |
Реалізація JavaScript:
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Показники відношення сили до ваги та лазіння
8.Співвідношення потужності до ваги
формула:
FTP Вт/кг Контрольні показники:
| Рівень | Чоловік Вт/кг | Жінка Вт/кг | Категорія |
|---|---|---|---|
| Рекреаційний | 2,5 - 3,5 | 2,0 - 3,0 | Фітнес-райдер |
| Змагальний | 3,5 - 4,5 | 3,0 - 4,0 | Кот 3-4 вікова група гонщик |
| Просунутий | 4,5 - 5,5 | 4,0 - 5,0 | Кот 1-2, сильний любитель |
| Елітний аматор | 5,5 - 6,0 | 5,0 - 5,5 | Національний рівень |
| професійний | 6,0 - 7,0+ | 5,5 - 6,5+ | World Tour, Grand Tour GC |
Приклад розрахунку:
Сценарій:Велосипедист із FTP = 275 Вт, маса тіла = 70 кг
Вт/кг = 275 / 70 =3,93 Вт/кг
Інтерпретація: Змагальний рівень, здатний до горбистих перегонів
function calculateWattsPerKg(power, bodyMassKg) {
return (power / bodyMassKg).toFixed(2);
}
// Example:
const wpkg = calculateWattsPerKg(275, 70);
// Returns: 3.939. VAM (Velocità Ascensionale Media)
формула:
Контрольні показники VAM:
| VAM (м/год) | Рівень | приклад |
|---|---|---|
| 600 - 900 | Рекреаційний | Клубний вершник на місцевому сходженні |
| 900 - 1200 | Змагальний | Хороший аматор на Альп д'Юез |
| 1200 - 1500 | Елітний аматор | Альпініст національного рівня |
| 1500 - 1800 | професійний | Вітчизняне світове турне |
| > 1800 | Переможець Гранд Туру | Погачар, Вінгегард на ключових сходженнях |
Приклад розрахунку:
Сценарій:Підйом на Альп д'Юез
- Перепад висоти: 1100 метрів
- Час: 55 хвилин = 0,917 години
- VAM = 1100 / 0,917 =1200 м/год
Інтерпретація: скелелазіння змагального рівня
function calculateVAM(elevationGainMeters, timeMinutes) {
const hours = timeMinutes / 60;
return Math.round(elevationGainMeters / hours);
}
// Example:
const vam = calculateVAM(1100, 55);
// Returns: 1200 m/h10. Оцінка VAM у Вт/кг
формула:
Приклад розрахунку:
Сценарій:Підйом із середнім градієнтом 8%, VAM = 1200 м/год
Вт/кг = 1200 / 100 / (8 + 3)
Вт/кг = 12 / 11 =4,36 Вт/кг
Перехресна перевірка: з райдером вагою 70 кг → 305 Вт стійка потужність на підйомі
function estimateWkgFromVAM(vam, gradientPercent) {
return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}
// Example:
const wkg = estimateWkgFromVAM(1200, 8);
// Returns: 4.36Рівняння аеродинамічної потужності
11. Загальні вимоги до потужності
Повна формула:
Формули компонентів:
P_aero = CdA × 0,5 × ρ × V³
P_gravity = m × g × sin(θ) × V
P_rolling = Crr × m × g × cos(θ) × V
P_kinetic = m × a × V
Константи та змінні:
- CdA= Коефіцієнт опору × фронтальна площа (м²)
- Типові капоти для шосейних велосипедів: 0,35-0,40 м²
- Краплі: 0,32-0,37 м²
- Положення ТТ: 0,20-0,25 м²
- ρ= Густина повітря (1,225 кг/м³ на рівні моря, 15°C)
- В= Швидкість (м/с)
- м= Загальна маса (гонщик + велосипед, кг)
- g= Сила тяжіння (9,81 м/с²)
- θ= Кут градієнта (конвертовано в радіанах або градусах)
- Crr= Коефіцієнт опору коченню (~0,004 для хороших дорожніх шин)
- a= Прискорення (м/с²)
Спрацьований приклад (Flat Road TT):
Сценарій:
- Швидкість: 40 км/год = 11,11 м/с
- CdA: 0,22 м² (гарне положення TT)
- Загальна вага: 75 кг (гонщик) + 8 кг (велосипед) = 83 кг
- Рівна дорога (нахил = 0°)
- Постійна швидкість (прискорення = 0)
Розрахунок:
- P_aero= 0,22 × 0,5 × 1,225 × 11,11³ =185 Вт
- P_гравітація= 0 Вт (рівна дорога)
- П_ролінг= 0,004 × 83 × 9,81 × 11,11 =36 Вт
- P_kinetic= 0 Вт (постійна швидкість)
- P_total= 185 + 0 + 36 + 0 =221 Вт
Інтерпретація: потрібно 221 Вт, щоб підтримувати швидкість 40 км/год у положенні TT на рівній дорозі
Реалізація JavaScript:
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 }Допоміжні функції
Утиліти перетворення одиниць
Реалізація JavaScript:
// 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)Ресурси впровадження
Усі формули на цій сторінці готові до виробництва та підтверджені відповідно до наукової літератури та реальних даних лічильників електроенергії. Використовуйте їх для користувацьких інструментів аналітики, перевірки або глибшого розуміння навчальних обчислень на основі потужності.
💡 Найкращі практики
- Перевірити введені дані:Перевірте розумні діапазони потужності (0-2000 Вт), позитивну тривалість
- Обробка крайових випадків:Ділення на нуль, нульові/невизначені дані, відсутній FTP
- Округліть відповідно:CTL/ATL/TSB до 1 знака після коми, TSS до цілого числа, Вт/кг до 2 знаків після коми
- Точність зберігання:Зберігайте повну точність у базі даних, круглі лише для відображення
- Часові пояси:Послідовно обробляйте UTC і місцевий час для багатоденного аналізу
- Калібрування вимірювача потужності:Нагадуйте користувачам про нульове зміщення перед поїздками
- Перевірка FTP:Позначити підозрілі значення FTP (>500 Вт або <100 Вт для дорослих)
- Ретельно протестуйте:Використовуйте завідомо справні файли поїздок для перевірки розрахунків
Формули Продуктивності в Плаванні: Розрахунки CSS, TSS,
Повні математичні формули для аналітики плавання. Дізнайтеся, як вручну розрахувати FTP, sTSS, CTL, ATL, TSB. Включає розв'язані приклади, виводи та пояснення
- 2026-03-24
- формули плавання · розрахунок CSS · формула TSS · математика тренувань
- Бібліографія
