Marejeleo ya Kiufundi na Fomula

Utekelezaji Kamili wa Kihesabu

Mwongozo wa Utekelezaji

Ukurasa huu unatoa fomula za kunakili na kubandika na mbinu za kuhesabu hatua kwa hatua kwa vipimo vyote vya Run Analytics. Tumia hizi kwa utekelezaji maalum, uthibitishaji, au uelewa wa kina zaidi.

⚠️ Vidokezo vya Utekelezaji

  • Nyakati zote zinapaswa kubadilishwa kuwa sekunde kwa mahesabu
  • Kasi ya kukimbia ni kinyume (% kubwa = kasi ya polepole)
  • Daima thibitisha ingizo kwa masafa ya busara
  • Shughulikia hali za pembeni (kugawanya kwa sifuri, thamani hasi)

Vipimo Vikuu vya Utendaji

Kasi Muhimu ya Kukimbia (CRS)

Fomula:

CRS (m/s) = (D₂ - D₁) / (T₂ - T₁)
CRS Kasi/100m (sekunde) = (T₄₀₀ - T₂₀₀) / 2

🧪 Kikokotoo cha Maingiliano - Jaribu Fomula

Kasi ya CRS kwa 100m:
1:49
Hatua za hesabu:
CRS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
Kasi/100m = 100 / 0.917 = 109 sekunde = 1:49

Utekelezaji wa JavaScript:

function calculateCRS(distance1, time1, distance2, time2) {
  // Convert times to seconds if needed
  const t1 = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
  const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;

  // Calculate CRS in m/s
  const css_ms = (distance2 - distance1) / (t2 - t1);

  // Calculate pace per 100m in seconds
  const pace_per_100m = 100 / css_ms;

  // Convert to mm:ss format
  const minutes = Math.floor(pace_per_100m / 60);
  const seconds = Math.round(pace_per_100m % 60);

  return {
    css_ms: css_ms,
    pace_seconds: pace_per_100m,
    pace_formatted: `${minutes}:${seconds.toString().padStart(2, '0')}`
  };
}

// Example usage:
const result = calculateCRS(200, 150, 400, 368);
// Returns: { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }

Alama ya Mafunzo ya Kukimbia (sTSS)

Fomula Kamili:

sTSS = (IF³) × Muda (saa) × 100
IF = NSS / FTP
NSS = Jumla ya Umbali / Jumla ya Muda (m/min)

🧪 Kikokotoo cha Maingiliano - Jaribu Fomula

sTSS Iliyokokotolewa:
55
Hatua za hesabu:
NSS = 3000m / 55min = 54.5 m/min
FTP = 100 / (93/60) = 64.5 m/min
IF = 54.5 / 64.5 = 0.845
sTSS = 0.845³ × (55/60) × 100 = 55

Utekelezaji wa JavaScript:

function calculateSTSS(distance, timeMinutes, ftpMetersPerMin) {
  // Calculate Normalized Run Speed
  const nss = distance / timeMinutes;

  // Calculate Intensity Factor
  const intensityFactor = nss / ftpMetersPerMin;

  // Calculate hours
  const hours = timeMinutes / 60;

  // Calculate sTSS using cubed intensity factor
  const stss = Math.pow(intensityFactor, 3) * hours * 100;

  return Math.round(stss);
}

// Example usage:
const stss = calculateSTSS(3000, 55, 64.5);
// Returns: 55

// Helper: Convert CRS to FTP
function cssToFTP(cssPacePer100mSeconds) {
  // FTP in m/min = 100m / (pace in minutes)
  return 100 / (cssPacePer100mSeconds / 60);
}

// Example: CRS of 1:33 (93 seconds)
const ftp = cssToFTP(93); // Returns: 64.5 m/min

Ufanisi wa Kukimbia

Fomula:

Ufanisi wa Kukimbia = Muda wa Kilometa (sekunde) + Idadi ya Hatua
Ufanisi wa Kukimbia₂₅ = (Muda × 25/Urefu wa Njia) + (Hatua × 25/Urefu wa Njia)

🧪 Kikokotoo cha Maingiliano - Jaribu Fomula

