Formúlur í hjólreiðum
Stærðfræðilegur grunnur mælikvarða í Bike Analytics
Innleiðingarleiðbeiningar
Þessi síða inniheldur formúlur og skref-fyrir-skref útreikningsaðferðir fyrir alla mælikvarða í Bike Analytics. Notaðu þessar upplýsingar fyrir sérsniðnar innleiðingar, sannprófanir eða til að dýpka skilning þinn á aflþjálfun.
⚠️ Athugasemdir við innleiðingu
- Öll aflgildi eru í vöttum (W), tími í sekúndum nema annað sé tekið fram
- FTP og CP eru einstaklingsbundnir þröskuldar – engin almenn gildi eru til
- Gakktu úr skugga um að inntaksgildi séu innan eðlilegra marka (0-2000W er dæmigert)
- Hafðu stjórn á jaðartilfellum (deiling með núlli, neikvætt afl)
- Aflgögn krefjast 1-sekúndu mælibila fyrir nákvæmni
Helstu frammistöðumælikvarðar
1. Training Stress Score (TSS)
Formúla:
Reiknað dæmi:
Aðstæður: 2 stunda ferð, NP = 235W, FTP = 250W
- Reikna IF: IF = 235 / 250 = 0,94
- Tími í sekúndum: 2 klst × 3600 = 7200 sekúndur
- TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
- TSS = 1.590.720 / 900.000 × 100 = 176,7 TSS
Túlkun: Erfið æfing (>150 TSS), búast má við 2-3 daga endurheimt
JavaScript innleiðing:
function calculateTSS(durationSeconds, normalizedPower, ftp) {
const intensityFactor = normalizedPower / ftp;
const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
return Math.round(tss);
}
// Dæmi um notkun:
const tss = calculateTSS(7200, 235, 250);
// Skilar: 177
2. Normalized Power (NP)
Reiknirit (30-sekúndna hlaupandi meðaltal):
Af hverju 4. veldi?
Fjórðaveldis-sambandið endurspeglar þann lífeðlisfræðilega kostnað sem fylgir óreglulegu átaki. Ferð með rykkjum og lotum kostar meiri orku en ferð á stöðugu afli, jafnvel þótt meðalafl sé það sama.
Dæmi:
- Stöðug ferð: 200W í 1 klst → NP = 200W, Meðalafl = 200W
- Óregluleg ferð: 300W/100W til skiptis → Meðalafl = 200W, NP = 225W
Sama meðalafl, en óreglulega ferðin er með 12% hærra NP vegna lífeðlisfræðilegs kostnaðar við rykki
JavaScript innleiðing:
function calculateNormalizedPower(powerData) {
// powerData er fylki með 1-sekúndu aflgildum
// Skref 1: Reikna 30-sekúndna hlaupandi meðaltal
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);
}
// Skref 2: Setja í 4. veldi
const powered = rollingAvgs.map(p => Math.pow(p, 4));
// Skref 3: Meðaltal af 4. veldis gildum
const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;
// Skref 4: Taka 4. rót
const np = Math.pow(avgPowered, 0.25);
return Math.round(np);
}
// Dæmi um notkun:
const powerData = [/* 1-sekúndu aflfylki */];
const np = calculateNormalizedPower(powerData);
// Skilar: NP í vöttum
3. Intensity Factor (IF)
Formúla:
Túlkunargildi:
| IF bil | Áreynslustig | Dæmi um æfingu |
|---|---|---|
| < 0,75 | Endurheimt / Létt | Active recovery ferð, Svæði 1-2 |
| 0,75 - 0,85 | Þol (Endurance) | Löng stöðug ferð, grunnþol |
| 0,85 - 0,95 | Tempo | "Sweet spot" þjálfun, tempo-lotur |
| 0,95 - 1,05 | Þröskuldur | FTP-lotur, tímatökuátak |
| 1,05 - 1,15 | VO₂max | 5-mínútna lotur, hringkeppni |
| > 1,15 | Loftfirrt | Stuttir sprettir, árásir, rykkir í fjallahjólum |
Reiknað dæmi:
Aðstæður: NP = 235W, FTP = 250W
IF = 235 / 250 = 0,94
Túlkun: Mikið tempo / rétt undir þröskuldi, sjálfbært í 2-3 klukkustundir
function calculateIF(normalizedPower, ftp) {
return (normalizedPower / ftp).toFixed(2);
}
// Dæmi:
const if_value = calculateIF(235, 250);
// Skilar: 0.94
4. Variability Index (VI)
Formúla:
Túlkun eftir greinum:
| Grein | Dæmigert VI | Merking |
|---|---|---|
| Tímataka / Stöðugt átak | 1,00 - 1,05 | Mjög jafnt afl, besta hraðastýring |
| Götuhjólreiðar | 1,05 - 1,10 | Nokkrir rykkir, almennt stöðugt |
| Hringkeppni (Criterium) | 1,10 - 1,20 | Tíðar hröðun og árásir |
| Fjallahjólreiðar (XC) | 1,15 - 1,30+ | Mjög breytilegt, stöðugir rykkir |
Reiknað dæmi:
Götukeppni: NP = 240W, Meðalafl = 230W
VI = 240 / 230 = 1,04 (jöfn taktsstýring)
MTB keppni: NP = 285W, Meðalafl = 235W
VI = 285 / 235 = 1,21 (mjög óreglulegt, rykkir)
function calculateVI(normalizedPower, averagePower) {
return (normalizedPower / averagePower).toFixed(2);
}
// Dæmi:
const vi_road = calculateVI(240, 230); // Skilar: 1.04
const vi_mtb = calculateVI(285, 235); // Skilar: 1.21
Critical Power & W' (Loftfirrt rými)
5. Critical Power (CP) - Línulegt líkan
Formúla:
Útreikningur úr mörgum átökum:
Krefst 2-4 hámarksátaka af mismunandi lengd (t.d. 3, 5, 12, 20 mínútur)
Dæmi um gögn:
| Lengd | Afl (W) | Heildarvinna (kJ) |
|---|---|---|
| 3 mín (180s) | 400W | 72 kJ |
| 5 mín (300s) | 365W | 109,5 kJ |
| 12 mín (720s) | 310W | 223,2 kJ |
| 20 mín (1200s) | 285W | 342 kJ |
Með línulegri aðhvarfsgreiningu (Vinna = CP × Tími + W'):
- CP = 270W (halli aðhvarfslínu)
- W' = 18,5 kJ (skurðpunktur við y-ás)
JavaScript innleiðing:
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
// Línuleg aðhvarfsgreining: 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, // vött
Wprime: Math.round(Wprime * 10) / 10 // kJ
};
}
// Dæmi um notkun:
const efforts = [
{duration: 180, power: 400},
{duration: 300, power: 365},
{duration: 720, power: 310},
{duration: 1200, power: 285}
];
const result = calculateCP_Linear(efforts);
// Skilar: { CP: 270,0, Wprime: 18,5 }
6. W' jafnvægi (W'bal) - Deildajöfnulíkan
Formúlur:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
og ΔCP = (CP - P(t))
Raunverulegt dæmi:
Forsendur: CP = 270W, W' = 18,5 kJ
Atburður 1 - Harður rykkur:
- Ríðandi fer á 400W í 30 sekúndur
- Eyðsla W': (400 - 270) × 30 = 3.900 J = 3,9 kJ
- W'bal eftir: 18,5 - 3,9 = 14,6 kJ
Atburður 2 - Endurheimt:
- Eftir rykk, fer niður í 200W (70W undir CP) í 2 mínútur
- ΔCP = 270 - 200 = 70W
- τ = 546 × e^(-0,01 × 70) + 316 = 588 sekúndur
- Endurheimt á 120s: 18,5 × (1 - e^(-120/588)) = 3,5 kJ endurheimt
- Nýtt W'bal: 14,6 + 3,5 = 18,1 kJ
JavaScript innleiðing:
function calculateWbalance(powerData, CP, Wprime) {
// powerData = fylki af {time: sekúndur, power: vött}
let wbal = Wprime * 1000; // Breyta í joule
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) {
// Eyðsla yfir CP
const expenditure = (power - CP) * dt;
wbal -= expenditure;
} else {
// Endurheimt undir 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;
}
// Passa að W'bal fari ekki yfir hámark eða undir núll
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;
}
// Dæmi um notkun:
const powerData = [
{time: 0, power: 200},
{time: 1, power: 210},
// ... restin af gögnunum
];
const wbalHistory = calculateWbalance(powerData, 270, 18.5);
// Skilar fylki með W'bal gildum yfir tíma
Performance Management Chart (PMC)
7. Útreikningar á CTL, ATL, TSB
Formúlur (Veldisvísisvegnað hlaupandi meðaltal):
Skilgreiningar:
- CTL (Chronic Training Load): 42-daga veldisvísisvegnað meðaltal – táknar form/þol (Fitness)
- ATL (Acute Training Load): 7-daga veldisvísisvegnað meðaltal – táknar þreytu (Fatigue)
- TSB (Training Stress Balance): Form (Form) = Fitness - Fatigue
Reiknað dæmi (7-daga þjálfunarlota):
| Dagur | TSS | CTL | ATL | TSB | Staða |
|---|---|---|---|---|---|
| Mán | 100 | 75.0 | 80.0 | -5.0 | Þjálfun |
| Þri | 50 | 74.4 | 75.7 | -1.3 | Endurheimt |
| Mið | 120 | 75.5 | 82.0 | -6.5 | Hörð þjálfun |
| Fim | 0 | 73.7 | 70.3 | +3.4 | Hvíldardagur |
| Fös | 80 | 73.8 | 71.7 | +2.1 | Hófsamt |
| Lau | 150 | 75.6 | 82.9 | -7.3 | Löng ferð |
| Sun | 40 | 74.8 | 76.8 | -2.0 | Endurheimt |
Túlkun á TSB:
| TSB bil | Staða | Aðgerð |
|---|---|---|
| < -30 | Mikil áhætta | Ofþjálfun – draga úr álagi |
| -30 til -10 | Mikil þjálfun | Byggja upp form, fylgjast með endurheimt |
| -10 til +5 | Ákjósanlegt | Venjulegt æfingabil |
| +5 til +15 | Keppnistilbúin/n | Toppform – keppni um helgina |
| > +25 | Formsýring | Tap á formi (detraining) – auka álag |
JavaScript innleiðing:
function calculatePMC(workouts) {
// workouts = [{date: "YYYY-MM-DD", tss: númer}, ...]
let ctl = 0, atl = 0;
const results = [];
workouts.forEach(workout => {
// Uppfæra CTL (42-daga tímastuðull)
ctl = ctl + (workout.tss - ctl) / 42;
// Uppfæra ATL (7-daga tímastuðull)
atl = atl + (workout.tss - atl) / 7;
// Reikna TSB (CTL gærdagsins - ATL dagsins í dag fyrir hefðbundinn útreikning)
// Til einföldunar hér erum við að nota núverandi gildi
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 "Mikil áhætta";
if (tsb < -10) return "Mikil þjálfun";
if (tsb < 5) return "Ákjósanlegt";
if (tsb < 15) return "Keppnistilbúin/n";
return "Formsýring";
}
// Dæmi um notkun:
const workouts = [
{date: "2025-01-01", tss: 100},
{date: "2025-01-02", tss: 50},
{date: "2025-01-03", tss: 120},
// ... fleiri æfingar
];
const pmc = calculatePMC(workouts);
// Skilar fylki með CTL, ATL, TSB fyrir hvern dag
Afl-við-þyngd og klifurmælikvarðar
8. Afl-við-þyngd hlutfall (W/kg)
Formúla:
FTP W/kg Viðmið:
| Stig | Karlar W/kg | Konur W/kg | Flokkur |
|---|---|---|---|
| Áhugafólk | 2,5 - 3,5 | 2,0 - 3,0 | Heilsurækt |
| Keppnisfólk | 3,5 - 4,5 | 3,0 - 4,0 | Cat 3-4, aldursflokkar |
| Lengra komnir | 4,5 - 5,5 | 4,0 - 5,0 | Cat 1-2, sterkir áhugamenn |
| Afreks fólk | 5,5 - 6,0 | 5,0 - 5,5 | Landsliðs stig |
| Atvinnumenn | 6,0 - 7,0+ | 5,5 - 6,5+ | World Tour, Grand Tour GC |
Reiknað dæmi:
Aðstæður: Hjólreiðamaður með FTP = 275W, þyngd = 70kg
W/kg = 275 / 70 = 3,93 W/kg
Túlkun: Keppnisstig, getur náð góðum árangri í brekkum
function calculateWattsPerKg(power, bodyMassKg) {
return (power / bodyMassKg).toFixed(2);
}
// Dæmi:
const wpkg = calculateWattsPerKg(275, 70);
// Skilar: 3,93
9. VAM (Velocità Ascensionale Media)
Formúla:
VAM Viðmið:
| VAM (m/klst) | Stig | Dæmi |
|---|---|---|
| 600 - 900 | Áhugafólk | Klúbbhjólari í staðbundinni brekku |
| 900 - 1200 | Keppnisfólk | Góður áhugamaður á Alpe d'Huez |
| 1200 - 1500 | Afreks fólk | Landsliðs-klifrari |
| 1500 - 1800 | Atvinnumenn | World Tour hjálparryttari |
| > 1800 | Grand Tour sigurvegari | Pogačar, Vingegaard í stærstu brekkunum |
Reiknað dæmi:
Aðstæður: Alpe d'Huez klifur
- Hækkun: 1100 metrar
- Tími: 55 mínútur = 0,917 klst
- VAM = 1100 / 0,917 = 1200 m/klst
Túlkun: Keppnisstig í klifri
function calculateVAM(elevationGainMeters, timeMinutes) {
const hours = timeMinutes / 60;
return Math.round(elevationGainMeters / hours);
}
// Dæmi:
const vam = calculateVAM(1100, 55);
// Skilar: 1200 m/klst
10. Gróf áætlun á W/kg út frá VAM
Formúla:
Reiknað dæmi:
Aðstæður: Brekka með 8% meðalhalla, VAM = 1200 m/klst
W/kg = 1200 / 100 / (8 + 3)
W/kg = 12 / 11 = 4,36 W/kg
Athugun: Fyrir 70kg hjólara → 305W sjálfbært afl í brekkunni
function estimateWkgFromVAM(vam, gradientPercent) {
return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}
// Dæmi:
const wkg = estimateWkgFromVAM(1200, 8);
// Skilar: 4,36
Loftaflfræðileg afljafna
11. Heildar aflþörf
Heildarformúla:
Þættir formúlunnar:
P_aero = CdA × 0,5 × ρ × V³
P_gravity = m × g × sin(θ) × V
P_rolling = Crr × m × g × cos(θ) × V
P_kinetic = m × a × V
Fastar og breytur:
- CdA = Loftmótstöðustuðull × framflötur (m²)
- Götuhjól (hoods): 0,35-0,40 m²
- Götuhjól (drops): 0,32-0,37 m²
- Tímatökustelling: 0,20-0,25 m²
- ρ = Loftþéttleiki (1,225 kg/m³ við sjávarmál, 15°C)
- V = Hraði (m/s)
- m = Heildarþyngd (hjólreiðamaður + hjól, kg)
- g = Þyngdarhröðun (9,81 m/s²)
- θ = Hallahorn (radíanar)
- Crr = Veltimótstöðustuðull (~0,004 fyrir góð dekk)
- a = Hröðun (m/s²)
Reiknað dæmi (Tímataka á jafnsléttu):
Aðstæður:
- Hraði: 40 km/klst = 11,11 m/s
- CdA: 0,22 m² (góð TT stelling)
- Heildarþyngd: 75kg (hjólari) + 8kg (hjól) = 83kg
- Jafnslétta (halli = 0°)
- Jafn hraði (hröðun = 0)
Útreikningur:
- P_aero = 0,22 × 0,5 × 1,225 × 11,11³ = 185W
- P_gravity = 0W (jafnslétta)
- P_rolling = 0,004 × 83 × 9,81 × 11,11 = 36W
- P_kinetic = 0W (jafn hraði)
- P_total = 185 + 0 + 36 + 0 = 221W
Túlkun: Þarft 221W til að halda 40 km/klst í TT stellingu á jafnsléttu
JavaScript innleiðing:
function calculatePowerRequired(params) {
const {
velocityKph,
CdA = 0.32, // m²
rho = 1.225, // kg/m³
mass = 83, // kg (hjólari + hjól)
gradientPercent = 0, // %
Crr = 0.004, // veltimótstaða
accelerationMps2 = 0 // m/s²
} = params;
// Breyta hraða í m/s
const V = velocityKph / 3.6;
// Breyta halla í horn
const theta = Math.atan(gradientPercent / 100);
// Reikna hvern þátt
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)
};
}
// Dæmi: TT á 40 km/klst
const power_tt = calculatePowerRequired({
velocityKph: 40,
CdA: 0.22,
mass: 83,
gradientPercent: 0
});
// Skilar: { total: 221, aero: 185, gravity: 0, rolling: 36, kinetic: 0 }
Hjálparföll
Einingabreytingar
JavaScript innleiðing:
// Tímabreytingar
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')}`;
}
// Hraðabreytingar
function kphToMps(kph) {
return kph / 3.6;
}
function mpsToKph(mps) {
return mps * 3.6;
}
// Orkubreytingar
function joulesToKJ(joules) {
return joules / 1000;
}
function kJToJoules(kJ) {
return kJ * 1000;
}
function wattsToKJ(watts, durationSeconds) {
return (watts * durationSeconds) / 1000;
}
// Dæmi:
formatDuration(7265); // Skilar: "2:01:05"
kphToMps(40); // Skilar: 11.11 m/s
wattsToKJ(250, 3600); // Skilar: 900 kJ (1 klst á 250W)
Innleiðing
Allar formúlur á þessari síðu eru framleiðslutilbúnar og staðfestar gagnvart vísindagreinum og raunverulegum gögnum úr aflmælum.
💡 Bestu vinnureglur
- Sannreyna inntak: Athugaðu eðlileg aflgildi (0-2000W) og jákvæðan tíma
- Meðhöndla jaðartilfelli: Deiling með núlli, gögn sem vantar eða vantar FTP
- Námunda rétt: CTL/ATL/TSB með 1 aukastaf, TSS sem heiltölu, W/kg með 2 aukastöfum
- Geyma nákvæmni: Geymdu fulla nákvæmni í gagnagrunni, námundaðu aðeins fyrir birtingu
- Tímabelti: Samræmdu notkun UTC og staðartíma fyrir margra daga greiningar
- Mælakvörðun (Calibration): Minntu notendur á að núllstilla (zero-offset) aflmælinn fyrir ferð
- FTP sannreyning: Flaggaðu óeðlilegum FTP gildum (>500W eða <100W fyrir fullorðna)
- Prófaðu rækilega: Notaðu þekkt góð gögn til að sannreyna útreikninga