معادلات قدرة الدراجات

الأساس الرياضي لمقاييس تحليلات الدراجات

دليل التنفيذ

توفر هذه الصفحة معادلات جاهزة للنسخ واللصق وطرق حساب خطوة بخطوة لجميع مقاييس تحليلات الدراجات. استخدمها للتطبيقات المخصصة أو التحقق أو الفهم الأعمق للتدريب القائم على القدرة.

⚠️ ملاحظات التنفيذ

  • جميع قيم القدرة بالواط (W)، والوقت بالثواني ما لم يُحدد خلاف ذلك
  • FTP و CP هي عتبات فردية خاصة بكل شخص - لا توجد قيم عالمية
  • تحقق دائمًا من المدخلات للنطاقات المعقولة (0-2000W نموذجياً)
  • تعامل مع الحالات الاستثنائية (القسمة على صفر، القدرة السالبة)
  • تتطلب بيانات القدرة فترات تسجيل 1 ثانية للحصول على الدقة

مقاييس الأداء الأساسية

1. درجة إجهاد التدريب (TSS)

المعادلة:

TSS = (duration_seconds × NP × IF) / (FTP × 3600) × 100
where IF = NP / FTP

مثال عملي:

السيناريو: رحلة لمدة ساعتين، NP = 235W، FTP = 250W

  1. حساب IF: IF = 235 / 250 = 0.94
  2. المدة بالثواني: 2 ساعات × 3600 = 7200 ثانية
  3. TSS = (7200 × 235 × 0.94) / (250 × 3600) × 100
  4. TSS = 1,590,720 / 900,000 × 100 = 176.7 TSS

التفسير: رحلة تدريبية صعبة (>150 TSS)، يتوقع التعافي خلال 2-3 أيام

تطبيق JavaScript:

function calculateTSS(durationSeconds, normalizedPower, ftp) {
  const intensityFactor = normalizedPower / ftp;
  const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
  return Math.round(tss);
}

// Example usage:
const tss = calculateTSS(7200, 235, 250);
// Returns: 177

2. القدرة المعيارية (NP)

الخوارزمية (متوسط متحرك 30 ثانية):

1. Calculate 30-second rolling average power for entire ride
2. Raise each 30-sec value to the 4th power
3. Take average of all these ^4 values
4. Take 4th root of that average
NP = ⁴√(average of [30s_avg^4])

لماذا القوة الرابعة؟

تعكس العلاقة الرباعية (القوة الرابعة) التكلفة الفسيولوجية غير الخطية للجهود المتغيرة. الرحلة ذات الزيادات المفاجئة والتعافي تكلف طاقة أكثر من القدرة الثابتة بنفس المتوسط.

مثال:

  • رحلة ثابتة: 200W لمدة ساعة → NP = 200W، المتوسط = 200W
  • رحلة متغيرة: بالتناوب 300W/100W → المتوسط = 200W، NP = 225W

نفس متوسط القدرة، لكن الرحلة المتغيرة لديها NP أعلى بنسبة 12% بسبب التكلفة الفسيولوجية للزيادات المفاجئة

تطبيق JavaScript:

function calculateNormalizedPower(powerData) {
  // powerData is array of 1-second power values

  // Step 1: Calculate 30-second rolling averages
  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);
  }

  // Step 2: Raise to 4th power
  const powered = rollingAvgs.map(p => Math.pow(p, 4));

  // Step 3: Average of 4th powers
  const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;

  // Step 4: Take 4th root
  const np = Math.pow(avgPowered, 0.25);

  return Math.round(np);
}

// Example usage:
const powerData = [/* 1-second power array */];
const np = calculateNormalizedPower(powerData);
// Returns: NP in watts

3. عامل الشدة (IF)

المعادلة:

IF = NP / FTP

نطاقات التفسير:

