资讯动态

用华为云码道实战:下午三点那杯咖啡,晚上十一点体内还剩多少毫克

发布时间:2026/10/15 17:13:05 来源:尧图企业网站定制
下午三点那杯咖啡晚上十一点体内还剩多少毫克一键开通华为云码道 CodeArts 代码智能体 https://developer.huaweicloud.com/codeartsco.html?sourcedmzntgwatomgit1sourceaddmzntgwatomgithd先说这东西是什么一个零依赖的单页网页。你记下几点喝了多少毫克咖啡因填一个半衰期它告诉你在任意时刻体内还剩多少、全天摄入占每日参考量的百分比、以及最早那杯要多久才降到某个水平。仓库在 atomgit.com/yl4928/caffeine-clockMIT双击 index.html 就能跑。先说清楚它不做什么它不说能不能睡着。那是睡眠医学的事涉及腺苷受体、个体耐受、昼夜节律不是一个衰减公式能负责的。它只回答一个纯算术问题还剩多少毫克。为什么做这个我有天下午四点喝了杯美式晚上十一点半躺下睁眼到两点。第二天搜咖啡因 半衰期跳出来一堆5 小时然后就没有然后了——没人告诉我200 mg 那杯到十一点半具体还剩多少也没人告诉我早上那杯其实早就没剩多少了真正起作用的是下午那杯。这个问题本质上是两条小学级别的指数运算但它决定了要不要在下午三点之后继续喝。所以我把它做成了一个能填的页面。一条式子和它的三个推论咖啡因在体内的清除近似一级动力学C(t) C0 · 2^(-t / t½)三个立刻能用的推论经过一个半衰期必为半数 与起始剂量无关 经过两个半衰期剩 1/4 不是减半再减半的一半那种模糊说法 任意时刻起再过 t½还是减半 这叫无记忆性是指数衰减的定义特征拿 100 mg、半衰期 7 小时代谢偏慢的人算一条完整曲线经过时间 h 残留 mg 0 100.000 1 90.572 2 82.034 4 67.295 8 45.286 12 30.475 24 9.28724 小时之后体内还有 9.3 mg。数字小但它说明一件事过了一天就没了是不成立的只是残留在低剂量区。两杯叠加才是真实场景单杯衰减太简单。真实情况是一天里喝好几杯各自按各自的时间衰减然后相加C总(t) Σ C_i · 2^(-(t - t_i) / t½) 只对 t t_i 的杯子里累加默认那两杯08:00 200 mg、15:00 100 mg半衰期 5 小时到 23:00早那杯 200 · 2^(-15/5) 200 · 1/8 25.000 mg 下午那杯 100 · 2^(-8/5) 100 · 0.3299 32.988 mg 合计 57.988 mg结论很反直觉但很清楚到深夜下午那杯的贡献比早上那杯还大33.0 对 25.0虽然它剂量只有四分之一多一点。早上那杯已经衰了三个半衰期而下午那杯才一个半。这就是为什么我早上喝不影响晚上这句话通常是对的而下午三点喝一点关系没有通常不对。半衰期这个数我把它做成输入框而不是常数文献里健康成人的咖啡因血浆半衰期范围大约 3~7 小时中位数常被引为约 5 小时。但这个值受肝功能、妊娠、口服避孕药、吸烟、CYP1A2 基因型影响极大跨度是好几倍。所以界面上它是一个可调参数默认 5旁边一行小字写明文献范围约 3~7 小时个体差异大这里是可调参数不是定值。同理400 mg 是 EFSA 对健康成人单日摄入的参考值界面上写的是占每日参考量的百分比不写安全/超标。把不确定的东西做成输入把确定的算术做成输出——这是这一批三个项目共同的做法。上一批我吃过亏把一个标准值写成标准规定被评审指出我根本没取到一手文本。白色系这一篇的强调色是咖啡棕 #6b4226只出现在主数字、进度条、表头下边框、聚焦态和「记一杯」按钮警示色 #b3261e 只在超过 400 mg 时给进度条上色。全部内联零外部资源file:// 双击可跑。禁止阴影、渐变、动画、emoji、canvas。提示词钉到函数级1) decay(dose, hours, halfLife) dose × Math.pow(2, -hours / halfLife) halfLife 0 抛 RangeErrorhours 0 抛 RangeError 2) remainingAt(doses, t, halfLife) 只对 t atHour 的杯子里累加还没喝的算 0 3) timeToReach(dose, target, halfLife) halfLife × Math.log2(dose / target) 7) integrateDecay(dose, hours, halfLife, dt) 对 dC/dt -k·Ck ln2/halfLife做四阶 Runge-Kutta必须与 decay() 的闭式解吻合第 2 条那个还没喝的算 0是特意写的。如果不加这个判断t - atHour会是负数2 的负数次方变成放大——一杯还没喝的咖啡会给体内预支出剂量。这类 bug 不会报错只会安静地给出荒谬结果。护城河闭式解、数值积分、和一份连 ln 都自己算的参考实现这一批三个项目的护城河打法统一锚点放在纯数学上标准值只当可修改的输入。咖啡因这里数学结构很干净——它有闭式解也有独立数值路径。第一条独立路径是引擎自带的四阶 Runge-KuttadC/dt -k·C, k ln2 / t½ 闭式 decay(200, 7, 5) 75.785828326 数值 integrateDecay(200, 7, 5, 0.01) 75.785828326 数值 integrateDecay(200, 7, 5, 0.2) 误差比 0.01 步长时明显更大步长细化必须单调改善第二条是参考实现。我不允许它跟被测方共用Math.pow和Math.log22^x exp(x·ln2) ln2 2·artanh(1/3) 2·Σ (1/(2n1))·(1/3)^(2n1) exp 参数约化到 |y|1 做泰勒再连乘还原 全程 BigInt 定点比例尺 10^30先自检常数再判引擎ln2 0.693147180560、pi 3.141592653590、exp(-14) 0.000000831529都对上之后跑差分4302 次跨实现断言0 分歧。三条我最看重的不变式比起一堆期望值这三条更能抓错// 1) 半衰期定义任意剂量、任意半衰期经过一个 t½ 必为半数assert.ok(Math.abs(eng.decay(150,3.7,3.7)-75)1e-9);// 2) 串联性先衰 h1 再衰 h2等于一口气衰 h1h2169 组网格不抽样for(leth10;h112;h1)for(leth20;h212;h2)assert.ok(Math.abs(eng.decay(eng.decay(250,h1,4.5),h2,4.5)-eng.decay(250,h1h2,4.5))1e-9);// 3) 可逆反解出的时间代回去必须命中目标constteng.timeToReach(330,41.25,6.2);assert.ok(Math.abs(eng.decay(330,t,6.2)-41.25)1e-9);第 2 条尤其值。把指数写成减法、把半衰期当线性衰减、把2^(-t/t½)写成(1-t/t½)之类的错全都过不了串联性这一关——因为线性模型不满足无记忆性。这一轮我自己踩的坑差分脚本第一次跑静默挂死。我写div(fromNum(level), 10n)想算 t/10但我的div(a,b) a·S/b是给定点÷定点用的把普通整数 10 当定点数除指数被放大到 10⁵⁸exp的参数约化循环要跑 10⁵⁸ 次——不报错就是不动。定点数除以普通整数应该直接用/。同一个库我又用错一次。mul(10n, log10(x))想表达10 乘 log10但 10n 不是定点数结果全被压成 0。第一次跑差分报了 20 条分歧方向很有意思是我的参考实现全 0被测方是对的。如果我没先看分歧内容就冲去质问码道就冤了它一次——上一批我确实干过类似的事。合并文件时撞了标识符。为了把差分脚本自包含地提交进仓库我把数学库和驱动拼一起结果两边都有const PI、const pow2直接 SyntaxError。剔除库里由驱动自定义的那两个声明才对。“降到三分之一这句话我差点写成三分之一小时”。1.58 是半衰期的个数不是小时数。界面上现在写的是「半衰期 7 小时 · 降到三分之一需 1.58 个半衰期」把单位说全。表格第三列有个巧合要标注。初始正好 100 mg 时残留 mg 和占初始 % 数值相同。这不是普适关系我在表下加了一行小字说明免得有人截图发出去被当成证据。提效数据轮次交付结果R1src/engine.js 8 个函数 11 条锚点一次过R2package.json 7 个测试一次过R3index.html 白色系单页一次过控制台干净R4README LICENSE一次过R5evidence/diff.mjs 入库一次过仓库内跑出 4302 断言 0 分歧这一篇最顺因为规格是前两个项目踩坑之后压薄的版本一轮只做一件事规格能短就短会话用久了就新开一个。已知边界不粉饰单室模型不含吸收相。真实喝下后血药浓度先升后降达峰约 30~60 分钟本工具从喝下即为 C0起算因此喝后一小时内的残留量会被高估。不含个体代谢差异、不含耐受性、不区分血液与组织浓度。不做几点能睡着的判断。半衰期描述的是清除速度入睡还受腺苷积累、昼夜节律、心理因素支配超出算术范围。400 mg 参考值来自 EFSA 对健康成人的评估不适用于孕期、哺乳期、青少年及服用影响 CYP1A2 药物的人群。能量饮料、茶、可乐的咖啡因含量波动极大本工具只算你填进去的毫克数不做一杯多少 mg的猜测。一个更真实的场景一天四杯单杯太干净。把一天四杯的时间线摆出来半衰期按 5 小时数值取自仓库里的引擎时刻事件体内残留08:00200 mg200.0 mg12:00150 mg264.9 mg15:00100 mg274.7 mg19:0050 mg207.8 mg23:00—119.4 mg次日 07:00—39.4 mg23:00 那 119.4 mg 拆开看是谁贡献的08:00 那杯 200 mg · 2^(-15/5) 25.00 mg 12:00 那杯 150 mg · 2^(-11/5) 32.65 mg 15:00 那杯 100 mg · 2^(-8/5) 32.99 mg 19:00 那杯 50 mg · 2^(-4/5) 28.72 mg ← 最新那杯傍晚那杯只有 50 mg贡献 28.7 mg几乎追平下午那杯 100 mg 的 33.0 mg。所以晚上那杯我只喝了一半所以没事这个推理不成立剂量小但时间新衰减还没来得及起作用。再看一个边界把查看时刻填回 8 点此时只有 08:00 那杯刚喝下残留就是它自己的 200 mg而 15:00 那杯必须算 0——这正是我在规格里专门写还没喝的算 0的原因。吸收相我为什么给早期结果打上高估标记一级动力学最粗糙的地方在开头。真实曲线喝下后先升后降一室 吸收相Bateman C(t) (F·D·k_a) / (V·(k_a - k)) · (e^(-k·t) - e^(-k_a·t)) 咖啡因达峰约在 30~60 分钟即 k_a 的时间尺度是 0.5~1 小时本工具从喝下即为 C0起算等价于假设吸收瞬间完成。后果是喝后一小时内的残留量被系统性高估一小时后误差快速收敛。我没把 Bateman 做进去因为那要引入 F生物利用度、V分布容积、k_a吸收速率三个我拿不到一手数值的参数——宁可少做一个功能也不把三个猜的常数塞进公式。交付回执与仓库$nodeevidence/diff.mjs 跨实现断言4302次分歧0条顺便交代一件不好听的事仓库简介是我建库那一刻写的当时写的是下午那杯咖啡几点能睡着。做到一半我决定不做睡眠判断理由见上面几节但简介那句还留着。README 和界面都明确写了不做这个结论——简介该改只是它不在代码轮里我把它记成待办而不是假装没这回事。为什么写 2 的幂而不是 e 的幂药代动力学教科书写作 C(t) C0·e^(-kt)k 是消除速率常数。我换成 2^(-t/t½)两者严格等价k ln2 / t½ e^(-k·t) 2^(-t/t½) 验证k 0.693147180559945 / 5 0.138629436111989 /h t 7 h 时 e^(-k·7) 0.378929141627600 2^(-7/5) 0.378929141627600 逐位一致选后者的理由是可验证性和可读性半衰期是普通人唯一记得住的参数每 5 小时减半能心算核对而 k 值没人会去查。同时它给了一条极强的不变式——任意剂量、任意半衰期经过一个 t½ 必为半数——我把这条逐个钉进了测试。引擎里两条路都留着decay() 走 2 的幂integrateDecay() 走 k ln2/t½ 的 RK4 数值积分。两条独立路径必须撞在同一个数上这就是它对账的方式。一个我拒绝加的功能几点能睡做到一半有人我自己提议加一个建议入睡时间。我没做理由有三条一那需要把血药浓度和入睡潜伏期挂钩涉及腺苷受体拮抗的剂量-反应关系我拿不到可复算的一手模型参数。二个体差异CYP1A2 基因型、耐受性、睡眠债跨度远大于公式给出的差异任何具体时刻都会给人虚假的确定感。三一旦界面出现23:00 建议别喝这个工具的性质就从算术变成了建议而我不具备给建议的资格。所以界面里只有残留多少毫克“占参考量百分之几”“还要多久降到某个水平”。判断留给你。三篇共同的方法论这一批分贝叠加、流明到照度、咖啡因残留我沿用了同一套纪律选题 人人都会反复遇到、网上只给大约、且存在可算死的数学结构 锚点 只放在定义式与纯数学上标准值/文献值一律降级为可修改输入 参考实现 30 位定点 BigInt连 π、ln、exp 都自己用级数算不与被测方共用库函数 验证 逐点锚点 性质断言顺序无关/串联性/收敛阶 变异自检 交付 一轮只做一件事规格能短就短会话胖了就新开最难的一直不是让 AI 写代码是让自己有资格判断它写对了。反着用估自己的半衰期半衰期是输入框但同一式子可以反过来解它t½ Δt · log2(C1 / C2)必须说清楚怎么测才算数主观感受不是血药浓度用它反解只能看趋势。真要准需要标准化摄入加血浆采样那是实验室的事。我把这条写在界面对应的 README 已知边界里而不是藏在脚注。一天里还剩一半是几点默认两杯08:00·200 mg、15:00·100 mgt½5 小时引擎给的整数时刻13:00 100.0 mg 200·2^(-5/5) 早杯正好一个半衰期 18:00 116.0 mg 50.00 65.98 反而比 13:00 高 23:00 58.0 mg 25.00 32.99 次日04:00 29.0 mg 12.50 16.4918:00 那行值得盯一眼残留量比 13:00 还高因为下午那杯刚喝 3 小时、还没怎么衰。所以我下午没喝几杯和我体内没多少咖啡因是两件不同的事中间隔着一个叠加。这类反直觉的点是纯算术给的不是经验给的——也是我愿意为这种小工具花时间的原因。这一篇为什么最容易写错三篇里数这篇最危险。分贝和照度的公式错了用户顶多算错一个数咖啡因这篇如果措辞越界就变成给人做健康判断而我没有那个资格。所以我在提示词里写死了一条措辞约束界面不得出现安全/危险/超标有害/会失眠/能睡着只允许残留多少毫克“占每日参考量的百分比”“还要多久降到某水平”。第一版交付后我逐字检查了界面上的每一句话把参考量而不是上限这个词挑出来用也是因为上限暗示了一条不该由我画的线。技术上同样收敛不做吸收相要三个拿不到的参数、不做睡眠预测要剂量-反应模型、不做建议几点之后别喝那是建议。留下的只有一条指数曲线和它的叠加。少做是因为多做的部分我验不了。本地怎么跑gitclone https://atomgit.com/yl4928/caffeine-clock.gitcdcaffeine-clocknpmtest# 零依赖7 个用例nodeevidence/diff.mjs# 定点参考实现 vs 引擎4302 次跨实现断言# 界面双击 index.html写在最后三篇做下来我给自己定了一条挺管用的规矩凡是网上能搜到大约的数字就不要让它进我的代码常量让它进输入框。半衰期大约 3~7 小时——输入框。居住区昼间限值 55 dB——下拉框。阅读照度 300 lx——输入框。而凡是能算死的就一寸不让分贝必须按能量叠加圆盘照度加密十倍网格误差必须降一百倍咖啡因先衰两小时再衰三小时必须等于一口气衰五小时。这些不需要任何机构背书它们是数学。一个工具值不值得信看的不是它敢不敢给结论而是它有没有把我算的和你填的分清楚。本项目只做剂量与时间的算术不构成医疗或营养建议孕期、哺乳期、心血管疾病、服用影响 CYP1A2 药物的人群请遵医嘱。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