openGym如何计算估算1RM:公式源码剖析与它不猜测超过12次重复的原因
openGym如何计算估算1RM公式源码剖析与它不猜测超过12次重复的原因【免费下载链接】openGymhttps://github.com/DuarteSantos8/openGym项目地址: https://gitcode.com/gh_mirrors/ope/openGymopenGym 是一款可自托管的健身房与体重记录工具它的预估 1RM估算极限重量功能完全由本地代码完成你每组动作记录的重量和次数会被三条经典力学公式换算成这一组大约相当于多少次极限1RM。本文带你读懂这套 onerm.js 源码——它为什么只认重量 × 次数这种组又为什么在 12 次以上直接拒绝给出数字。什么是预估 1RMopenGym 从哪算出来真正站上杠铃挑战一次极限1RM风险很高。更常见的做法是用亚极量负荷反推你做了 100 kg × 5 次就能估算出你的一次极限大约是多少。openGym 里这个估算不依赖任何人工输入来源只有一个地方——你训练日志里已完成的组completed sets每次训练结束应用遍历所有动作条目挑出能产生估算值的最佳一组见 bestSetOf每次训练产生一个数据点串起来就是统计页的1RM 趋势曲线见 e1rmSeries历史最高点会被标出来并附带来自哪一天、哪一组见 best1RM有个刻意的设计topW用户确认的最高工作重量没有附带次数被主动忽略——没有次数就没有估算源码注释写得很直白它无法产生估算值onerm.js#L42-L43。三个公式的源码剖析Epley、Brzycki 与 Lombardi公式集中在 onerm.js#L16-L24 的FORMULAS表里只有三行实现公式数学表达100 kg × 5 次的结果Epley默认w · (1 r/30)116.7 kgBrzyckiw · 36/(37 − r)112.5 kgLombardiw · r^0.10117.5 kg// Epley 1985 — w · (1 r/30) epley: (w, r) w * (1 r / 30), // Brzycki 1993 — w · 36/(37 − r); undefined at r ≥ 37 brzycki: (w, r) w * 36 / (37 - r), // Lombardi 1989 — w · r^0.10 lombardi: (w, r) w * Math.pow(r, 0.1)默认用 Epley因为这是大多数训练者见过的公式onerm.js#L8-L10输入未知公式名时会自动回退到默认值onerm.js#L35三条公式在低次数时高度一致随次数上升逐渐分叉——这正是下一篇的主角REP_CAP存在的理由estimate1RM一次估算的完整校验链核心函数 estimate1RM 不到 10 行但每个分支都有明确目的非有限数直接拒绝——NaN、Infinity、空字符串都不算数重量 ≤ 0 或次数 1 返回null——没有诚实可答的前提就不给数字次数 12 返回null——本文后半部分的主题1 次重复不做估算reps 1 ? weight——1 次极限本身就是测量值不是估算onerm.js#L28结果保留一位小数Math.round(est * 10) / 10还有一处容易被忽略的天然过滤整个模块刻意不知道动作数据库的存在onerm.js#L3-L6。跑步只有{min, speed}、平板支撑只有{sec}没有重量 次数这对数据自然在任何扫描中都出局——不需要一个需要长期维护的动作类型判断。为什么 12 次以上是拒绝猜测而不是保守估计// Above this many reps an estimate says more about work capacity than about maximal strength, // and the formulas disagree by double digits. Refusing to guess beats printing a fantasy. export const REP_CAP 12这句注释onerm.js#L12-L14点出了两个原因语义失效超过 12 次后你测的是工作容量耐力而不是极限力量公式输出的数字已经名不副实公式分叉三条公式在低次数时差距只有几公斤到 12 次时差距被拉开到两位数公斤测试文件 onerm.test.js#L50-L58 用代码锁住了这个论据100 kg 为基准2–8 次重复时三公式最大差值 6 kg而12 次处的差值大于之前任何次数——这就是REP_CAP存在的量化证据。对应的 UI 文案也很克制练习详情页超过 12 次时会显示输入 1–12 次重复——超过这个数字估算就是猜测而正常时标注Epley 公式——由一组推算得出不是实测极限sheets.jsx#L277-L279。估算结果在应用里的三个落点1. 练习详情页的 OneRM 计算器sheets.jsx#L257-L281展示来自你的日志的最佳估算含出处的一组重量、次数、日期并配一个可调重量/次数的即时计算器——哪怕你还没有任何训练历史这个数字也可达。2. 统计页的 1RM 趋势图Stats.jsx#L174-L195Top set / Est. 1RM / Effort 三种曲线可切换。由于只有次数模式训练能产生估算有氧和计时动作的切换项会自动隐藏。3. 结束训练时的破纪录检测sheets.jsx#L935-L948is1RMRecordonerm.js#L77-L82比较本次最佳组与历史最佳估算。注释里有个精妙的区分更重的估算值但顶组不重也是一种进步——同一重量做了更多次数所以单独报告避免被误读成重量 PR。新手速查哪些情况会算出数字哪些不会输入结果100 kg × 1 次100 kg直接返回非估算100 kg × 12 次正常估算上限包含在内100 kg × 13 次null拒绝猜测重量 0 / 负数 / 次数 0null未勾选完成的组忽略见 onerm.test.js#L75-L78跑步 30 分钟 / 平板支撑 60 秒null结构上无重量次数更多边界用例字符串数字输入、空条目、首次估算即纪录等都在 onerm.test.js 里共 148 行是理解这套逻辑最快的阅读材料。小结openGym 的估算 1RM 是一套小而诚实的实现三个经典公式默认 Epley一行一个实现一条校验链无法诚实回答就返回null一条硬上限12 次以上不猜——因为公式在此处已经分歧到两位数公斤全程只读自己的日志不依赖动作类型判断有氧和计时组天然出局所有逻辑仅 onerm.js 一个文件 82 行配合 onerm.test.js 的完整测试覆盖是阅读小型项目数据驱动功能的好样本。如果你自托管了 openGym相关部署说明见 docs/SELF_HOSTING.md移动端安装见 docs/MOBILE.md。【免费下载链接】openGymhttps://github.com/DuarteSantos8/openGym项目地址: https://gitcode.com/gh_mirrors/ope/openGym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考