نطاق IF مستوى الجهد مثال على التمرين
< 0.75 استشفاء / سهل رحلة استشفاء نشطة، المنطقة 1-2
0.75 - 0.85 تحمل رحلة طويلة ثابتة، القاعدة الهوائية
0.85 - 0.95 إيقاع تدريب النقطة المثالية، فترات الإيقاع
0.95 - 1.05 عتبة فترات FTP، جهد سباق ضد الساعة
1.05 - 1.15 VO₂max فترات 5 دقائق، سباق معايير
> 1.15 لاهوائي سباقات سريعة قصيرة، هجمات، انفجارات MTB

مثال حساب:

السيناريو: NP = 235W، FTP = 250W

IF = 235 / 250 = 0.94

التفسير: إيقاع عالي / جهد تحت العتبة، مستدام لمدة 2-3 ساعات

function calculateIF(normalizedPower, ftp) {
  return (normalizedPower / ftp).toFixed(2);
}

// Example:
const if_value = calculateIF(235, 250);
// Returns: 0.94

4. مؤشر التباين (VI)

المعادلة:

VI = NP / Average Power

التفسير حسب التخصص:

التخصص VI النموذجي المعنى
سباق الطريق ضد الساعة / جهد ثابت 1.00 - 1.05 قدرة ثابتة جداً، وتيرة مثالية
سباق الطريق 1.05 - 1.10 بعض الزيادات، ثابت عموماً
معايير 1.10 - 1.20 تسارع متكرر وهجمات
دراجات الجبال XC 1.15 - 1.30+ متغير للغاية، زيادات مستمرة

مثال حساب:

سباق الطريق: NP = 240W، متوسط القدرة = 230W

VI = 240 / 230 = 1.04 (وتيرة ثابتة)

سباق MTB: NP = 285W، متوسط القدرة = 235W

VI = 285 / 235 = 1.21 (متغير جداً، جهود انفجارية)

function calculateVI(normalizedPower, averagePower) {
  return (normalizedPower / averagePower).toFixed(2);
}

// Example:
const vi_road = calculateVI(240, 230);  // Returns: 1.04
const vi_mtb = calculateVI(285, 235);   // Returns: 1.21

القدرة الحرجة و W' (السعة اللاهوائية)

5. القدرة الحرجة (CP) - النموذج الخطي

المعادلة:

Time = W' / (Power - CP)
Rearranged: Power × Time = CP × Time + W'

الحساب من جهود متعددة:

يتطلب 2-4 جهود قصوى بمدد مختلفة (مثل 3، 5، 12، 20 دقيقة)

بيانات المثال:

المدة القدرة (W) العمل الكلي (kJ)
3 دقائق (180ث) 400W 72 kJ
5 دقائق (300ث) 365W 109.5 kJ
12 دقيقة (720ث) 310W 223.2 kJ
20 دقيقة (1200ث) 285W 342 kJ

باستخدام الانحدار الخطي (Work = CP × Time + W'):

  • CP = 270W (ميل خط الانحدار)
  • W' = 18.5 kJ (التقاطع مع المحور y)

تطبيق 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
  };
}

// Example usage:
const efforts = [
  {duration: 180, power: 400},
  {duration: 300, power: 365},
  {duration: 720, power: 310},
  {duration: 1200, power: 285}
];

const result = calculateCP_Linear(efforts);
// Returns: { CP: 270.0, Wprime: 18.5 }

6. رصيد W' (W'bal) - نموذج المعادلة التفاضلية

المعادلات:

النفقات (عندما P > CP):
W'exp(t) = ∫(P(t) - CP) dt
الاستشفاء (عندما P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
where τ = 546 × e^(-0.01 × ΔCP) + 316
and ΔCP = (CP - P(t))

مثال من العالم الواقعي:

مواصفات الدراج: CP = 270W، W' = 18.5 kJ

السيناريو 1 - هجوم قوي:

  • يزيد الدراج إلى 400W لمدة 30 ثانية
  • نفقات W': (400 - 270) × 30 = 3,900 J = 3.9 kJ
  • W'bal المتبقي: 18.5 - 3.9 = 14.6 kJ

السيناريو 2 - الاستشفاء:

  • بعد الهجوم، ينخفض إلى 200W (70W تحت CP) لمدة دقيقتين
  • ΔCP = 270 - 200 = 70W
  • τ = 546 × e^(-0.01 × 70) + 316 = 588 ثانية
  • الاستشفاء في 120ث: 18.5 × (1 - e^(-120/588)) = 3.5 kJ تم استرداده
  • W'bal الجديد: 14.6 + 3.5 = 18.1 kJ

تطبيق JavaScript:

function calculateWbalance(powerData, CP, Wprime) {
  // powerData = array of {time: seconds, power: watts}
  let wbal = Wprime * 1000; // Convert to 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) {
      // Expenditure above CP
      const expenditure = (power - CP) * dt;
      wbal -= expenditure;
    } else {
      // Recovery below 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;
    }

    // Ensure W'bal doesn't exceed max or go negative
    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;
}

