معادلات قدرة الدراجات
الأساس الرياضي لمقاييس تحليلات الدراجات
دليل التنفيذ
توفر هذه الصفحة معادلات جاهزة للنسخ واللصق وطرق حساب خطوة بخطوة لجميع مقاييس تحليلات الدراجات. استخدمها للتطبيقات المخصصة أو التحقق أو الفهم الأعمق للتدريب القائم على القدرة.
⚠️ ملاحظات التنفيذ
- جميع قيم القدرة بالواط (W)، والوقت بالثواني ما لم يُحدد خلاف ذلك
- FTP و CP هي عتبات فردية خاصة بكل شخص - لا توجد قيم عالمية
- تحقق دائمًا من المدخلات للنطاقات المعقولة (0-2000W نموذجياً)
- تعامل مع الحالات الاستثنائية (القسمة على صفر، القدرة السالبة)
- تتطلب بيانات القدرة فترات تسجيل 1 ثانية للحصول على الدقة
مقاييس الأداء الأساسية
1. درجة إجهاد التدريب (TSS)
المعادلة:
مثال عملي:
السيناريو: رحلة لمدة ساعتين، NP = 235W، FTP = 250W
- حساب IF: IF = 235 / 250 = 0.94
- المدة بالثواني: 2 ساعات × 3600 = 7200 ثانية
- TSS = (7200 × 235 × 0.94) / (250 × 3600) × 100
- 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 ثانية):
لماذا القوة الرابعة؟
تعكس العلاقة الرباعية (القوة الرابعة) التكلفة الفسيولوجية غير الخطية للجهود المتغيرة. الرحلة ذات الزيادات المفاجئة والتعافي تكلف طاقة أكثر من القدرة الثابتة بنفس المتوسط.
مثال:
- رحلة ثابتة: 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 | مستوى الجهد | مثال على التمرين |
|---|---|---|
| < 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 النموذجي | المعنى |
|---|---|---|
| سباق الطريق ضد الساعة / جهد ثابت | 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) - النموذج الخطي
المعادلة:
الحساب من جهود متعددة:
يتطلب 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) - نموذج المعادلة التفاضلية
المعادلات:
W'exp(t) = ∫(P(t) - CP) dt
W'rec(t) = W' × (1 - e^(-t/τ))
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 (حمل التدريب المزمن): متوسط موزون أسياً لـ 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. نسبة القدرة إلى الوزن
المعادلة:
معايير 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:
| 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
المعادلة:
مثال حساب:
السيناريو: تسلق بمتوسط انحدار 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_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)
الحساب:
- P_aero = 0.22 × 0.5 × 1.225 × 11.11³ = 185W
- P_gravity = 0W (طريق مستوٍ)
- P_rolling = 0.004 × 83 × 9.81 × 11.11 = 36W
- P_kinetic = 0W (سرعة ثابتة)
- 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 للبالغين)
- اختبر جيداً: استخدم ملفات رحلة معروفة جيداً للتحقق من الحسابات