Alama ya Ufanisi wa Kukimbia:
35
Hesabu:
Ufanisi wa Kukimbia = 20s + 15 hatua = 35

Utekelezaji wa JavaScript:

function calculateRunning Efficiency(timeSeconds, strideCount) {
  return timeSeconds + strideCount;
}

function calculateNormalizedRunning Efficiency(timeSeconds, strideCount, trackLength) {
  const normalizedTime = timeSeconds * (25 / trackLength);
  const normalizedStrides = strideCount * (25 / trackLength);
  return normalizedTime + normalizedStrides;
}

// Example:
const swolf = calculateRunning Efficiency(20, 15);
// Returns: 35

const swolf50m = calculateNormalizedRunning Efficiency(40, 30, 50);
// Returns: 35 (normalized to 25m)

Ujenzi wa Hatua

Kiwango cha Hatua (SR)

Fomula:

SR = 60 / Muda wa Mzunguko (sekunde)
SR = (Idadi ya Hatua / Muda kwa sekunde) × 60

🧪 Kikokotoo cha Maingiliano - Jaribu Fomula

Kiwango cha Hatua (SPM):
72
Hesabu:
SR = (30 / 25) × 60 = 72 SPM

Utekelezaji wa JavaScript:

function calculateStrideRate(strideCount, timeSeconds) {
  return (strideCount / timeSeconds) * 60;
}

// Example:
const sr = calculateStrideRate(30, 25);
// Returns: 72 SPM

Umbali kwa Hatua (DPS)

Fomula:

DPS = Umbali / Idadi ya Hatua
DPS = Umbali / (SR / 60)

Utekelezaji wa JavaScript:

function calculateDPS(distance, strideCount, pushoffDistance = 0) {
  const effectiveDistance = distance - pushoffDistance;
  return effectiveDistance / strideCount;
}

// Example (25m track, 5m push-off):
const dps = calculateDPS(25, 12, 5);
// Returns: 1.67 m/stride

// For multiple segments:
const dps100m = calculateDPS(100, 48, 4 * 5);
// Returns: 1.67 m/stride (4 segments × 5m push-off)

Kasi kutoka SR na DPS

Fomula:

Kasi (m/s) = (SR / 60) × DPS

Utekelezaji wa JavaScript:

function calculateVelocity(strideRate, dps) {
  return (strideRate / 60) * dps;
}

// Example:
const velocity = calculateVelocity(70, 1.6);
// Returns: 1.87 m/s

Kiashiria cha Hatua (SI)

Fomula:

SI = Kasi (m/s) × DPS (m/hatua)

Utekelezaji wa JavaScript:

function calculateStrideIndex(velocity, dps) {
  return velocity * dps;
}

// Example:
const si = calculateStrideIndex(1.5, 1.7);
// Returns: 2.55

Chati ya Usimamizi wa Utendaji (PMC)

Mahesabu ya CTL, ATL, TSB

Fomula:

CTL leo = CTL jana + (TSS leo - CTL jana) × (1/42)
ATL leo = ATL jana + (TSS leo - ATL jana) × (1/7)
TSB = CTL jana - ATL jana

Utekelezaji wa JavaScript:

function updateCTL(previousCTL, todayTSS) {
  return previousCTL + (todayTSS - previousCTL) * (1/42);
}

function updateATL(previousATL, todayTSS) {
  return previousATL + (todayTSS - previousATL) * (1/7);
}

function calculateTSB(yesterdayCTL, yesterdayATL) {
  return yesterdayCTL - yesterdayATL;
}

// Calculate PMC for series of workouts
function calculatePMC(workouts) {
  let ctl = 0, atl = 0;
  const results = [];

  workouts.forEach(workout => {
    ctl = updateCTL(ctl, workout.tss);
    atl = updateATL(atl, workout.tss);
    const tsb = calculateTSB(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
    });
  });

  return results;
}

// Example usage:
const workouts = [
  { date: '2025-01-01', tss: 50 },
  { date: '2025-01-02', tss: 60 },
  { date: '2025-01-03', tss: 45 },
  // ... more workouts
];