// Example usage:
const powerData = [
  {time: 0, power: 200},
  {time: 1, power: 210},
  // ... rest of ride data
];

const wbalHistory = calculateWbalance(powerData, 270, 18.5);
// Returns array of W'bal values over time

مخطط إدارة الأداء (PMC)

7. حسابات CTL و ATL و TSB

المعادلات (المتوسطات المتحركة الموزونة أسياً):

CTL_today = CTL_yesterday + (TSS_today - CTL_yesterday) / 42
ATL_today = ATL_yesterday + (TSS_today - ATL_yesterday) / 7
TSB_today = CTL_yesterday - ATL_yesterday

تعريفات المقاييس:

  • CTL (حمل التدريب المزمن): متوسط موزون أسياً لـ 42 يوماً - يمثل اللياقة البدنية
  • ATL (حمل التدريب الحاد): متوسط موزون أسياً لـ 7 أيام - يمثل التعب
  • TSB (توازن إجهاد التدريب): الشكل = اللياقة - التعب

مثال عملي (كتلة تدريب لمدة 7 أيام):

اليوم TSS CTL ATL TSB الحالة
الإثنين 100 75.0 80.0 -5.0 تدريب
الثلاثاء 50 74.4 75.7 -1.3 استشفاء
الأربعاء 120 75.5 82.0 -6.5 تدريب صعب
الخميس 0 73.7 70.3 +3.4 يوم راحة
الجمعة 80 73.8 71.7 +2.1 معتدل
السبت 150 75.6 82.9 -7.3 رحلة طويلة
الأحد 40 74.8 76.8 -2.0 استشفاء

تفسير TSB:

نطاق TSB الحالة الإجراء
< -30 مخاطر عالية تحذير من الإفراط في التدريب - قلل الحمل
-30 إلى -10 تدريب صعب بناء اللياقة، راقب الاستشفاء
-10 إلى +5 مثالي منطقة التدريب العادية
+5 إلى +15 جاهز للسباق شكل الذروة - سابق في نهاية هذا الأسبوع
> +25 فقدان التدريب فقدان اللياقة - زد الحمل

تطبيق JavaScript:

function calculatePMC(workouts) {
  // workouts = [{date: "YYYY-MM-DD", tss: number}, ...]
  let ctl = 0, atl = 0;
  const results = [];

  workouts.forEach(workout => {
    // Update CTL (42-day time constant)
    ctl = ctl + (workout.tss - ctl) / 42;

    // Update ATL (7-day time constant)
    atl = atl + (workout.tss - atl) / 7;

    // Calculate TSB (yesterday's CTL - today's ATL for traditional calculation)
    // For simplicity here using current values
    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 "High Risk";
  if (tsb < -10) return "Training Hard";
  if (tsb < 5) return "Optimal";
  if (tsb < 15) return "Race Ready";
  return "Detraining";
}

// Example usage:
const workouts = [
  {date: "2025-01-01", tss: 100},
  {date: "2025-01-02", tss: 50},
  {date: "2025-01-03", tss: 120},
  // ... more workouts
];

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

مقاييس القدرة إلى الوزن والتسلق

8. نسبة القدرة إلى الوزن

المعادلة:

W/kg = Power (watts) / Body Mass (kg)

معايير FTP W/kg:

المستوى W/kg للذكور W/kg للإناث الفئة
ترفيهي 2.5 - 3.5 2.0 - 3.0 دراج لياقة
تنافسي 3.5 - 4.5 3.0 - 4.0 الفئة 3-4، متسابق فئة عمرية
متقدم 4.5 - 5.5 4.0 - 5.0 الفئة 1-2، هاوي قوي
هاوي نخبة 5.5 - 6.0 5.0 - 5.5 مستوى وطني
محترف 6.0 - 7.0+ 5.5 - 6.5+ World Tour، Grand Tour GC

مثال حساب:

السيناريو: دراج مع FTP = 275W، كتلة الجسم = 70كغ

W/kg = 275 / 70 = 3.93 W/kg

التفسير: مستوى تنافسي، قادر في السباقات الجبلية

function calculateWattsPerKg(power, bodyMassKg) {
  return (power / bodyMassKg).toFixed(2);
}

// Example:
const wpkg = calculateWattsPerKg(275, 70);
// Returns: 3.93

9. VAM (Velocità Ascensionale Media)

المعادلة:

VAM (m/h) = Elevation Gain (m) / Time (hours)

معايير VAM:

VAM (م/س) المستوى مثال
600 - 900 ترفيهي دراج نادي على تسلق محلي
900 - 1200 تنافسي هاوي جيد على Alpe d'Huez
1200 - 1500 هاوي نخبة متسلق مستوى وطني
1500 - 1800 محترف World Tour domestique
> 1800 فائز Grand Tour Pogačar و Vingegaard على التسلقات الرئيسية

مثال حساب:

السيناريو: تسلق Alpe d'Huez

  • كسب الارتفاع: 1100 متر
  • الوقت: 55 دقيقة = 0.917 ساعة
  • VAM = 1100 / 0.917 = 1200 م/س

التفسير: أداء تسلق على مستوى تنافسي

function calculateVAM(elevationGainMeters, timeMinutes) {
  const hours = timeMinutes / 60;
  return Math.round(elevationGainMeters / hours);
}

// Example:
const vam = calculateVAM(1100, 55);
// Returns: 1200 m/h

10. تقدير VAM إلى W/kg

المعادلة:

W/kg ≈ VAM (m/h) / 100 / (Gradient% + 3)

مثال حساب:

السيناريو: تسلق بمتوسط انحدار 8%، VAM = 1200 م/س

W/kg = 1200 / 100 / (8 + 3)

W/kg = 12 / 11 = 4.36 W/kg

التحقق المتقاطع: مع دراج 70كغ → قدرة مستدامة 305W على التسلق

function estimateWkgFromVAM(vam, gradientPercent) {
  return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}

// Example:
const wkg = estimateWkgFromVAM(1200, 8);
// Returns: 4.36

معادلة القدرة الديناميكية الهوائية

11. متطلبات القدرة الكلية

المعادلة الكاملة:

P_total = P_aero + P_gravity + P_rolling + P_kinetic

معادلات المكونات:

السحب الديناميكي الهوائي:
P_aero = CdA × 0.5 × ρ × V³
الجاذبية (التسلق):
P_gravity = m × g × sin(θ) × V
مقاومة الدوران:
P_rolling = Crr × m × g × cos(θ) × V
الحركية (التسارع):
P_kinetic = m × a × V

الثوابت والمتغيرات:

  • CdA = معامل السحب × المساحة الأمامية (م²)
    • دراجة الطريق النموذجية hoods: 0.35-0.40 م²
    • Drops: 0.32-0.37 م²
    • وضعية TT: 0.20-0.25 م²
  • ρ = كثافة الهواء (1.225 كغ/م³ عند مستوى سطح البحر، 15°م)
  • V = السرعة (م/ث)
  • m = الكتلة الكلية (الدراج + الدراجة، كغ)
  • g = الجاذبية (9.81 م/ث²)
  • θ = زاوية الانحدار (راديان أو درجات محولة)
  • Crr = معامل مقاومة الدوران (~0.004 لإطارات الطريق الجيدة)
  • a = التسارع (م/ث²)

مثال عملي (TT على طريق مستوٍ):

السيناريو:

  • السرعة: 40 كم/س = 11.11 م/ث
  • CdA: 0.22 م² (وضعية TT جيدة)
  • الكتلة الكلية: 75كغ (دراج) + 8كغ (دراجة) = 83كغ
  • طريق مستوٍ (انحدار = 0°)
  • سرعة ثابتة (تسارع = 0)

الحساب:

  1. P_aero = 0.22 × 0.5 × 1.225 × 11.11³ = 185W
  2. P_gravity = 0W (طريق مستوٍ)
  3. P_rolling = 0.004 × 83 × 9.81 × 11.11 = 36W
  4. P_kinetic = 0W (سرعة ثابتة)
  5. P_total = 185 + 0 + 36 + 0 = 221W

التفسير: تحتاج 221W للحفاظ على 40 كم/س في وضعية TT على طريق مستوٍ

تطبيق JavaScript:

function calculatePowerRequired(params) {
  const {
    velocityKph,
    CdA = 0.32,              // m²
    rho = 1.225,             // kg/m³
    mass = 83,               // kg (rider + bike)
    gradientPercent = 0,     // %
    Crr = 0.004,             // rolling resistance
    accelerationMps2 = 0     // m/s²
  } = params;

  // Convert velocity to m/s
  const V = velocityKph / 3.6;

  // Convert gradient to angle
  const theta = Math.atan(gradientPercent / 100);

  // Calculate each component
  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)
  };
}

