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:

TSS = (tími_sekúndur × NP × IF) / (FTP × 3600) × 100
þar sem IF = NP / FTP

Reiknað dæmi:

Aðstæður: 2 stunda ferð, NP = 235W, FTP = 250W

  1. Reikna IF: IF = 235 / 250 = 0,94
  2. Tími í sekúndum: 2 klst × 3600 = 7200 sekúndur
  3. TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
  4. 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):

1. Reiknaðu 30-sekúndna hlaupandi meðalafl fyrir alla ferðina
2. Settu hvert 30-sekúndna gildi í 4. veldi
3. Takktu meðaltal af öllum þessum gildum í 4. veldi
4. Takktu 4. rót af því meðaltali
NP = ⁴√(meðaltal af [30s_meðaltal^4])

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:

IF = NP / FTP

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:

VI = NP / Meðalafl

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:

Tími = W' / (Afl - CP)
Umritað: Afl × Tími = CP × Tími + W'

Ú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:

Eyðsla (þegar P > CP):
W'exp(t) = ∫(P(t) - CP) dt
Endurheimt (þegar P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
þar sem τ = 546 × e^(-0,01 × ΔCP) + 316
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):

CTL_í_dag = CTL_í_gær + (TSS_í_dag - CTL_í_gær) / 42
ATL_í_dag = ATL_í_gær + (TSS_í_dag - ATL_í_gær) / 7
TSB_í_dag = CTL_í_gær - ATL_í_gær

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:

W/kg = Afl (vött) / Líkamsþyngd (kg)

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 (m/klst) = Hækkun (m) / Tími (klukkustundir)

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:

W/kg ≈ VAM (m/klst) / 100 / (Halli% + 3)

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:

P_total = P_aero + P_gravity + P_rolling + P_kinetic

Þættir formúlunnar:

Loftmótstaða:
P_aero = CdA × 0,5 × ρ × V³
Þyngdarafl (klifur):
P_gravity = m × g × sin(θ) × V
Veltimótstaða:
P_rolling = Crr × m × g × cos(θ) × V
Hreyfiorka (hröðun):
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:

  1. P_aero = 0,22 × 0,5 × 1,225 × 11,11³ = 185W
  2. P_gravity = 0W (jafnslétta)
  3. P_rolling = 0,004 × 83 × 9,81 × 11,11 = 36W
  4. P_kinetic = 0W (jafn hraði)
  5. 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