Tehnične reference in formule
Popolna matematična implementacija
Vodnik za implementacijo
Ta stran ponuja formule, pripravljene za kopiranje in lepljenje, ter metode izračuna po korakih za vse meritve Swim Analytics. Uporabite jih za implementacije po meri, preverjanje ali globlje razumevanje.
⚠️ Opombe o izvajanju
- Za izračune je treba vse čase pretvoriti v sekunde
- Tempo plavanja je obraten (višji % = počasnejši tempo)
- Vedno preverite vnose za razumne razpone
- Obravnava mejne primere (deljenje z ničlo, negativne vrednosti)
Ključne meritve uspešnosti
Kritična hitrost plavanja (CSS)
Formula:
CSS (m/s) = (D₂ - D₁) / (T₂ - T₁)
CSS Ritmo/100m (segundos) = (T₄₀₀ - T₂₀₀) / 2
🧪 Interaktivni kalkulator - preizkusite formulo
CSS tempo na 100m:
1:49
Koraki izračuna:
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
Ritmo/100m = 100 / 0.917 = 109 segundos = 1:49
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
Ritmo/100m = 100 / 0.917 = 109 segundos = 1:49
Izvedba v JavaScriptu:
function calculateCSS(distance1, time1, distance2, time2) {
// Convertir tiempos a segundos si es necesario
const t1 = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;
// Calcular CSS en m/s
const css_ms = (distance2 - distance1) / (t2 - t1);
// Calcular ritmo por 100m en segundos
const pace_per_100m = 100 / css_ms;
// Convertir a formato 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')}`
};
}
// Ejemplo de uso:
const result = calculateCSS(200, 150, 400, 368);
// Devuelve: { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }
Plavanje TSS (sTSS)
Popolna formula:
sTSS = (IF³) × Duración (horas) × 100
IF = NSS / FTP
NSS = Distancia Total / Tiempo Total (m/min)
🧪 Interaktivni kalkulator - preizkusite formulo
Izračunani sTSS:
55
Koraki izračuna:
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
Izvedba v JavaScriptu:
function calculateSTSS(distance, timeMinutes, ftpMetersPerMin) {
// Izračun normalizirane hitrosti plavanja
const nss = distance / timeMinutes;
// Calcular Factor de Intensidad
const intensityFactor = nss / ftpMetersPerMin;
// Calcular horas
const hours = timeMinutes / 60;
// Calcular sTSS usando factor de intensidad al cubo
const stss = Math.pow(intensityFactor, 3) * hours * 100;
return Math.round(stss);
}
// Ejemplo de uso:
const stss = calculateSTSS(3000, 55, 64.5);
// Devuelve: 55
// Auxiliar: Convertir CSS a FTP
function cssToFTP(cssPacePer100mSeconds) {
// FTP en m/min = 100m / (ritmo en minutos)
return 100 / (cssPacePer100mSeconds / 60);
}
// Ejemplo: CSS de 1:33 (93 segundos)
const ftp = cssToFTP(93); // Devuelve: 64.5 m/min
SWOLF
Formula:
SWOLF = Čas dolžine (sekunde) + Število zaveslajev
SWOLF₂₅ = (Čas × 25/Dolžina bazena) + (Zaveslaji × 25/Dolžina bazena)
🧪 Interaktivni kalkulator - preizkusite formulo
Rezultat SWOLF:
35
Izračun:
SWOLF = 20s + 15 zaveslajev = 35
SWOLF = 20s + 15 zaveslajev = 35
Izvedba v JavaScriptu:
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;
}
// Ejemplo:
const swolf = calculateSWOLF(20, 15);
// Devuelve: 35
const swolf50m = calculateNormalizedSWOLF(40, 30, 50);
// Devuelve: 35 (normalizado a 25m)
Mehanika kapi
Stopnja kapi (SR)
Formula:
SR = 60 / Tiempo de Ciclo (segundos)
SR = (Número de Brazadas / Tiempo en segundos) × 60
🧪 Interaktivni kalkulator - preizkusite formulo
Stopnja udarca (SPM):
72
Izračun:
SR = (30 / 25) × 60 = 72 SPM
SR = (30 / 25) × 60 = 72 SPM
Izvedba v JavaScriptu:
function calculateStrokeRate(strokeCount, timeSeconds) {
return (strokeCount / timeSeconds) * 60;
}
// Primer:
const sr = calculateStrokeRate(30, 25);
// Vrne: 72 SPM
Razdalja na udarec (DPS)
Formula:
DPS = Razdalja / Število zaveslajev
DPS = Razdalja / (SR / 60)
Izvedba v JavaScriptu:
function calculateDPS(distance, strokeCount, pushoffDistance = 0) {
const effectiveDistance = distance - pushoffDistance;
return effectiveDistance / strokeCount;
}
// Primer (bazen 25m, odriv 5m):
const dps = calculateDPS(25, 12, 5);
// Vrne: 1,67 m/zaveslaj
// Za več dolžin:
const dps100m = calculateDPS(100, 48, 4 * 5);
// Vrne: 1,67 m/zaveslaj (4 dolžine × 5m odriv)
Hitrost od SR in DPS
Formula:
Hitrost (m/s) = (SR / 60) × DPS
Izvedba v JavaScriptu:
function calculateVelocity(strokeRate, dps) {
return (strokeRate / 60) * dps;
}
// Primer:
const velocity = calculateVelocity(70, 1.6);
// Vrne: 1,87 m/s
Indeks kapi (SI)
Formula:
SI = Hitrost (m/s) × DPS (m/zaveslaj)
Izvedba v JavaScriptu:
function calculateStrokeIndex(velocity, dps) {
return velocity * dps;
}
// Primer:
const si = calculateStrokeIndex(1.5, 1.7);
// Vrne: 2.55
Tabela upravljanja uspešnosti (PMC)
Izračuni CTL, ATL, TSB
Formule:
CTL hoy = CTL ayer + (TSS hoy - CTL ayer) × (1/42)
ATL hoy = ATL ayer + (TSS hoy - ATL ayer) × (1/7)
TSB = CTL ayer - ATL ayer
Izvedba v JavaScriptu:
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
Napredni izračuni
CSS iz več razdalj (metoda regresije)
Izvedba v JavaScriptu:
function calculateCSSRegression(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 swimming velocity (m/s)
anaerobic_capacity: intercept // Anaerobic distance capacity (m)
};
}
// Ejemplo con múltiples distancias de prueba:
const distances = [100, 200, 400, 800];
const times = [65, 150, 340, 720]; // en segundos
const result = calculateCSSRegression(distances, times);
// Devuelve: { css: 1.18, anaerobic_capacity: 15.3 }
Faktor intenzivnosti iz ritma
Izvedba v JavaScriptu:
function calculateIntensityFactor(actualPace100m, thresholdPace100m) {
// Convert pace to speed (m/s)
const actualSpeed = 100 / actualPace100m;
const thresholdSpeed = 100 / thresholdPace100m;
return actualSpeed / thresholdSpeed;
}
// Ejemplo:
const if_value = calculateIntensityFactor(110, 93);
// Devuelve: 0.845 (nadando al 84.5% del umbral)
Analiza doslednosti ritma
Izvedba v JavaScriptu:
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 ? "Excelente" :
coefficientOfVariation < 10 ? "Buena" :
coefficientOfVariation < 15 ? "Moderada" : "Variable"
};
}
// Ejemplo:
const laps = [
{ distance: 100, time: 70 },
{ distance: 100, time: 72 },
{ distance: 100, time: 71 },
// ...
];
const analysis = analyzePaceConsistency(laps);
// Devuelve: { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, consistency: "Excelente" }
Zaznavanje utrujenosti s štetjem udarcev
Izvedba v JavaScriptu:
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 ? "Mínima" :
strokeCountIncrease < 10 ? "Moderada" :
strokeCountIncrease < 20 ? "Significativa" : "Severa"
};
}
// Ejemplo:
const laps = [
{ strokeCount: 14 }, { strokeCount: 14 }, { strokeCount: 15 },
{ strokeCount: 15 }, { strokeCount: 16 }, { strokeCount: 16 },
{ strokeCount: 17 }, { strokeCount: 18 }, { strokeCount: 18 }
];
const fatigue = detectFatigue(laps);
// Devuelve: { firstThirdAvg: 14.3, lastThirdAvg: 17.7, percentIncrease: 23.8, fatigueLevel: "Severa" }
Validacija podatkov
Preverjanje kakovosti podatkov o usposabljanju
Izvedba v JavaScriptu:
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(`Ritmo promedio inusual: ${Math.round(avgPace)}s por 100m`);
}
// Check for reasonable stroke counts (10-50 per 25m)
const avgStrokesPer25m = (workout.totalStrokes / workout.totalDistance) * 25;
if (avgStrokesPer25m < 10 || avgStrokesPer25m > 50) {
issues.push(`Neobičajno število zaveslajev: ${Math.round(avgStrokesPer25m)} na 25 m`);
}
// Check for reasonable stroke rate (30-150 SPM)
const avgSR = calculateStrokeRate(workout.totalStrokes, workout.totalTime);
if (avgSR < 30 || avgSR > 150) {
issues.push(`Neobičajna frekvenca zaveslajev: ${Math.round(avgSR)} SPM`);
}
// Check for missing laps (gaps in time)
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 minute gap
issues.push(`Hueco grande detectado entre largos ${i} y ${i+1}`);
}
}
}
return {
isValid: issues.length === 0,
issues
};
}
// Ejemplo:
const workout = {
totalDistance: 2000,
totalTime: 1800, // 30 minutos
totalStrokes: 800,
laps: [/* datos de largos */]
};
const validation = validateWorkoutData(workout);
// Devuelve: { isValid: true, issues: [] }
Pomožne funkcije
Pripomočki za pretvorbo časa
Izvedba v JavaScriptu:
// 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')}`;
}
// Ejemplos:
timeToSeconds("1:33"); // Devuelve: 93
secondsToTime(93); // Devuelve: "1:33"
secondsToTimeDetailed(3665); // Devuelve: "1:01:05"
Izvedbeni viri
Vse formule na tej strani so pripravljene za proizvodnjo in potrjene glede na znanstveno literaturo. Uporabite jih za orodja za analizo po meri, preverjanje ali globlje razumevanje izračunov plavalnih zmogljivosti.
💡 Najboljše prakse
- Potrdi vnose:Pred izračunom preverite razumne razpone
- Obravnava mejne primere:Deljenje z ničlo, negativne vrednosti, ničelni podatki
- Ustrezno zaokroži:CTL/ATL/TSB na 1 decimalko, sTSS na celo število
- Shranjuje natančnost:Ohranite popolno natančnost v bazi podatkov, zaokrožite za prikaz
- Temeljito preizkusite:Za preverjanje izračunov uporabite znane in pravilne podatke