// Example: TT at 40 km/h
const power_tt = calculatePowerRequired({
  velocityKph: 40,
  CdA: 0.22,
  mass: 83,
  gradientPercent: 0
});
// Returns: { total: 221, aero: 185, gravity: 0, rolling: 36, kinetic: 0 }

// Example: 8% climb at 15 km/h
const power_climb = calculatePowerRequired({
  velocityKph: 15,
  CdA: 0.38,
  mass: 75,
  gradientPercent: 8
});
// Returns: { total: 265, aero: 27, gravity: 244, rolling: 11, kinetic: 0 }

وظائف مساعدة

أدوات تحويل الوحدات

تطبيق JavaScript:

// Time conversions
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')}`;
}

// Speed conversions
function kphToMps(kph) {
  return kph / 3.6;
}

function mpsToKph(mps) {
  return mps * 3.6;
}

// Energy conversions
function joulesTo kJ(joules) {
  return joules / 1000;
}

function kJToJoules(kJ) {
  return kJ * 1000;
}

function wattsToKJ(watts, durationSeconds) {
  return (watts * durationSeconds) / 1000;
}

// Examples:
formatDuration(7265);        // Returns: "2:01:05"
kphToMps(40);                // Returns: 11.11 m/s
wattsToKJ(250, 3600);        // Returns: 900 kJ (1 hour at 250W)

موارد التنفيذ

جميع المعادلات في هذه الصفحة جاهزة للإنتاج ومصادق عليها مقابل الأدبيات العلمية وبيانات مقياس القدرة من العالم الواقعي. استخدمها لأدوات التحليل المخصصة أو التحقق أو الفهم الأعمق لحسابات التدريب القائم على القدرة.

💡 أفضل الممارسات

  • التحقق من المدخلات: تحقق من نطاقات القدرة المعقولة (0-2000W)، مدد إيجابية
  • التعامل مع الحالات الاستثنائية: القسمة على صفر، بيانات null/undefined، FTP مفقود
  • التقريب بشكل مناسب: CTL/ATL/TSB إلى رقم عشري واحد، TSS إلى عدد صحيح، W/kg إلى رقمين عشريين
  • تخزين الدقة: احتفظ بالدقة الكاملة في قاعدة البيانات، قرّب فقط للعرض
  • المناطق الزمنية: تعامل مع UTC مقابل الوقت المحلي بشكل متسق لتحليل متعدد الأيام
  • معايرة مقياس القدرة: ذكّر المستخدمين بإعادة الضبط إلى الصفر قبل الرحلات
  • التحقق من FTP: علّم قيم FTP المشبوهة (>500W أو <100W للبالغين)
  • اختبر جيداً: استخدم ملفات رحلة معروفة جيداً للتحقق من الحسابات