Wzory mocy kolarskiej
Matematyczny fundament metryk Bike Analytics
Przewodnik wdrożeniowy
Ta strona zawiera wzory gotowe do kopiowania oraz opisy obliczeń krok po kroku dla wszystkich metryk Bike Analytics. Wykorzystaj je do własnych implementacji, weryfikacji lub głębszego zrozumienia treningu opartego na mocy.
⚠️ Uwagi do wdrożenia
- Wszystkie wartości mocy podane są w watach (W), czas w sekundach (chyba że zaznaczono inaczej).
- FTP i CP są progami indywidualnymi – nie istnieją wartości uniwersalne.
- Zawsze sprawdzaj, czy dane wejściowe mieszczą się w rozsądnych granicach (typowo 0-2000W).
- Pamiętaj o obsłudze wyjątków (dzielenie przez zero, brak mocy).
- Dane o mocy wymagają 1-sekundowych interwałów zapisu dla zachowania dokładności.
Kluczowe metryki wydajności
1. Wskaźnik Stresu Treningowego (TSS)
Wzór:
Przykład obliczeń:
Scenariusz: 2-godzinna jazda, NP = 235W, FTP = 250W
- Oblicz IF: IF = 235 / 250 = 0.94
- Czas w sekundach: 2 godziny × 3600 = 7200 sekund
- TSS = (7200 × 235 × 0.94) / (250 × 3600) × 100
- TSS = 1,590,720 / 900,000 × 100 = 176.7 TSS
Interpretacja: Bardzo ciężki trening (>150 TSS), wymagana 2-3 dniowa regeneracja.
Implementacja JavaScript:
function calculateTSS(durationSeconds, normalizedPower, ftp) {
const intensityFactor = normalizedPower / ftp;
const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
return Math.round(tss);
}
// Przykład użycia:
const tss = calculateTSS(7200, 235, 250);
// Zwraca: 177
2. Moc Znormalizowana (NP)
Algorytm (30-sekundowa średnia krocząca):
Dlaczego 4. potęga?
Zależność czwartego stopnia odzwierciedla nieliniowy koszt fizjologiczny zmiennych wysiłków. Jazda ze zrywami kosztuje organizm znacznie więcej energii niż jazda ze stałą mocą przy tej samej średniej mocy.
Przykład:
- Jazda jednostajna: 200W przez 1h → NP = 200W, Średnia = 200W
- Jazda zmienna: Na zmianę 300W/100W → Średnia = 200W, NP = 225W
Mimo tej samej średniej mocy, jazda zmienna ma o 12% wyższe NP ze względu na koszt fizjologiczny zrywów.
Implementacja JavaScript:
function calculateNormalizedPower(powerData) {
// powerData to tablica z sekundowymi wartościami mocy
// Krok 1: Oblicz średnie kroczące 30s
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);
}
// Krok 2: Podnieś do 4. potęgi
const powered = rollingAvgs.map(p => Math.pow(p, 4));
// Krok 3: Średnia z potęg
const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;
// Krok 4: Pierwiastek 4. stopnia
const np = Math.pow(avgPowered, 0.25);
return Math.round(np);
}
3. Współczynnik Intensywności (IF)
Wzór:
Zakresy interpretacji:
| Zakres IF | Poziom wysiłku | Przykładowy trening |
|---|---|---|
| < 0.75 | Regeneracja / Lekki | Aktywna regeneracja, Strefa 1-2 |
| 0.75 - 0.85 | Wytrzymałość | Długa, spokojna jazda tlenowa |
| 0.85 - 0.95 | Tempo | Sweet spot, interwały tempo |
| 0.95 - 1.05 | Próg (Threshold) | Interwały na progu, jazda na czas |
| 1.05 - 1.15 | VO₂max | Interwały 5-minutowe, kryterium |
| > 1.15 | Beztlenowy | Krótkie sprinty, ataki, zrywy w MTB |
4. Wskaźnik Zmienności (VI)
Wzór:
Interpretacja wg dyscypliny:
| Dyscyplina | Typowe VI | Znaczenie |
|---|---|---|
| Jazda na czas (TT) | 1.00 - 1.05 | Bardzo równa jazda, optymalne tempo |
| Wyścig szosowy | 1.05 - 1.10 | Pewne skoki mocy, generalnie równo |
| Kryterium uliczne | 1.10 - 1.20 | Częste przyspieszenia i ataki |
| Kolarstwo górskie (MTB XC) | 1.15 - 1.30+ | Bardzo duża zmienność, ciągłe zrywy |
Moc Krytyczna i W' (Pojemność beztlenowa)
5. Moc Krytyczna (CP) - Model Liniowy
Wzór:
Obliczanie na podstawie kilku wysiłków:
Wymaga 2-4 maksymalnych wysiłków o różnym czasie trwania (np. 3, 5, 12, 20 minut).
Przykład danych: Praca = Moc × Czas / 1000 (wynik w kJ). Stosując regresję liniową (Praca = CP × Czas + W'), otrzymujemy:
- CP = 270W (nachylenie linii regresji).
- W' = 18.5 kJ (punkt przecięcia z osią Y).
6. Bilans W' (W'bal) - Model Skiby
Wzory:
W'exp(t) = ∫(Moc(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
oraz ΔCP = (CP - Moc(t))
Przykład z życia:
Parametry kolarza: CP = 270W, W' = 18.5 kJ
Po ataku trwającym 30s przy mocy 400W: Zużycie wyniosło (400-270) × 30 = 3900 J = 3.9 kJ. Pozostało: 14.6 kJ.
Regeneracja: Odpoczynek przy 200W (70W poniżej CP) przez 2 minuty. Stała czasowa τ wynosi 588s. Odzyskano ok. 3.5 kJ.
Wykres Zarządzania Wynikami (PMC)
7. Obliczenia CTL, ATL, TSB
Wzory (Ważone wykładniczo średnie kroczące):
Definicje metryk:
- CTL (Chronic Training Load): 42-dniowa średnia – reprezentuje Twoją wydolność (Fitness).
- ATL (Acute Training Load): 7-dniowa średnia – reprezentuje Twoje zmęczenie (Fatigue).
- TSB (Training Stress Balance): Bilans lub Formę (Wydolność - Zmęczenie).
Stosunek mocy do masy i wspinaczka
8. Stosunek mocy do masy (W/kg)
Wzór:
Kluczowy wskaźnik na podjazdach, gdzie walka z grawitacją dominuje nad oporem powietrza.
9. Średnia prędkość wznoszenia (VAM)
Wzór:
Standardy VAM (m/h):
| VAM (m/h) | Poziom | Przykład |
|---|---|---|
| 600 - 900 | Rekreacyjny | Amator na lokalnym podjeździe |
| 900 - 1200 | Ambicjonalny | Dobry kolarz na Alpe d'Huez |
| 1200 - 1500 | Elita Amatorów | Poziom krajowy górski |
| 1500 - 1800 | Zawodowiec | Pomocnik w World Tourze |
| > 1800 | Zwycięzca Grand Touru | Pogačar, Vingegaard na kluczowych górach |
10. Szacowanie W/kg na podstawie VAM
Wzór:
Równanie mocy aerodynamicznej
11. Całkowite zapotrzebowanie na moc
Pełny wzór:
Składowe wzory:
P_aero = CdA × 0.5 × ρ × V³
P_grawitacja = m × g × sin(θ) × V
P_toczenie = Crr × m × g × cos(θ) × V
Stałe i zmienne:
- CdA = Współczynnik oporu × powierzchnia czołowa (m²).
- ρ = Gęstość powietrza (1.225 kg/m³ na poziomie morza, 15°C).
- V = Prędkość (m/s).
- m = Całkowita masa (kolarz + rower, kg).
- g = Przyspieszenie ziemskie (9.81 m/s²).
Funkcje pomocnicze
Konwersja jednostek
Implementacja JavaScript:
// Wybrane przeliczniki
function kphToMps(kph) {
return kph / 3.6; // km/h na m/s
}
function wattsToKJ(watts, durationSeconds) {
return (watts * durationSeconds) / 1000; // Moc na Energię (kJ)
}
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')}`;
}
Zasoby wdrożeniowe
Wszystkie wzory na tej stronie są gotowe do użycia produkcyjnego i zostały zweryfikowane z literaturą naukową oraz rzeczywistymi danymi z mierników mocy.
💡 Najlepsze praktyki
- Waliduj dane wejściowe: Sprawdzaj czy wartości mocy są dodatnie i mieszczą się w normie.
- Obsługuj przypadki brzegowe: Dzielenie przez zero, brak danych o FTP, ujemny czas.
- Zaokrąglaj z umiarem: CTL/ATL do 1 miejsca po przecinku, TSS jako liczba całkowita, W/kg do 2 miejsc.
- Weryfikuj: Używaj sprawdzonych plików .fit/.tcx do testowania poprawności Twojej implementacji.