const pmc = calculatePMC(workouts);
// Returns array with CTL, ATL, TSB for each day

Mahesabu ya Kiwango cha Juu

CRS kutoka Umbali Mbalimbali (Njia ya Urejeshi)

Utekelezaji wa JavaScript:

function calculateCRSRegression(distances, times) {
  // Linear regression: distance = a + b*time
  const n = distances.length;
  const sumX = times.reduce((a, b) => a + b, 0);
  const sumY = distances.reduce((a, b) => a + b, 0);
  const sumXY = times.reduce((sum, x, i) => sum + x * distances[i], 0);
  const sumXX = times.reduce((sum, x) => sum + x * x, 0);

  const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
  const intercept = (sumY - slope * sumX) / n;

  return {
    css: slope, // Critical running velocity (m/s)
    anaerobic_capacity: intercept // Anaerobic distance capacity (m)
  };
}

// Example with multiple test distances:
const distances = [100, 200, 400, 800];
const times = [65, 150, 340, 720]; // in seconds
const result = calculateCRSRegression(distances, times);
// Returns: { css: 1.18, anaerobic_capacity: 15.3 }

Kipengele cha Nguvu kutoka Kasi

Utekelezaji wa JavaScript:

function calculateIntensityFactor(actualPace100m, thresholdPace100m) {
  // Convert pace to speed (m/s)
  const actualSpeed = 100 / actualPace100m;
  const thresholdSpeed = 100 / thresholdPace100m;
  return actualSpeed / thresholdSpeed;
}

// Example:
const if_value = calculateIntensityFactor(110, 93);
// Returns: 0.845 (running at 84.5% of threshold)

Uchambuzi wa Uthabiti wa Kasi

Utekelezaji wa JavaScript:

function analyzePaceConsistency(segments) {
  const paces = segments.map(kilometer => kilometer.distance / kilometer.time);
  const avgPace = paces.reduce((a, b) => a + b) / paces.length;

  const variance = paces.reduce((sum, pace) =>
    sum + Math.pow(pace - avgPace, 2), 0) / paces.length;
  const stdDev = Math.sqrt(variance);
  const coefficientOfVariation = (stdDev / avgPace) * 100;

  return {
    avgPace,
    stdDev,
    coefficientOfVariation,
    consistency: coefficientOfVariation < 5 ? "Bora Kabisa" :
                 coefficientOfVariation < 10 ? "Nzuri" :
                 coefficientOfVariation < 15 ? "Wastani" : "Inatofautiana"
  };
}

// Example:
const segments = [
  { distance: 100, time: 70 },
  { distance: 100, time: 72 },
  { distance: 100, time: 71 },
  // ...
];
const analysis = analyzePaceConsistency(segments);
// Returns: { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, consistency: "Bora Kabisa" }

Ugunduzi wa Uchovu kutoka Idadi ya Hatua

Utekelezaji wa JavaScript:

function detectFatigue(segments) {
  const firstThird = segments.slice(0, Math.floor(segments.length/3));
  const lastThird = segments.slice(-Math.floor(segments.length/3));

  const firstThirdAvg = firstThird.reduce((sum, kilometer) =>
    sum + kilometer.strideCount, 0) / firstThird.length;
  const lastThirdAvg = lastThird.reduce((sum, kilometer) =>
    sum + kilometer.strideCount, 0) / lastThird.length;

  const strideCountIncrease = ((lastThirdAvg - firstThirdAvg) / firstThirdAvg) * 100;

  return {
    firstThirdAvg: Math.round(firstThirdAvg * 10) / 10,
    lastThirdAvg: Math.round(lastThirdAvg * 10) / 10,
    percentIncrease: Math.round(strideCountIncrease * 10) / 10,
    fatigueLevel: strideCountIncrease < 5 ? "Kidogo" :
                  strideCountIncrease < 10 ? "Wastani" :
                  strideCountIncrease < 20 ? "Kubwa" : "Kali Sana"
  };
}

