心率区间入门:把有氧训练跑得更聪明
用 Karvonen 公式算清自己的心率区间,理解有氧训练为什么不该 Always Hard。
目录

有氧训练最常见的两个错误:要么永远慢跑,要么每次都冲到极限。心率区间是介于两者之间最朴素的导航工具——它把”跑多累”变成一个可检查的数字。
先算最大心率
经典估算公式是 220 − 年龄,但个体误差能到 ±10 bpm。更实用的做法是用 心率储备(HRR) 来定义区间,即 Karvonen 公式:
其中 是安静心率(晨起测量最准), 是目标强度百分比。相比直接按最大心率的百分比,Karvonen 把你的起点考虑了进去——对安静心率偏低、底子好的人更公平。
五个区间,各司其职
| 区间 | 强度 (HRR) | 体感 | 用途 |
|---|---|---|---|
| Z1 | 50–60% | 散步级 | 恢复、热身 |
| Z2 | 60–70% | 能完整说话 | 有氧底子、脂肪供能 |
| Z3 | 70–80% | 短句对话 | 马拉松配速 |
| Z4 | 80–90% | 只能蹦单词 | 阈值、乳酸耐受 |
| Z5 | 90–100% | 极限冲刺 | 最大摄氧量 |
多数训练时间应该待在 Z2——这也是”轻松跑反而进步快”的原因。Z4 以上是佐料,不是主食。
用 TypeScript 写一个区间计算器
把公式变成代码,训练表就能自动生成:
interface HeartRateProfile {
resting: number; // 安静心率
max: number; // 最大心率
}
interface Zone {
name: string;
min: number;
max: number;
}
export function karvonenZones(profile: HeartRateProfile): Zone[] {
const reserve = profile.max - profile.resting;
const ranges: Array<[string, number, number]> = [
['Z1', 0.50, 0.60],
['Z2', 0.60, 0.70],
['Z3', 0.70, 0.80],
['Z4', 0.80, 0.90],
['Z5', 0.90, 1.00],
];
return ranges.map(([name, lo, hi]) => ({
name,
min: Math.round(profile.resting + reserve * lo),
max: Math.round(profile.resting + reserve * hi),
}));
}
const zones = karvonenZones({ resting: 55, max: 190 });
console.log(zones.find((z) => z.name === 'Z2')); // { name: 'Z2', min: 128, max: 144 }
把这段跑一次,你就知道自己每次”感觉还行”的慢跑,到底在哪个区间。
强度分布比总里程更重要
很多跑者 Week 看起来很努力,其实 80% 的时间卡在 Z3——不上不下的”垃圾里程”:比 Z2 累得多,又没到 Z4 的刺激强度。更稳的分布是极化模型:大部分时间轻松(Z1–Z2),少部分时间高质量(Z4–Z5)。
耐力的进步来自长期不打折的低强度积累,和偶尔认真的高强度刺激——而不是每一次都咬牙。
小结
- 用 Karvonen 公式,按心率储备而不是最大心率定区间;
- Z2 是底子,Z4 是刺激,Z3 是最容易过度停留的地带;
- 手表给的心率只是参考,晨起安静心率的变化更能说明疲劳状态。
把区间算清楚,是对自己身体最基本的好奇心。
健身有氧心率




