Milinganyo ya Nguvu ya Baiskeli
Msingi wa Kihisabati wa Vipimo vya Bike Analytics
Mwongozo wa Utekelezaji
Ukurasa huu unatoa milinganyo ya kunakili na kubandika pamoja na njia za ukokotoaji wa hatua kwa hatua kwa vipimo vyote vya Bike Analytics. Tumia hizi kwa utekelezaji maalum, uhakiki, au uelewa wa ndani zaidi wa mafunzo kulingana na nguvu.
⚠️ Vidokezo vya Utekelezaji
- Thamani zote za nguvu ziko katika wati (W), muda katika sekunde isipokuwa inapoelekezwa vinginevyo
- FTP na CP ni vizingiti maalum kwa kila mtu—hakuna thamani ya ulimwengu mzima
- Daima hakiki kama data zinazoingizwa ziko katika viwango vya kawaida (wati 0-2000 ni kawaida)
- Shughulikia hali zisizo za kawaida (kugawanya kwa sifuri, nguvu hasi)
- Data ya nguvu inahitaji vipindi vya kurekodi vya sekunde 1 kwa usahihi
Vipimo vya Msingi vya Utendaji
1. Alama ya Mkazo wa Mafunzo (Training Stress Score - TSS)
Mlinganyo:
Mfano wa Ukokotoaji:
Hali: Safari ya saa 2, NP = 235W, FTP = 250W
- Kokotoa IF: IF = 235 / 250 = 0.94
- Muda katika sekunde: saa 2 × 3600 = sekunde 7200
- TSS = (7200 × 235 × 0.94) / (250 × 3600) × 100
- TSS = 1,590,720 / 900,000 × 100 = 176.7 TSS
Ufafanuzi: Safari ngumu ya mafunzo (>150 TSS), tarajia siku 2-3 za kupona
Utekelezaji wa JavaScript:
function calculateTSS(durationSeconds, normalizedPower, ftp) {
const intensityFactor = normalizedPower / ftp;
const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
return Math.round(tss);
}
// Mfano wa utumiaji:
const tss = calculateTSS(7200, 235, 250);
// Inarudisha: 177
2. Nguvu Iliyorekebishwa (Normalized Power - NP)
Algorithm (wastani wa mzunguko wa sekunde 30):
Kwa nini Kipeuo cha 4?
Uhusiano wa kipeuo cha nne (quartic) unaonyesha gharama isiyo ya mshazari ya kifiziolojia ya juhudi zinazobadilika. Safari yenye surges na mapumziko inagharimu nishati zaidi kuliko nguvu thabiti katika wastani ule ule.
Mfano:
- Safari thabiti: 200W kwa saa 1 → NP = 200W, Wastani = 200W
- Safari inayobadilika: Inayopishana kati ya 300W/100W → Wastani = 200W, NP = 225W
Wastani wa nguvu ni ule ule, lakini safari inayobadilika ina NP ya juu kwa 12% kutokana na gharama ya kifiziolojia ya surges
Utekelezaji wa JavaScript:
function calculateNormalizedPower(powerData) {
// powerData ni mfululizo (array) wa thamani za nguvu za kila sekunde
// Hatua ya 1: Kokotoa wastani wa mzunguko wa sekunde 30
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);
}
// Hatua ya 2: Pandisha kwa kipeuo cha 4
const powered = rollingAvgs.map(p => Math.pow(p, 4));
// Hatua ya 3: Wastani wa vipeuo vya 4
const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;
// Hatua ya 4: Tafuta kipeuo cha nne
const np = Math.pow(avgPowered, 0.25);
return Math.round(np);
}
// Mfano wa utumiaji:
const powerData = [/* array ya nguvu ya kila sekunde */];
const np = calculateNormalizedPower(powerData);
// Inarudisha: NP katika wati
3. Kigezo cha Ukubwa (Intensity Factor - IF)
Mlinganyo:
Mazingira ya Ufafanuzi:
| Kiwango cha IF | Kiwango cha Juhudi | Mfano wa Mazoezi |
|---|---|---|
| < 0.75 | Kupona / Rahisi | Safari ya urejeshaji amilifu, Zone 1-2 |
| 0.75 - 0.85 | Uvumilivu (Endurance) | Safari ndefu thabiti, msingi wa aerobic |
| 0.85 - 0.95 | Tempo | Mafunzo ya sweet spot, vipindi vya tempo |
| 0.95 - 1.05 | Kizingiti (Threshold) | Vipindi vya FTP, juhudi za mbio dhidi ya saa |
| 1.05 - 1.15 | VO₂max | Vipindi vya dakika 5, mbio za criterium |
| > 1.15 | Anaerobic | Sprints fupi, mashambulizi, surges za MTB |
Mfano wa Ukokotoaji:
Hali: NP = 235W, FTP = 250W
IF = 235 / 250 = 0.94
Ufafanuzi: Juhudi kubwa ya tempo / karibu na kizingiti, inayoweza kudumishwa kwa saa 2-3
function calculateIF(normalizedPower, ftp) {
return (normalizedPower / ftp).toFixed(2);
}
// Mfano:
const if_value = calculateIF(235, 250);
// Inarudisha: 0.94
4. Kigezo cha Mabadiliko (Variability Index - VI)
Mlinganyo:
Ufafanuzi kwa kila Nyanja:
| Nyanja | VI ya Kawaida | Maana |
|---|---|---|
| Road TT / Juhudi Thabiti | 1.00 - 1.05 | Nguvu thabiti sana, mpango bora wa kasi |
| Road Racing | 1.05 - 1.10 | Baadhi ya surges, kwa ujumla thabiti |
| Criterium | 1.10 - 1.20 | Kuongeza kasi na mashambulizi ya mara kwa mara |
| Mountain Bike XC | 1.15 - 1.30+ | Inabadilika sana, surges za mara kwa mara |
Mfano wa Ukokotoaji:
Mbio za Barabarani: NP = 240W, Wastani wa Nguvu = 230W
VI = 240 / 230 = 1.04 (kasi thabiti)
Mbio za MTB: NP = 285W, Wastani wa Nguvu = 235W
VI = 285 / 235 = 1.21 (inabadilika sana, juhudi za milipuko)
function calculateVI(normalizedPower, averagePower) {
return (normalizedPower / averagePower).toFixed(2);
}
// Mfano:
const vi_road = calculateVI(240, 230); // Inarudisha: 1.04
const vi_mtb = calculateVI(285, 235); // Inarudisha: 1.21
Nguvu Muhimu na W' (Uwezo wa Anaerobic)
5. Nguvu Muhimu (Critical Power - CP) - Linear Model
Mlinganyo:
Ukokotoaji kutoka kwa Juhudi Nyingi:
Inahitaji juhudi 2-4 za kiwango cha juu katika muda tofauti (mfano, dakika 3, 5, 12, na 20)
Data ya Mfano:
| Muda | Nguvu (W) | Jumla ya Kazi (kJ) |
|---|---|---|
| dakika 3 (180s) | 400W | 72 kJ |
| dakika 5 (300s) | 365W | 109.5 kJ |
| dakika 12 (720s) | 310W | 223.2 kJ |
| dakika 20 (1200s) | 285W | 342 kJ |
Ukitumia linear regression (Kazi = CP × Muda + W'):
- CP = 270W (mwinuko wa mstari wa regression)
- W' = 18.5 kJ (y-intercept)
Utekelezaji wa 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
};
}
// Mfano wa utumiaji:
const efforts = [
{duration: 180, power: 400},
{duration: 300, power: 365},
{duration: 720, power: 310},
{duration: 1200, power: 285}
];
const result = calculateCP_Linear(efforts);
// Inarudisha: { CP: 270.0, Wprime: 18.5 }
6. Msawazo wa W' (W'bal) - Differential Equation Model
Milinganyo:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
na ΔCP = (CP - P(t))
Mfano wa Uhalisia:
Aina ya Mwendeshaji: CP = 270W, W' = 18.5 kJ
Hali ya 1 - Shambulizi Kali:
- Mwendeshaji anaongeza kasi hadi 400W kwa sekunde 30
- Upunguzaji wa W': (400 - 270) × 30 = 3,900 J = 3.9 kJ
- W'bal iliyobaki: 18.5 - 3.9 = 14.6 kJ
Hali ya 2 - Urejeshaji:
- Baada ya shambulizi, anashuka hadi 200W (70W chini ya CP) kwa dakika 2
- ΔCP = 270 - 200 = 70W
- τ = 546 × e^(-0.01 × 70) + 316 = sekunde 588
- Urejeshaji ndani ya 120s: 18.5 × (1 - e^(-120/588)) = 3.5 kJ zimejawa
- W'bal mpya: 14.6 + 3.5 = 18.1 kJ
Utekelezaji wa JavaScript:
function calculateWbalance(powerData, CP, Wprime) {
// powerData = array ya {time: seconds, power: watts}
let wbal = Wprime * 1000; // Badilisha kuwa 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) {
// Upunguzaji juu ya CP
const expenditure = (power - CP) * dt;
wbal -= expenditure;
} else {
// Urejeshaji chini ya 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;
}
// Hakikisha W'bal haizidi urefu wa betri au kwenda sifuri
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;
}
// Mfano wa utumiaji:
const powerData = [
{time: 0, power: 200},
{time: 1, power: 210},
// ... data nyingine za safari
];
const wbalHistory = calculateWbalance(powerData, 270, 18.5);
// Inarudisha array ya thamani za W'bal kwa muda wote
Chati ya Usimamizi wa Utendaji (Performance Management Chart - PMC)
7. Ukokotoaji wa CTL, ATL, TSB
Milinganyo (Exponentially Weighted Moving Averages):
Ufafanuzi wa Vipimo:
- CTL (Chronic Training Load): wastani wa mzunguko wa siku 42 - unawakilisha fitinesi
- ATL (Acute Training Load): wastani wa mzunguko wa siku 7 - unawakilisha uchovu
- TSB (Training Stress Balance): Hali (Form) = Fitinesi - Uchovu
Mfano wa Ukokotoaji (Kipindi cha siku 7):
| Siku | TSS | CTL | ATL | TSB | Hali |
|---|---|---|---|---|---|
| Jumatatu | 100 | 75.0 | 80.0 | -5.0 | Mafunzo |
| Jumanne | 50 | 74.4 | 75.7 | -1.3 | Kupona |
| Jumatano | 120 | 75.5 | 82.0 | -6.5 | Mafunzo Magumu |
| Alhamisi | 0 | 73.7 | 70.3 | +3.4 | Siku ya Mapumziko |
| Ijumaa | 80 | 73.8 | 71.7 | +2.1 | Wastani |
| Jumamosi | 150 | 75.6 | 82.9 | -7.3 | Safari Ndefu |
| Jumapili | 40 | 74.8 | 76.8 | -2.0 | Kupona |
Ufafanuzi wa TSB:
| Kiwango cha TSB | Hali | Hatua |
|---|---|---|
| < -30 | Hatari Kubwa | Tahadhari ya mafunzo kupita kiasi - punguza mzigo |
| -30 hadi -10 | Mafunzo Magumu | Unajenga fitinesi, fuatilia urejeshaji |
| -10 hadi +5 | Bora (Optimal) | Kiwango cha kawaida cha mafunzo |
| +5 hadi +15 | Tayari kwa Mbio | Fitinesi ya kilele - shiriki mbio mwishoni mwa wiki |
| > +25 | Kupoteza Fitinesi | Fitinesi inashuka - ongeza mzigo |
Utekelezaji wa JavaScript:
function calculatePMC(workouts) {
// workouts = [{date: "YYYY-MM-DD", tss: number}, ...]
let ctl = 0, atl = 0;
const results = [];
workouts.forEach(workout => {
// Badilisha CTL (siku 42)
ctl = ctl + (workout.tss - ctl) / 42;
// Badilisha ATL (siku 7)
atl = atl + (workout.tss - atl) / 7;
// Kokotoa TSB (CTL ya jana - ATL ya leo kwa njia ya kawaida)
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 "Hatari Kubwa";
if (tsb < -10) return "Mafunzo Magumu";
if (tsb < 5) return "Bora";
if (tsb < 15) return "Tayari kwa Mbio";
return "Kupoteza Fitinesi";
}
// Mfano wa utumiaji:
const workouts = [
{date: "2025-01-01", tss: 100},
{date: "2025-01-02", tss: 50},
{date: "2025-01-03", tss: 120},
// ... mazoezi mengine
];
const pmc = calculatePMC(workouts);
// Inarudisha array yenye CTL, ATL, TSB ya kila siku
Nguvu dhidi ya Uzito na Vipimo vya Kupanda
8. Uwiano wa Nguvu dhidi ya Uzito (Power-to-Weight Ratio)
Mlinganyo:
Viwango vya FTP W/kg:
| Kiwango | W/kg Wanaume | W/kg Wanawake | Aina |
|---|---|---|---|
| Burudani | 2.5 - 3.5 | 2.0 - 3.0 | Mchezaji wa fitinesi |
| Ushindani | 3.5 - 4.5 | 3.0 - 4.0 | Cat 3-4, wa miaka fulani |
| Uzoefu | 4.5 - 5.5 | 4.0 - 5.0 | Cat 1-2, amateur mwenye nguvu |
| Elite Amateur | 5.5 - 6.0 | 5.0 - 5.5 | Kiwango cha kitaifa |
| Mtaalamu (Pro) | 6.0 - 7.0+ | 5.5 - 6.5+ | World Tour, Grand Tour GC |
Mfano wa Ukokotoaji:
Hali: Mwendeshaji mwenye FTP = 275W, uzito = 70kg
W/kg = 275 / 70 = 3.93 W/kg
Ufafanuzi: Kiwango cha ushindani, unaweza kushindana katika mbio za vilima
function calculateWattsPerKg(power, bodyMassKg) {
return (power / bodyMassKg).toFixed(2);
}
// Mfano:
const wpkg = calculateWattsPerKg(275, 70);
// Inarudisha: 3.93
9. VAM (Velocità Ascensionale Media)
Mlinganyo:
Viwango vya VAM:
| VAM (m/h) | Kiwango | Mfano |
|---|---|---|
| 600 - 900 | Burudani | Mwanachama wa klabu kwenye mlima wa karibu |
| 900 - 1200 | Ushindani | Amateur mzuri kwenye Alpe d'Huez |
| 1200 - 1500 | Elite Amateur | Mpanda milima wa kiwango cha kitaifa |
| 1500 - 1800 | Mtaalamu | World Tour domestique |
| > 1800 | Mshindi wa Grand Tour | Pogačar, Vingegaard kwenye milima mikuu |
Mfano wa Ukokotoaji:
Hali: Kupanda mlima wa Alpe d'Huez
- Kimo (Elevation gain): mita 1100
- Muda: dakika 55 = saa 0.917
- VAM = 1100 / 0.917 = 1200 m/h
Ufafanuzi: Utendaji wa kiwango cha ushindani
function calculateVAM(elevationGainMeters, timeMinutes) {
const hours = timeMinutes / 60;
return Math.round(elevationGainMeters / hours);
}
// Mfano:
const vam = calculateVAM(1100, 55);
// Inarudisha: 1200 m/h
10. Makadirio ya VAM kwenda W/kg
Mlinganyo:
Mfano wa Ukokotoaji:
Hali: Kupanda mlima wenye mwinuko wa wastani wa 8%, VAM = 1200 m/h
W/kg = 1200 / 100 / (8 + 3)
W/kg = 12 / 11 = 4.36 W/kg
Jaribio la ziada: Kwa mwendeshaji wa 70kg → 305W nguvu inayodumishwa mlimani
function estimateWkgFromVAM(vam, gradientPercent) {
return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}
// Mfano:
const wkg = estimateWkgFromVAM(1200, 8);
// Inarudisha: 4.36
Mlinganyo wa Nguvu ya Kiaisia (Aerodynamic)
11. Mahitaji ya Jumla ya Nguvu
Mlinganyo Kamili:
Milinganyo ya Vipengele:
P_aero = CdA × 0.5 × ρ × V³
P_gravity = m × g × sin(θ) × V
P_rolling = Crr × m × g × cos(θ) × V
P_kinetic = m × a × V
Vigezo na Thamani Thabiti:
- CdA = Mgawo wa upinzani × eneo la mbele (m²)
- Wizara ya barabarani (hoods): 0.35-0.40 m²
- Drops: 0.32-0.37 m²
- Mkao wa TT: 0.20-0.25 m²
- ρ = Msongamano wa hewa (1.225 kg/m³ kwenye usawa wa bahari, 15°C)
- V = Kasi (m/s)
- m = Jumla ya uzito (mwendeshaji + baiskeli, kg)
- g = Mvutano wa ardhi (9.81 m/s²)
- θ = Pembe ya mwinuko (radians au nyuzi zilizobadilishwa)
- Crr = Mgawo wa upinzani wa magurudumu (~0.004 kwa matairi mazuri)
- a = Ongezeko la kasi (m/s²)
Mfano wa Ukokotoaji (Mbio dhidi ya Saa Njia Tambarare):
Hali:
- Kasi: 40 km/h = 11.11 m/s
- CdA: 0.22 m² (mkao mzuri wa TT)
- Jumla ya uzito: 75kg (mwendeshaji) + 8kg (baiskeli) = 83kg
- Njia tambarare (gradient = 0°)
- Kasi thabiti (acceleration = 0)
Ukokotoaji:
- P_aero = 0.22 × 0.5 × 1.225 × 11.11³ = 185W
- P_gravity = 0W (njia tambarare)
- P_rolling = 0.004 × 83 × 9.81 × 11.11 = 36W
- P_kinetic = 0W (kasi thabiti)
- P_total = 185 + 0 + 36 + 0 = 221W
Ufafanuzi: Unahitaji 221W ili kudumisha 40 km/h katika mkao wa TT kwenye njia tambarare
Utekelezaji wa JavaScript:
function calculatePowerRequired(params) {
const {
velocityKph,
CdA = 0.32, // m²
rho = 1.225, // kg/m³
mass = 83, // kg (mwendeshaji + baiskeli)
gradientPercent = 0, // %
Crr = 0.004, // rolling resistance
accelerationMps2 = 0 // m/s²
} = params;
// Badilisha kasi kuwa m/s
const V = velocityKph / 3.6;
// Badilisha mwinuko kuwa pembe
const theta = Math.atan(gradientPercent / 100);
// Kokotoa kila kipengele
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)
};
}
// Mfano: TT katika 40 km/h
const power_tt = calculatePowerRequired({
velocityKph: 40,
CdA: 0.22,
mass: 83,
gradientPercent: 0
});
// Inarudisha: { total: 221, aero: 185, gravity: 0, rolling: 36, kinetic: 0 }
// Mfano: 8% climb katika 15 km/h
const power_climb = calculatePowerRequired({
velocityKph: 15,
CdA: 0.38,
mass: 75,
gradientPercent: 8
});
// Inarudisha: { total: 265, aero: 27, gravity: 244, rolling: 11, kinetic: 0 }
Zana Saidizi
Zana za Kubadilisha Vipimo
Utekelezaji wa JavaScript:
// Mabadiliko ya Muda
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')}`;
}
// Mabadiliko ya Kasi
function kphToMps(kph) {
return kph / 3.6;
}
function mpsToKph(mps) {
return mps * 3.6;
}
// Mabadiliko ya Nishati
function joulesTo kJ(joules) {
return joules / 1000;
}
function kJToJoules(kJ) {
return kJ * 1000;
}
function wattsToKJ(watts, durationSeconds) {
return (watts * durationSeconds) / 1000;
}
// Mifano:
formatDuration(7265); // Inarudisha: "2:01:05"
kphToMps(40); // Inarudisha: 11.11 m/s
wattsToKJ(250, 3600); // Inarudisha: 900 kJ (saa 1 katika 250W)
Rasilimali za Utekelezaji
Milinganyo yote kwenye ukurasa huu iko tayari kutumika na imehakikiwa dhidi ya fasihi ya kisayansi na data halisi za mita za nguvu. Itumie kwa zana zako maalum, uhakiki, au uelewa wa ndani zaidi wa ukokotoaji wa mafunzo kulingana na nguvu.
💡 Miongozo Bora
- Hakiki data: Angalia kama nguvu ziko katika viwango vya kawaida (0-2000W), muda chanya
- Shughulikia hali zisizo za kawaida: Kugawanya kwa sifuri, data tupu, kukosekana kwa FTP
- Sawazisha ipasavyo (Round): CTL/ATL/TSB iwe desimali 1, TSS iwe namba kamili, W/kg iwe desimali 2
- Hifadhi usahihi: Baki na usahihi kamili kwenye hifadhidata, sawazisha kwa ajili ya kuonyesha tu
- Manda ya muda: Shughulikia UTC dhidi ya muda wa eneo thabiti kwa uchambuzi wa siku nyingi
- Urekebishaji wa mita ya nguvu: Wakumbushe watumiaji kufanya zero-offset kabla ya safari
- Uhakiki wa FTP: Weka alama kwenye thamani za FTP zenye kutiliwa shaka (>500W au <100W kwa watu wazima)
- Test kikamilifu: Tumia faili za safari zinazojulikana kuwa sahihi ili kuhakiki ukokotoaji wako