Calculate precise training zones based on your resting heart rate
Target Heart Rate Zone
130 – 155bpm
Max Heart Rate (Est.)
185bpm
Heart Rate Reserve
125bpm
Intensity Range
50 – 85%
What is the Karvonen Formula?
The Karvonen formula is a mathematical method used to determine your target heart rate (THR) training zone. Unlike simple calculations that only consider your age (like the standard "220 minus age" formula), the Karvonen method incorporates your Resting Heart Rate (RHR).
By factoring in your resting heart rate, this formula calculates your Heart Rate Reserve (HRR), which makes the results much more personalized to your specific fitness level. A fit individual with a low resting heart rate will have a different training zone than a beginner, even if they are the same age.
The Logic Behind the Calculation
The calculator uses the following steps to determine your optimal zone:
50% – 60% (Warm Up): Good for beginners, warm-ups, and cool-downs.
60% – 70% (Fat Burning): Optimal zone for mobilizing fat for fuel and building basic endurance.
70% – 80% (Aerobic): Improves cardiovascular system and respiratory health.
80% – 90% (Anaerobic): High-intensity training to improve performance speed and lactic acid tolerance.
90% – 100% (Maximum Effort): Only for short bursts (interval training) by fit individuals.
How to Measure Resting Heart Rate
For the most accurate results using this calculator, measure your pulse in the morning right after you wake up, before getting out of bed. Count your heartbeats for 60 seconds. Do this for 3-4 days and take the average to get your true Resting Heart Rate.
function calculateKarvonen() {
// Get input values
var ageInput = document.getElementById("k_age");
var rhrInput = document.getElementById("k_rhr");
var minIntInput = document.getElementById("k_intensity_min");
var maxIntInput = document.getElementById("k_intensity_max");
var resultSection = document.getElementById("results-display");
var errorMsg = document.getElementById("error-message");
// Parse values
var age = parseFloat(ageInput.value);
var rhr = parseFloat(rhrInput.value);
var minInt = parseFloat(minIntInput.value);
var maxInt = parseFloat(maxIntInput.value);
// Reset error state
errorMsg.style.display = "none";
errorMsg.innerHTML = "";
// Validation logic
if (isNaN(age) || isNaN(rhr) || isNaN(minInt) || isNaN(maxInt)) {
errorMsg.innerHTML = "Please enter valid numbers in all fields.";
errorMsg.style.display = "block";
resultSection.style.display = "none";
return;
}
if (age 120) {
errorMsg.innerHTML = "Please enter a realistic age.";
errorMsg.style.display = "block";
return;
}
if (rhr 200) {
errorMsg.innerHTML = "Resting Heart Rate seems unrealistic. Please check your pulse.";
errorMsg.style.display = "block";
return;
}
if (minInt >= maxInt) {
errorMsg.innerHTML = "Minimum intensity must be lower than maximum intensity.";
errorMsg.style.display = "block";
return;
}
// 1. Calculate Max Heart Rate (MHR)
var maxHeartRate = 220 – age;
// Safety check if RHR > MHR
if (rhr >= maxHeartRate) {
errorMsg.innerHTML = "Your Resting Heart Rate is higher than your estimated Max Heart Rate. Please consult a doctor.";
errorMsg.style.display = "block";
return;
}
// 2. Calculate Heart Rate Reserve (HRR)
var heartRateReserve = maxHeartRate – rhr;
// 3. Calculate Lower Bound Target
// Formula: (HRR * intensity%) + RHR
var lowerBoundBpm = (heartRateReserve * (minInt / 100)) + rhr;
// 4. Calculate Upper Bound Target
var upperBoundBpm = (heartRateReserve * (maxInt / 100)) + rhr;
// Display Results
document.getElementById("max-hr-result").innerText = Math.round(maxHeartRate);
document.getElementById("hrr-result").innerText = Math.round(heartRateReserve);
document.getElementById("target-zone-result").innerText = Math.round(lowerBoundBpm) + " – " + Math.round(upperBoundBpm);
document.getElementById("intensity-range-display").innerText = minInt + " – " + maxInt;
// Show result section
resultSection.style.display = "block";
}