तकनीकी संदर्भ और सूत्र
पूर्ण गणितीय कार्यान्वयन
कार्यान्वयन गाइड
इस पृष्ठ में सभी स्विम एनालिटिक्स मेट्रिक्स के लिए कॉपी-पेस्ट करने योग्य सूत्र और चरण-दर-चरण गणना विधियां शामिल हैं। कस्टम कार्यान्वयन, सत्यापन, या गहरी समझ के लिए इनका उपयोग करें।
⚠️ कार्यान्वयन नोट्स
- गणना के लिए सभी समय को सेकंड में परिवर्तित किया जाना चाहिए
- तैराकी की गति उलटी है (उच्च % = धीमी गति)
- हमेशा उचित सीमा के लिए इनपुट को मान्य करें
- किनारे के मामलों को संभालें (शून्य से विभाजन, नकारात्मक मान)
क्या आप मैन्युअल गणना से बचना चाहते हैं? हमारा पढ़ेंप्रशिक्षण भार गाइडया निःशुल्क स्विम एनालिटिक्स ऐप का उपयोग करें।
मुख्य प्रदर्शन मेट्रिक्स (Core Performance Metrics)
क्रांतिक तैराकी गति (CSS, Critical Swim Speed)
सूत्र:
CSS (m/s) = (D₂ - D₁) / (T₂ - T₁)
CSS गति/100m (सेकंड) = (T₄₀₀ - T₂₀₀) / 2
🧪 इंटरएक्टिव कैलकुलेटर - सूत्र का परीक्षण करें
CSS गति (प्रति 100m):
1:49
गणना चरण:
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
गति/100m = 100 / 0.917 = 109 सेकंड = 1:49
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
गति/100m = 100 / 0.917 = 109 सेकंड = 1:49
जावास्क्रिप्ट कार्यान्वयन:
function calculateCSS(distance1, time1, distance2, time2) {
// यदि आवश्यक हो तो समय को सेकंड में बदलें
const t1 = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;
// m/s में CSS की गणना करें
const css_ms = (distance2 - distance1) / (t2 - t1);
// प्रति 100 मीटर गति की गणना सेकंड में करें
const pace_per_100m = 100 / css_ms;
// mm:ss प्रारूप में बदलें
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')}`
};
}
// उपयोग उदाहरण:
const result = calculateCSS(200, 150, 400, 368);
// वापसी: { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }स्विम ट्रेनिंग स्ट्रेस स्कोर (sTSS)
पूर्ण सूत्र:
sTSS = (IF³) × अवधि (घंटे) × 100
IF = NSS / FTP
NSS = कुल दूरी / कुल समय (m/min)
🧪 इंटरएक्टिव कैलकुलेटर - सूत्र का परीक्षण करें
परिकलित sTSS:
55
गणना चरण:
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
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
जावास्क्रिप्ट कार्यान्वयन:
function calculateSTSS(distance, timeMinutes, ftpMetersPerMin) {
// सामान्यीकृत तैरने की गति (NSS) की गणना करें
const nss = distance / timeMinutes;
// तीव्रता कारक (IF) की गणना करें
const intensityFactor = nss / ftpMetersPerMin;
// घंटों की गणना करें
const hours = timeMinutes / 60;
// क्यूबिक तीव्रता कारक का उपयोग करके sTSS की गणना करें
const stss = Math.pow(intensityFactor, 3) * hours * 100;
return Math.round(stss);
}
// उपयोग उदाहरण:
const stss = calculateSTSS(3000, 55, 64.5);
// वापसी: 55
// सहायक: CSS को FTP में बदलें
function cssToFTP(cssPacePer100mSeconds) {
// FTP m/min में = 100m / (मिनट में गति)
return 100 / (cssPacePer100mSeconds / 60);
}
// उदाहरण: CSS 1:33 (93 सेकंड)
const ftp = cssToFTP(93); // वापसी: 64.5 m/minSWOLF
सूत्र:
SWOLF = लैप समय (सेकंड) + स्ट्रोक गिनती
SWOLF₂₅ = (समय × 25/पूल लंबाई) + (स्ट्रोक × 25/पूल लंबाई)
🧪 इंटरएक्टिव कैलकुलेटर - सूत्र का परीक्षण करें
SWOLF स्कोर:
35
गणना:
SWOLF = 20s + 15 स्ट्रोक = 35
SWOLF = 20s + 15 स्ट्रोक = 35
जावास्क्रिप्ट कार्यान्वयन:
function calculateSWOLF(timeSeconds, strokeCount) {
return timeSeconds + strokeCount;
}
function calculateNormalizedSWOLF(timeSeconds, strokeCount, poolLength) {
const normalizedTime = timeSeconds * (25 / poolLength);
const normalizedStrokes = strokeCount * (25 / poolLength);
return normalizedTime + normalizedStrokes;
}
// उदाहरण:
const swolf = calculateSWOLF(20, 15);
// वापसी: 35
const swolf50m = calculateNormalizedSWOLF(40, 30, 50);
// वापसी: 35 (25m तक सामान्यीकृत)स्ट्रोक यांत्रिकी (Stroke Mechanics)
स्ट्रोक दर (SR, Stroke Rate)
सूत्र:
SR = 60 / साइकिल समय (सेकंड)
SR = (स्ट्रोक गिनती / समय सेकंड में) × 60
🧪 इंटरएक्टिव कैलकुलेटर - सूत्र का परीक्षण करें
स्ट्रोक दर (SPM):
72
गणना:
SR = (30 / 25) × 60 = 72 SPM
SR = (30 / 25) × 60 = 72 SPM
जावास्क्रिप्ट कार्यान्वयन:
function calculateStrokeRate(strokeCount, timeSeconds) {
return (strokeCount / timeSeconds) * 60;
}
// उदाहरण:
const sr = calculateStrokeRate(30, 25);
// वापसी: 72 SPMप्रति स्ट्रोक दूरी (DPS, Distance Per Stroke)
सूत्र:
DPS = दूरी / स्ट्रोक गिनती
DPS = दूरी / (SR / 60)
जावास्क्रिप्ट कार्यान्वयन:
function calculateDPS(distance, strokeCount, pushoffDistance = 0) {
const effectiveDistance = distance - pushoffDistance;
return effectiveDistance / strokeCount;
}
// उदाहरण (25m पूल, 5m पुश-ऑफ):
const dps = calculateDPS(25, 12, 5);
// वापसी: 1.67 m/स्ट्रोक
// कई लैप के लिए:
const dps100m = calculateDPS(100, 48, 4 * 5);
// वापसी: 1.67 m/स्ट्रोक (4 लैप × 5m पुश-ऑफ)SR और DPS से वेग
सूत्र:
वेग (m/s) = (SR / 60) × DPS
जावास्क्रिप्ट कार्यान्वयन:
function calculateVelocity(strokeRate, dps) {
return (strokeRate / 60) * dps;
}
// उदाहरण:
const velocity = calculateVelocity(70, 1.6);
// वापसी: 1.87 m/sस्ट्रोक इंडेक्स (SI, Stroke Index)
सूत्र:
SI = वेग (m/s) × DPS (m/स्ट्रोक)
जावास्क्रिप्ट कार्यान्वयन:
function calculateStrokeIndex(velocity, dps) {
return velocity * dps;
}
// उदाहरण:
const si = calculateStrokeIndex(1.5, 1.7);
// वापसी: 2.55प्रदर्शन प्रबंधन चार्ट (PMC)
CTL, ATL, TSB गणना
सूत्र:
CTL आज = CTL कल + (TSS आज - CTL कल) × (1/42)
ATL आज = ATL कल + (TSS आज - ATL कल) × (1/7)
TSB = CTL कल - ATL कल
जावास्क्रिप्ट कार्यान्वयन:
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;
}
// वर्कआउट की एक श्रृंखला के लिए PMC की गणना करें
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;
}
// उपयोग उदाहरण:
const workouts = [
{ date: '2025-01-01', tss: 50 },
{ date: '2025-01-02', tss: 60 },
{ date: '2025-01-03', tss: 45 },
// ... अधिक वर्कआउट
];
const pmc = calculatePMC(workouts);
// वापसी: प्रत्येक दिन के लिए CTL, ATL, TSB के साथ सरणीउन्नत गणना
कई दूरियों से CSS (रिग्रेशन विधि)
जावास्क्रिप्ट कार्यान्वयन:
function calculateCSSRegression(distances, times) {
// रैखिक प्रतिगमन: दूरी = a + b*समय
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, // क्रांतिक तैराकी गति (m/s)
anaerobic_capacity: intercept // एनारोबिक क्षमता (m)
};
}
// कई परीक्षण दूरियों के साथ उदाहरण:
const distances = [100, 200, 400, 800];
const times = [65, 150, 340, 720]; // सेकंड में
const result = calculateCSSRegression(distances, times);
// वापसी: { css: 1.18, anaerobic_capacity: 15.3 }गति से तीव्रता कारक
जावास्क्रिप्ट कार्यान्वयन:
function calculateIntensityFactor(actualPace100m, thresholdPace100m) {
// गति को वेग (m/s) में बदलें
const actualSpeed = 100 / actualPace100m;
const thresholdSpeed = 100 / thresholdPace100m;
return actualSpeed / thresholdSpeed;
}
// उदाहरण:
const if_value = calculateIntensityFactor(110, 93);
// वापसी: 0.845 (सीमा के 84.5% पर तैरना)गति स्थिरता विश्लेषण
जावास्क्रिप्ट कार्यान्वयन:
function analyzePaceConsistency(laps) {
const paces = laps.map(lap => lap.distance / lap.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 ? "उत्कृष्ट" :
coefficientOfVariation < 10 ? "अच्छा" :
coefficientOfVariation < 15 ? "मध्यम" : "परिवर्तनशील"
};
}
// उदाहरण:
const laps = [
{ distance: 100, time: 70 },
{ distance: 100, time: 72 },
{ distance: 100, time: 71 },
// ...
];
const analysis = analyzePaceConsistency(laps);
// वापसी: { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, consistency: "उत्कृष्ट" }स्ट्रोक गणना से थकान का पता लगाना
जावास्क्रिप्ट कार्यान्वयन:
function detectFatigue(laps) {
const firstThird = laps.slice(0, Math.floor(laps.length/3));
const lastThird = laps.slice(-Math.floor(laps.length/3));
const firstThirdAvg = firstThird.reduce((sum, lap) =>
sum + lap.strokeCount, 0) / firstThird.length;
const lastThirdAvg = lastThird.reduce((sum, lap) =>
sum + lap.strokeCount, 0) / lastThird.length;
const strokeCountIncrease = ((lastThirdAvg - firstThirdAvg) / firstThirdAvg) * 100;
return {
firstThirdAvg: Math.round(firstThirdAvg * 10) / 10,
lastThirdAvg: Math.round(lastThirdAvg * 10) / 10,
percentIncrease: Math.round(strokeCountIncrease * 10) / 10,
fatigueLevel: strokeCountIncrease < 5 ? "न्यूनतम" :
strokeCountIncrease < 10 ? "मध्यम" :
strokeCountIncrease < 20 ? "महत्वपूर्ण" : "गंभीर"
};
}
// उदाहरण:
const laps = [
{ strokeCount: 14 }, { strokeCount: 14 }, { strokeCount: 15 },
{ strokeCount: 15 }, { strokeCount: 16 }, { strokeCount: 16 },
{ strokeCount: 17 }, { strokeCount: 18 }, { strokeCount: 18 }
];
const fatigue = detectFatigue(laps);
// वापसी: { firstThirdAvg: 14.3, lastThirdAvg: 17.7, percentIncrease: 23.8, fatigueLevel: "गंभीर" }डेटा सत्यापन
वर्कआउट डेटा गुणवत्ता जांच
जावास्क्रिप्ट कार्यान्वयन:
function validateWorkoutData(workout) {
const issues = [];
// उचित गति सीमा की जांच करें (1:00-5:00 प्रति 100m)
const avgPace = (workout.totalTime / workout.totalDistance) * 100;
if (avgPace < 60 || avgPace > 300) {
issues.push(`असामान्य औसत गति: ${Math.round(avgPace)}s प्रति 100m`);
}
// उचित स्ट्रोक गिनती की जांच करें (10-50 प्रति 25m)
const avgStrokesPer25m = (workout.totalStrokes / workout.totalDistance) * 25;
if (avgStrokesPer25m < 10 || avgStrokesPer25m > 50) {
issues.push(`असामान्य स्ट्रोक गिनती: ${Math.round(avgStrokesPer25m)} प्रति 25m`);
}
// उचित स्ट्रोक दर की जांच करें (30-150 SPM)
const avgSR = calculateStrokeRate(workout.totalStrokes, workout.totalTime);
if (avgSR < 30 || avgSR > 150) {
issues.push(`असामान्य स्ट्रोक दर: ${Math.round(avgSR)} SPM`);
}
// लापता लैप्स की जांच करें (समय अंतराल)
if (workout.laps && workout.laps.length > 1) {
for (let i = 1; i < workout.laps.length; i++) {
const gap = workout.laps[i].startTime -
(workout.laps[i-1].startTime + workout.laps[i-1].duration);
if (gap > 300) { // 5 मिनट का अंतराल
issues.push(`लैप ${i} और ${i+1} के बीच बड़ा अंतराल पाया गया`);
}
}
}
return {
isValid: issues.length === 0,
issues: issues
};
}