心拍ゾーン
30歳で安静時心拍数が60なら、持久力ゾーンは毎分138〜151拍です。回復から最大努力まで5つのゾーンを、ご自身の心拍予備量をもとにカルボーネン法で計算します。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 年齢
- 30
- 安静時心拍数
- 60
- 最大心拍数
- 190
- 予備心拍数
- 130
カルボーネンの予備心拍数の手法を用いて、年齢と安静時心拍数から 5 つのトレーニングゾーンを計算し、回復・持久・テンポ・閾値・最大努力について 1 分あたり拍数の下限と上限を返します。
心拍予備量がゾーンを決める仕組み
心拍予備量とは、最大心拍数から安静時心拍数を引いた値です。最大心拍数を入力しない場合は220から年齢を引いて推定するので、30歳なら最大は190、安静時が60なら予備量は130拍です。各ゾーンの境目は、安静時心拍数に予備量の一定割合を足し、最も近い整数の拍数に丸めて求めます。そのため、同じ年齢でも安静時心拍数が違えば、ゾーンも変わります。
5つのゾーンと使い方
回復は予備量の50〜60%、持久力は60〜70%、テンポは70〜80%、閾値は80〜90%、最大努力は90〜100%です。上の例では、毎分125〜138拍、138〜151拍、151〜164拍、164〜177拍、177〜190拍になります。インターバル走や持久走の目標として使ったり、腕時計に設定して範囲を外れたときに知らせたりできます。検査や実地テストで測った最大心拍数を使えば、年齢による推定よりも自分に合ったゾーンになります。
なぜゾーンが個別化されるか、そしてどう丸めるか
カルボーネンの式は各強度の帯をあなたの安静時脈拍の上に足すため、ゾーンは個別化されます。
各境界は明示的な half-up 規則 — sign * Math.floor(abs(x) + 0.5) — で小数 0 桁に丸められますので、計算上の 137.5 は切り下げられるのではなく 138 になり、隣り合うゾーンは設計上その境界の拍を共有します(z1 の hi は z2 の lo に等しい)。既定は 'karvonen' です。
活用例
トレーニング計画
2 つの入力から、インターバルと持久のワークアウトに個別化した bpm の目標を生成します。
ウェアラブルのアプリ
ユーザーごとのゾーンの境界を設定し、セッションが目標の帯を外れたときに時計が知らせられるようにします。
よくある質問
いくつのゾーンが返されますか?
5 つです。 回復・持久・テンポ・閾値・最大で、それぞれ lo/hi の bpm の組を持ちます。
カルボーネン法とは何ですか?
最大心拍数と安静時心拍数の差である心拍予備量からゾーンを作る方法です。最大心拍数の一定割合ではなく、安静時心拍数に予備量の一定割合を足して各ゾーンの境目を決めます。
自分で測った最大心拍数を使えますか?
はい。初期設定では220から年齢を引いて最大心拍数を推定しますが、検査や実地テストで測った値を入力すれば、すべてのゾーンがその値で計算し直されます。
隣り合うゾーンの境目が同じ拍数なのはなぜですか?
意図的な仕様で、あるゾーンの上限が次のゾーンの下限になり、すき間ができません。例の値では、持久力ゾーンは151で終わり、テンポゾーンは151から始まります。
安静時心拍数でゾーンが変わるのはなぜですか?
各ゾーンは安静時心拍数の上に積み上げて決まるためです。最大心拍数が同じでも安静時心拍数が違えば目標は変わり、最大心拍数の割合だけの方法ではこの差が出ません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/heart-rate-zones \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":30,"resting_hr":60}'const res = await fetch("https://api.kit.forhosting.com/dev/heart-rate-zones", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 30,
"resting_hr": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/heart-rate-zones",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 30,
"resting_hr": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/heart-rate-zones", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":30,"resting_hr":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":30,"resting_hr":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/heart-rate-zones", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"age": 30,
"resting_hr": 60
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.heart_rate_zones",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
カルボーネンの予備心拍数の式
この計算ツールはカルボーネン法を使います。これは最大心拍数の一律のパーセントではなく、予備心拍数(HRR)からゾーンを組み立てます。5 つのゾーンが返されます。age と resting_hr を必須の整数として受け取ります。max_hr は任意で、既定は 220 から age を引いたものです。HRR は max_hr から resting_hr を引いたもので、各ゾーンの境界は resting_hr + intensity × HRR として計算され、次に最も近い整数の拍に丸められます。z1_recovery(HRR の 50-60%)・z2_endurance(60-70%)・z3_tempo(70-80%)・z4_threshold(80-90%)・z5_max(90-100%)で、それぞれ 1 分あたり拍数の lo/hi の組です。応答は age・resting_hr・max_hr・hrr も返します。年齢 30・resting_hr 60 では、max_hr は 190、HRR は 130、z2_endurance は 138 から 151 bpm にわたります。
なぜゾーンが個別化されるか、そしてどう丸めるか
同じ max_hr でも安静時の心拍が異なる 2 人のアスリートは異なる目標を得ますが、単純な最大値のパーセントのモデルはこれを完全に取りこぼします。任意の max_hr は、年齢の推定を計測した実験室や実地の値で上書きできるようにし、method パラメータはアルゴリズムを記録します。
検証・範囲・型付きエラー
入力はゾーンが組み立てられる前に範囲が検査されます。オブジェクトでない最上位の入力も拒否されます。age は 10 から 100 までの整数、resting_hr は 30 から 120 までの整数でなければなりません。それらの範囲の外、または整数でないものは 'age inválido' や 'resting_hr inválido' のような型付きの invalid_input エラーを送出します。max_hr が指定される場合、resting_hr より厳密に大きい整数でなければならず、そうでなければ 'max_hr inválido' が送出されます — これはゾーンを反転させてしまう負またはゼロの HRR を防ぎます。失敗した API タスクは決して課金されませんので、範囲外の年齢やあり得ない安静時脈拍を、前払い残高を一切使わずにライブのエンドポイントに対して試せます。
連携の活用例
コーチングのツール
アスリートを API に一括で通し、計測した最大心拍数でゾーンの図を作成します。
技術的な質問
どの手法を使いますか?
カルボーネンの式です。resting_hr + intensity × (max_hr - resting_hr)。
最大心拍数を知っている必要がありますか?
いいえ。max_hr の既定は 220 から age を引いたものですが、計測した値で上書きできます。
なぜゾーンの境界が resting_hr に依存するのですか?
カルボーネンは各帯をあなたの安静時脈拍の上に足しますので、ゾーンは最大値の一律のパーセントではなく個別化されます。
無料ですか?
ブラウザ widget では無料です。API は同じコアを呼び出しごとに $0.002 から実行します。