openrowingmonitor/docs/concept2_prediction.js

64 lines
2.2 KiB
JavaScript

function calculateWattage(restingHeartRate, maximumHeartRate, heartRate, basePowerOutput) {
function getZonePercentile(heartRate, restingHeartRate, maximumHeartRate) {
const HRR = maximumHeartRate - restingHeartRate;
const zonePercentage = ((heartRate - restingHeartRate) / HRR) * 100;
return Math.round(zonePercentage * 100) / 100;
}
function getHrrRange(zone) {
if (zone <= 65) return [0, 65];
else if (zone <= 70) return [65, 70];
else if (zone <= 80) return [70, 80];
else if (zone <= 85) return [80, 85];
else if (zone <= 95) return [85, 95];
else return [95, 100];
}
function getPowerRange(zone) {
if (zone <= 65) return [0, 45];
else if (zone <= 70) return [45, 60];
else if (zone <= 80) return [60, 70];
else if (zone <= 85) return [70, 80];
else if (zone <= 95) return [80, 105];
else return [105, 115];
}
const zonePercentage = getZonePercentile(heartRate, restingHeartRate, maximumHeartRate);
console.log("Zone:", zonePercentage);
const minPower = getPowerRange(zonePercentage)[0];
const maxPower = getPowerRange(zonePercentage)[1];
const [minHrr, maxHrr] = getHrrRange(zonePercentage);
console.log("Min HRR:", minHrr);
console.log("Max HRR:", maxHrr);
const powerRange = maxPower - minPower;
console.log("Power range:", powerRange);
const hrrRange = maxHrr - minHrr;
console.log("HRR range:", hrrRange);
console.log("Zone minus min HRR:", zonePercentage - minHrr);
const hrrPercentage = (zonePercentage - minHrr) / hrrRange;
console.log("HRR percentage:", hrrPercentage);
const powerPercentage = (minPower + hrrPercentage * powerRange) / 100;
console.log("Power percentage:", powerPercentage);
// Calculate predicted power
const predictedPower = basePowerOutput / powerPercentage;
return Math.round(predictedPower);
}
// Example usage
const restingHeartRate = 58;
const maximumHeartRate = 165;
const heartRate = 132;
const basePowerOutput = 110;
const watts = calculateWattage(restingHeartRate, maximumHeartRate, heartRate, basePowerOutput);
console.log(`Predicted power: ${watts} watts`);