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, testiranje ali poglobljeno razumevanje.
⚠️ Opombe o izvajanju
- Za izračune je treba vse čase pretvoriti v sekunde
- Tempo plavanja je obrnjen (višji odstotek = počasnejši tempo)
- Vedno preverjajte vnose v razumnih intervalih
- Obravnava robne 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 (sekundi) = (T₄₀₀ - T₂₀₀) / 2
🧪 Interaktivni kalkulator - preizkusite formulo
Ritmo CSS na 100m:
1:49
Koraki izračuna:
CSS (m/s) = (400 - 200) / (368 - 150) = 0,917 m/s
Tempo/100 m = 100 / 0,917 = 109 sekund = 1:49
CSS (m/s) = (400 - 200) / (368 - 150) = 0,917 m/s
Tempo/100 m = 100 / 0,917 = 109 sekund = 1:49
Izvedba JavaScripta:
function calculateCSS(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 CSS 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 = calculateCSS(200, 150, 400, 368);
// Returns: { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }
Ocena stresa pri vadbi plavanja (sTSS)
Popolna formula:
sTSS = (IF³) × Durata (ore) × 100
IF = NSS / FTP
NSS = skupna razdalja / skupni čas (m/min)
🧪 Interaktivni kalkulator - preizkusite formulo
sTSS izračunano:
55
Koraki izračuna:
NSS = 3000m / 55min = 54,5 m/min
FTP = 100 / (93/60) = 64,5 m/min
ČE = 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
ČE = 54,5 / 64,5 = 0,845
sTSS = 0,845³ × (55/60) × 100 = 55
Izvedba JavaScripta:
function calculateSTSS(distance, timeMinutes, ftpMetersPerMin) {
// Calculate Normalized Swim 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 CSS to FTP
function cssToFTP(cssPacePer100mSeconds) {
// FTP in m/min = 100m / (pace in minutes)
return 100 / (cssPacePer100mSeconds / 60);
}
// Example: CSS of 1:33 (93 seconds)
const ftp = cssToFTP(93); // Returns: 64.5 m/min
SWOLF
Formula:
SWOLF = čas bazena (sekunde) + število udarcev
SWOLF₂₅ = (Čas × 25/Dolžina bazena) + (Udarci × 25/Dolžina bazena)
🧪 Interaktivni kalkulator - preizkusite formulo
SWOLF rezultat:
35
Izračun:
SWOLF = 20 s + 15 udarcev = 35
SWOLF = 20 s + 15 udarcev = 35
Izvedba JavaScripta:
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;
}
// Example:
const swolf = calculateSWOLF(20, 15);
// Returns: 35
const swolf50m = calculateNormalizedSWOLF(40, 30, 50);
// Returns: 35 (normalized to 25m)
Mehanika kapi
Stopnja kapi (SR)
Formula:
SR = 60 / čas cikla (sekunde)
SR = (število udarcev / čas v sekundah) × 60
🧪 Interaktivni kalkulator - preizkusite formulo
Stopnja udarca (SPM):
72
Izračun:
SR = (30/25) × 60 = 72 SPM
SR = (30/25) × 60 = 72 SPM
Izvedba JavaScripta:
function calculateStrokeRate(strokeCount, timeSeconds) {
return (strokeCount / timeSeconds) * 60;
}
// Example:
const sr = calculateStrokeRate(30, 25);
// Returns: 72 SPM
Razdalja na udarec (DPS)
Formula:
DPS = razdalja / število udarcev
DPS = Razdalja / (SR / 60)
Izvedba JavaScripta:
function calculateDPS(distance, strokeCount, pushoffDistance = 0) {
const effectiveDistance = distance - pushoffDistance;
return effectiveDistance / strokeCount;
}
// Example (25m pool, 5m push-off):
const dps = calculateDPS(25, 12, 5);
// Returns: 1.67 m/stroke
// For multiple laps:
const dps100m = calculateDPS(100, 48, 4 * 5);
// Returns: 1.67 m/stroke (4 laps × 5m push-off)
Hitrost od SR in DPS
Formula:
Hitrost (m/s) = (SR / 60) × DPS
Izvedba JavaScripta:
function calculateVelocity(strokeRate, dps) {
return (strokeRate / 60) * dps;
}
// Example:
const velocity = calculateVelocity(70, 1.6);
// Returns: 1.87 m/s
Indeks kapi (SI)
Formula:
SI = Hitrost (m/s) × DPS (m/hod)
Izvedba JavaScripta:
function calculateStrokeIndex(velocity, dps) {
return velocity * dps;
}
// Example:
const si = calculateStrokeIndex(1.5, 1.7);
// Returns: 2.55
Tabela upravljanja uspešnosti (PMC)
Izračuni CTL, ATL, TSB
Formula:
CTL danes = CTL včeraj + (TSS danes - CTL včeraj) × (1/42)
ATL danes = ATL včeraj + (TSS danes - ATL včeraj) × (1/7)
TSB = CTL včeraj - ATL včeraj
Izvedba JavaScripta:
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 JavaScripta:
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)
};
}
// Example with multiple test distances:
const distances = [100, 200, 400, 800];
const times = [65, 150, 340, 720]; // in seconds
const result = calculateCSSRegression(distances, times);
// Returns: { css: 1.18, anaerobic_capacity: 15.3 }
Faktor intenzivnosti ritma
Izvedba JavaScripta:
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 (swimming at 84.5% of threshold)
Analiza doslednosti ritma
Izvedba JavaScripta:
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 ? "Eccellente" :
coefficientOfVariation < 10 ? "Buona" :
coefficientOfVariation < 15 ? "Moderata" : "Variabile"
};
}
// Example:
const laps = [
{ distance: 100, time: 70 },
{ distance: 100, time: 72 },
{ distance: 100, time: 71 },
// ...
];
const analysis = analyzePaceConsistency(laps);
// Returns: { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, consistency: "Eccellente" }
Zaznavanje utrujenosti s štetjem udarcev
Izvedba JavaScripta:
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 ? "Minima" :
strokeCountIncrease < 10 ? "Moderata" :
strokeCountIncrease < 20 ? "Significativa" : "Severa"
};
}
// Example:
const laps = [
{ strokeCount: 14 }, { strokeCount: 14 }, { strokeCount: 15 },
{ strokeCount: 15 }, { strokeCount: 16 }, { strokeCount: 16 },
{ strokeCount: 17 }, { strokeCount: 18 }, { strokeCount: 18 }
];
const fatigue = detectFatigue(laps);
// Returns: { firstThirdAvg: 14.3, lastThirdAvg: 17.7, percentIncrease: 23.8, fatigueLevel: "Severa" }
Validacija podatkov
Preverjanje kakovosti podatkov o usposabljanju
Izvedba JavaScripta:
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 medio insolito: ${Math.round(avgPace)}s per 100m`);
}
// Check for reasonable stroke counts (10-50 per 25m)
const avgStrokesPer25m = (workout.totalStrokes / workout.totalDistance) * 25;
if (avgStrokesPer25m < 10 || avgStrokesPer25m > 50) {
issues.push(`Conteggio bracciate insolito: ${Math.round(avgStrokesPer25m)} per 25m`);
}
// Check for reasonable stroke rate (30-150 SPM)
const avgSR = calculateStrokeRate(workout.totalStrokes, workout.totalTime);
if (avgSR < 30 || avgSR > 150) {
issues.push(`Frequenza di bracciata insolita: ${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(`Lacuna ampia rilevata tra vasche ${i} e ${i+1}`);
}
}
}
return {
isValid: issues.length === 0,
issues
};
}
// Example:
const workout = {
totalDistance: 2000,
totalTime: 1800, // 30 minutes
totalStrokes: 800,
laps: [/* lap data */]
};
const validation = validateWorkoutData(workout);
// Returns: { isValid: true, issues: [] }
Pomožne funkcije
Pripomoček za pretvorbo časa
Izvedba JavaScripta:
// 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"
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 poglobljeno razumevanje izračunov plavalnih zmogljivosti.
💡 Najboljše prakse
- Potrdi vnose:Pred izračunom preverite razumne razpone
- Upravljanje robnih primerov:Deljenje z ničlo, negativne vrednosti, ničelni podatki
- Ustrezno zaokroži:CTL/ATL/TSB je 1 decimalka, sTSS je intero
- Ohranite natančnost:Ohranite popolno natančnost v bazi podatkov, okroglo za prikaz
- Izčrpno preizkusite:Za preverjanje izračunov uporabite znane in pravilne podatke