// Example:
const segments = [
  { strideCount: 14 }, { strideCount: 14 }, { strideCount: 15 },
  { strideCount: 15 }, { strideCount: 16 }, { strideCount: 16 },
  { strideCount: 17 }, { strideCount: 18 }, { strideCount: 18 }
];
const fatigue = detectFatigue(segments);
// Returns: { firstThirdAvg: 14.3, lastThirdAvg: 17.7, percentIncrease: 23.8, fatigueLevel: "Kali Sana" }

Uthibitishaji wa Data

Ukaguzi wa Ubora wa Data ya Mazoezi

Utekelezaji wa JavaScript:

function validateWorkoutData(workout) {
  const issues = [];

  // Check for reasonable pace ranges (1:00-5:00 per 100m)
  const avgPace = (workout.totalTime / workout.totalDistance) * 100;
  if (avgPace < 60 || avgPace > 300) {
    issues.push(`Kasi ya wastani ya ajabu: ${Math.round(avgPace)}s kwa 100m`);
  }

  // Check for reasonable stride counts (10-50 per 25m)
  const avgStridesPer25m = (workout.totalStrides / workout.totalDistance) * 25;
  if (avgStridesPer25m < 10 || avgStridesPer25m > 50) {
    issues.push(`Idadi ya hatua ya ajabu: ${Math.round(avgStridesPer25m)} kwa 25m`);
  }

  // Check for reasonable stride rate (30-150 SPM)
  const avgSR = calculateStrideRate(workout.totalStrides, workout.totalTime);
  if (avgSR < 30 || avgSR > 150) {
    issues.push(`Kiwango cha hatua cha ajabu: ${Math.round(avgSR)} SPM`);
  }

  // Check for missing segments (gaps in time)
  if (workout.segments && workout.segments.length > 1) {
    for (let i = 1; i < workout.segments.length; i++) {
      const gap = workout.segments[i].startTime -
                  (workout.segments[i-1].startTime + workout.segments[i-1].duration);
      if (gap > 300) { // 5 minute gap
        issues.push(`Pengo kubwa limegunduliwa kati ya sehemu ${i} na ${i+1}`);
      }
    }
  }

  return {
    isValid: issues.length === 0,
    issues
  };
}

// Example:
const workout = {
  totalDistance: 2000,
  totalTime: 1800, // 30 minutes
  totalStrides: 800,
  segments: [/* kilometer data */]
};
const validation = validateWorkoutData(workout);
// Returns: { isValid: true, issues: [] }

Kazi za Kusaidia

Zana za Kubadilisha Muda

Utekelezaji wa JavaScript:

// Convert mm:ss to seconds
function timeToSeconds(timeString) {
  const parts = timeString.split(':');
  return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}

// Convert seconds to mm:ss
function secondsToTime(seconds) {
  const minutes = Math.floor(seconds / 60);
  const secs = Math.round(seconds % 60);
  return `${minutes}:${secs.toString().padStart(2, '0')}`;
}

// Convert seconds to hh:mm:ss
function secondsToTimeDetailed(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')}`;
}

// Examples:
timeToSeconds("1:33"); // Returns: 93
secondsToTime(93); // Returns: "1:33"
secondsToTimeDetailed(3665); // Returns: "1:01:05"

Rasilimali za Utekelezaji

Fomula zote kwenye ukurasa huu ziko tayari kwa uzalishaji na zimethibitishwa dhidi ya maandishi ya kisayansi. Tumia kwa zana za uchambuzi maalum, uthibitishaji, au uelewa wa kina zaidi wa mahesabu ya utendaji wa kukimbia.

💡 Mbinu Bora

  • Thibitisha ingizo: Angalia masafa ya busara kabla ya kuhesabu
  • Shughulikia hali za pembeni: Kugawanya kwa sifuri, thamani hasi, data batili
  • Zungushia ipasavyo: CTL/ATL/TSB hadi desimali 1, sTSS hadi namba kamili
  • Hifadhi usahihi: Weka usahihi kamili kwenye hifadhidata, zungushia kwa kuonyesha
  • Jaribu kikamilifu: Tumia data iliyo nzuri-inayojulikana kuthibitisha mahesabu