生活与科普工具
公式、节律、配平与显著性检验
生活与科普工具里的算法
站内工具区躺着几十个小工具:计算器、番茄钟、方程配平器、t 检验,分属生活计算、专注节律、化学配平、统计检验四类。这篇逐类说明它们的设计:公式从哪里来、节律为什么有效、守恒如何变成方程、显著性为什么总被读错。这些工具的共同点,是把一条公式和一条适用边界装进同一个界面。
生活计算器的公式与边界
公式是显式的,边界却常常是隐式的。它藏在输入校验的范围里,藏在结果分档的阈值里,藏在「估算仅供参考」的免责声明里。公式与边界各占一半篇幅,因为一个诚实的计算器,后半句和前半句一样重要。
动手版本:BMI 计算器、血液酒精浓度、贷款计算器、金融计算工具箱、健身工具箱、排卵期追踪、FX 工具箱。
一条公式与一条边界
把站里的计算器按公式来源分,能分成三类。
定义式。BMI、体脂换算这类按约定成立的指标,不存在「算错」,只存在「定义不适用」。
经验回归式。Deurenberg 体脂公式、Widmark 血酒公式、最大心率公式。对某个总体做统计拟合的产物,对个体必有偏差。
制度参数式。等额本息月供、个人所得税。参数由合同或政策规定,公式本身是精确的,误差全在输入端。
边界则对应三种写法。
第一种是输入校验。身高限制在 300cm 以内、体重限制在 500kg 以内,防的是笔误而不是真实的生理可能。
第二种是阈值分档。18.5、24、28 这些切点把连续的输出切成有名字的档位,切点本身是边界最硬的部分。
第三种是免责声明。血酒计算器的输出下面挂着一行「估算而已,勿驾车」。这是公式作者能做的最后一道防线。
三类公式与三种边界组合起来,就是本节全部内容的地图。
BMI
BMI 大概是世界上被计算次数最多的指数之一。,体重公斤数除以身高米数的平方。
19 世纪统计学家凯特勒在大量人体数据里发现,成年人的体重与身高的平方大体成正比。
注意这个「大体」。如果人体是等比缩放的几何体,重量应该随身高的三次方增长。但人长高主要是骨架拉长,横截面的扩张慢于线性。
经验拟合的最佳指数介于 2 与 3 之间、最接近 2,于是 成了妥协的产物。
这个妥协的直接后果是:BMI 对个子极高和极矮的人系统性失真,对极端身高更合理的其实是三次方版本的 Ponderal 指数。但 在大众区间里拟合得足够好,简单到可以心算,于是成了世界通用的语言。
源码里 被用了两个方向。
正向是常规操作:把身高体重代入得指数。
反向更有意思:把分档阈值还原成体重区间。理想体重就是 到 公斤,区间随身高平方伸缩。
这比任何「标准体重表」都干净。一张表是几百个离散数字,一条公式是全部身高。
基础版的仪表盘量程设在 10 到 40,恰好覆盖了人类身高体重的几乎所有组合。
分档阈值 18.5 / 24 / 28 是中国成人标准(WS/T 428)的超重与肥胖切点,比 WHO 的 25 / 30 更严。
同一具身体,换一张阈值表就换一个诊断。这是定义式公式最赤裸的边界:切点不是自然常数,是流行病学给出的政策参数。
它取决于统计人群、取决于医保预算、取决于某个委员会对「风险拐点」的投票。
BMI+ 子项里的体脂率走的是另一条路。经验回归式。
Deurenberg 公式把体脂率写成 (女性不减 10.8)。
注意它的自变量:体脂率被表示成 BMI 的函数。它不是独立的测量,只是把 BMI 翻译成体脂的语言。
BMI 的一切失真会被原样继承。对肌肉量大的人(BMI 高、体脂低),它必然高估。对老年人(肌肉流失、BMI 不高、体脂不低),它必然低估。
1991 年这条公式发表时拟合的是白人总体,族群的体成分差异又是一层未声明的边界。
同一个工具箱的营养标签页把经验公式接力了下去。Mifflin–St Jeor 基础代谢 (男性,女性减 161),乘以 1.2 到 1.9 的活动系数得每日消耗,再按 30/40/30 拆成蛋白质、碳水、脂肪。
三条回归式首尾相接,误差也逐级传递,每一环都该在心里打个九折。
从统计的角度看,BMI 阈值其实就是在人群分布上切几个分位数。
身高与体重是一对相关的随机变量,「超重」切的是风险曲线的拐点而非个体的真相。
这类「许多小因素相加堆出钟形曲线」的机制,站内那篇高尔顿板用三个撒点实验演示得很直观。
BMI 的分档之争,就是对同一条分布曲线该在哪里下刀的争论。
Widmark 公式
血液酒精浓度的估算公式是 20 世纪二三十年代瑞典化学家 Widmark 留下的,今天仍是所有 BAC 计算器的祖版。
源码里它只有一行:
bac = (alcohol / (weight * r)) / 10 - 0.015 * hours拆开看,前一项是稀释。 克纯酒精摊进 千克体液里( 是体重公斤数),除以 10 换成百分比浓度(克每百毫升)。
叫分布比率,物理含义是「酒精能到达的体液占体重的比例」。酒精几乎不溶于脂肪,只溶于水,于是男性取 0.68、女性取 0.55,两性的差异被压缩成一个参数。
后一项是清除。肝脏以近似恒定的速率代谢酒精,每小时约 0.015%。对 70 公斤的男性折合约 7 克纯酒精。
恒速清除是零级动力学的特征,在常见浓度下酒精代谢确实近似如此。这是这条 1920 年代的公式至今不衰的原因。
举个完整的例子。70 公斤男性饮入 50 克纯酒精。约两瓶半 500ml 的啤酒,或二两半 52 度白酒。
峰值浓度 。两小时后减去 ,约 。
对照源码里的三档阈值 0.02 / 0.05 / 0.08。起步微醺、显著受损、触线违法。
这三个数字与法规严丝合缝。美国法定醉驾上限 0.08%,中国的醉驾标准 80mg/100ml 即 0.08%、饮酒驾驶标准 20mg/100ml 即 0.02%。
计算器的分档阈值直接引用法条,公式因此有了法律后果。
这条公式的边界写在它没建模的地方。
它假设酒精瞬间全部入血。没有吸收曲线,不考虑胃里有没有食物、饮酒花了多久。峰值出现在第 0 小时,真实世界通常要推迟半小时到两小时。
它假设代谢率是群体均值。个体差异可达两三倍,慢代谢者同样的酒量需要多得多的时间归零。
所以输出下面那行「估算而已,勿驾车」,是这条公式最诚实的部分。它最危险的用法恰恰是在它最准的时候。用户盯着 0.079 这样的「安全」数字发动汽车。
月供推导
贷款计算器是制度参数式公式的典型:公式精确,参数写在合同里。
等额本息的月供公式要完整推一遍,因为它就是一条几何级数。
设本金 ,月利率 (年利率除以 12),共 期。每月还固定金额 ,第 期还款的现值是 。
「还清」的定义是全部还款的现值之和等于本金:
解出:
源码一行照抄,总利息就是 。
等额本金则是另一种现金流安排。每月还固定本金 ,利息按当月余额计算,第 期月供为 ,逐月递减 。
总利息是等差数列求和 。
代入源码的默认参数。100 万、3.1%、30 年(,)。
等额本息月供约 4271 元,总利息约 53.8 万。等额本金首月约 5361 元、每月递减约 7.2 元,总利息约 46.6 万。
差出的七万不是「等额本金更划算」的魔法。等额本金前期还掉的本金多,占用资金的均值更低,差别就是现金流时间表不同。
若把两方案每月的还款差额拿去投资,比较的标的就变成了投资收益率与贷款利率孰高。贷款利率 3.1% 是无风险基准,任何稳超 3.1% 的资金安排都让「少还利息」的等额本金变成输家。
源码还吐出 360 期的逐期摊销表。每期利息等于当期余额乘月利率,本金等于月供减利息,余额单调下降。
「房贷前期都在还利息」这句流行说法要修正。利息多是因为余额高,每一期都精确按余额计息,不存在被设计的顺序。摊销表里那列单调递减的余额数字,比任何解释都直观。
同一条几何级数在金融工具箱里还有一面镜像。定投公式算年金终值:
月供公式解「每期还多少才能还清现值 」,定投公式算「每期存多少将来变成 」。
与 互为倒数,一现值一终值,是同一条等比数列的正反两读。
源码用 i || 1e-9 兜住零利率,退化情形 也不会除零。
同属这个工具箱的个税标签页是制度参数式的另一个极端。
七级超额累进税率表,每级带速算扣除数,税额 = 应纳税所得 × 税率 − 速算扣除。
速算扣除不是政策优惠,是「全额累进与超额累进之差」的预处理。分档要算七次加法,查表一次完成,数学上是把逐段计算折叠进一个常数。
源码把 60000 元基本减除、三险一金专项扣除、九类专项附加扣除(子女教育每月 2000、房贷利息每月 1000 且与房租扣除互斥、大病医疗自付超 1.5 万的部分封顶 8 万……)全部展开成输入项。
制度参数式公式的边界全在政策文本里。起征点、专项、速算扣除,每一个数字都标着政策文号,代码只是忠实转录。也因此过期得比任何回归式都快。
金融工具箱
金融计算工具箱有二十三个标签页,挑三个说。
第一个是定投与 FIRE。
FIRE 计算器的核心是一条除法:财务自由金额 = 年支出 ÷ 提现率,默认 4%。即著名的 4% 法则,源自 1998 年美国 Trinity 大学对历史股债组合回撤率的回溯研究。
它的边界是所有公式里最多的。回溯的是特定市场、特定时代、三十年期的组合存活率,对未来的担保力接近于零。
源码的实现很自觉地用了一条逐年模拟的 while 循环。bal = bal × (1 + i) + 年投入,直到越过 FI 线。
闭式解当然存在,但循环写法允许随时改假设、加中途投入。工程上的灵活换走了理论上的优雅。
第二个是汇率换算。
fx 标签页的换算表是六个硬编码数字:CNY 1、USD 7.12、EUR 7.75、JPY 0.047、GBP 9.0、HKD 0.91。每种货币对人民币的汇率(静态示意数据,不联网更新)。
任意两种货币之间的换算都走一条固定路径:
result = amount * rate[from] / rate[to]先把金额折成锚定货币 CNY,再折出目标货币。
这就是交叉汇率机制的最简形态:锚定一种基准,N 种货币只需要 N−1 个数字,其余汇率全部内生。EUR 兑 USD 就是 7.75 ÷ 7.12。
真实世界的央行中间价在此基础上叠加做市商报价的加权平均与每日定时发布,但「锚定一种基准、交叉汇率内生」的结构是一样的。银行牌价再加上买卖点差,是同一结构上的商业层。
读懂了这张表,就读懂了为什么全球汇市报价几乎都以美元为基准。锚定是存储效率的选择。
第三个是购买力平价标签页,它是汇率换算的反面教材。
换算表换成了 PPP 因子。同一篮子商品,4.2 元人民币与 1 美元「装进同一个篮子」(示意参数,思路同《经济学人》的巨无霸指数),换算同样先折锚再换出。
市场汇率由可贸易品与资本流动定价,PPP 由生活成本定价。两个数之间的裂口,就是「同样一笔钱在两国生活水平差多少」的粗测度。
一个 1000 元人民币的购买力按市场汇率折 140 美元,按 PPP 因子折约 238 美元。
汇率没有错,PPP 也没有错,它们度量的从来不是同一个东西。
工具箱里模拟类的标签页(基金净值、K 线、牛熊周期)用一条线性同余伪随机 s = (s × 1103515245 + 12345) mod 2^31 驱动随机游走。
确定性种子生成的「假行情」,演示的恰恰是真行情里最难的事:样本路径千差万别,统计性质才是可讨论的对象。
健身工具箱
健身工具箱是全站经验回归式密度最高的地方,二十四个标签页里几乎每个都是一条对总体的拟合。挑四条看形状。
Epley 1RM 公式。。用次极限重量 与重复次数 外推一次极限重量。
源码顺手把它反演成 nRM 表:,一次测量给出全档位。
边界写在公式形状里。分子上的 reps 是线性项,重复次数超过 10 次后外推迅速失真。耐力主导的轻重量组与力量主导的重组在生理上不是一个系统。
美国海军体脂公式。男性为 。
这条公式的结构是「圆柱模型加 Siri 方程」。把身体近似成圆柱,腰围给出周长、身高给出长度,长径比的对数进入密度项。分母算出的 是身体密度,再由 Siri 公式 把密度换成体脂率。
450 与 495 这两个看似任意的常数就是 Siri 方程的指纹。
女性版本把「腰 − 颈」换成「腰 + 臀 − 颈」,脂肪分布的两性差异被编码进测量项。
边界同样明显:只用了三个围度,对腹型肥胖与肌肉型都会偏。
MET 热量公式。。
MET 是「活动时代谢率除以静息代谢率」的无量纲倍数,跑步 9.8、跳绳 11、瑜伽 2.5。表格来自运动科学手册的群体测量。
公式把所有个体当成「平均人」,心率、体成分、动作经济性全部不在场。同一个 MET 值,训练有素者与新手烧的热量可以差出三成。
Karvonen 心率区间。靶心率 = 静息心率 + (最大心率 − 静息心率) × 强度%。
比常见的「最大心率的百分比」多减了一个静息值。储备心率才反映心脏的可动员空间,这是 Karvonen 对简单比例法的修正。
但最大心率本身又是经验式。源码用 估算,这个流传最广的公式其实是 1971 年一项文献综述的粗回归。更精确的 Tanaka 式 存在多年却始终争不过先入为主。
经验式的传播力与准确度是两回事。经验式的经验式,误差叠误差,健身工具箱因此最需要「边界意识」。每条输出都该读成「对一个和你差不多的人,大约是这个数」。
工具箱里也有两条非回归式。
杠铃片计算器用贪心。目标重量减去 20 公斤杆重除以二,按 25/20/15/10/5/2.5/1.25 从大到小凑。
贪心算法在一般面值系统里会失手,但这套面值恰好是「完备」的。每种大片都能被更小的片精确凑出(25 = 20 + 2.5 + 1.25×2,以此类推),贪心永远给出最少的片数,不会失手。
骑行功率计算器则是全站唯一的第一性原理公式。,其中滚阻 、坡度阻力 、风阻 (空气密度 1.2 kg/m³,人与车的风阻面积约 0.3 m²,体重还加上 8 公斤的车)。
不拟合任何人,只物理。
它的边界只剩一条:参数取的是典型值,你的车比 8 公斤重,输出的瓦数就比真实偏高。
排卵日历
排卵期追踪的源码是全站最短的计算器之一,核心一行:排卵日 = 末次月经第一天 + (周期 − 14)。
易孕窗口取排卵日前 4 天到后 1 天。下次月经 = 末次月经 + 周期。
这就是日历法(Ogino 法)的全部数学,它自 1930 年代沿用至今。
「−14」是这个公式的心脏。排卵发生在下次月经前约 14 天。黄体期(排卵到出血的间隔)在个体内相对恒定,约 12 到 16 天。
日历法的巧妙在于把不可观测的排卵日,换成了可回溯的经期起点。代价是假设链变成三节:周期规律、黄体期恒定、末次月经记得准。
每一节都在加误差,且误差方向一致。周期波动 3 天,估算窗口就整体漂移 3 天。
公式本身没有错,错在把三重假设压成了一次减法的简洁。
窗口宽度 −4 到 +1 有生理依据。精子在女性生殖道内最长存活约 5 天,卵子排出后寿命不足 24 小时,两者拼起来,易孕窗大致是排卵日前 5 天到后 1 天。
源码给出 −4 到 +1 的六天窗口,落在生理区间的核心段。
它给的不是「某一天」,而是一个区间。
这与 Widmark 公式形成有趣的对照。两者都取群体均值参数(代谢率 0.015%/小时、黄体期 14 天),但血酒公式输出一个带免责声明的点估计,日历法输出一个天生宽的区间。
计算器设计有两种诚实:一种把不确定性写进免责声明,一种直接把不确定性算进输出。
FX 工具箱
先正个名。站内 slug 里的 fxtoolkit 与上一节的外汇无关。此 fx 是特效(effects),彼 fx 是外汇(foreign exchange),一字之差两个物种。
FX 工具箱是三十四个标签页的 Canvas 粒子效果与 Web Audio 合成器,代表「公式」在本站的另一种存在方式:不再算出一个数,而是每帧计算几万次,把一条公式实时播放出来。
烟花标签页是欧拉积分的现场教学。每次点击爆发 60 颗粒子,每颗每帧执行 vy += 0.04、位置累加速度、寿命衰减。
没有解任何微分方程,抛体运动被直接「播放」出来,重力是一个写死的帧常数。
雪、落叶、水流同理。雪花的横摆是正弦相位,水流粒子的流向是 的流场。
那些在物理课里要求解的方程,在实时图形里都退化成了逐帧迭代。因为没人需要精确解,只需要看起来对。
音频那边藏着两条更精致的公式。
火焰与雨声的底噪来自棕噪声生成器:last = (last + 0.02 * w) / 1.02。对白噪声做一阶低通。
白噪声的功率谱是平的,把它积分一次(这正是这条两行公式在数学上做的事:随机游走的温和化),能量向低频集中。「呼呼」的火声就是低频段的白噪声。
音高检测则用自相关。对麦克风缓冲计算 ,周期信号的自相关在整周期处出现峰,峰值位移 换算成频率 ,再经 翻成音名。
从物理信号到十二平均律,两条公式接力。
BPM 标签页最朴素:记录敲击时间戳,60000 除以平均间隔毫秒数。
这些动画的骨架仍然是读输入、更新、渲染的帧循环。
本节开头说计算器是「一条公式算一次」,FX 工具箱则是「一条公式算到天荒地老」。
游戏循环里讨论的时间步与帧率问题在这里同样成立,只是没人会在意烟花在 60Hz 与 144Hz 屏幕上的速度差。
公式的输出从「数字」变成「氛围」之后,精度的要求也随着语境一起降级了。
回到本节开头那副骨架:一条公式、一组默认值、一条边界。
默认值其实也是设计。BMI 记住 170cm 与 65kg,贷款计算器停在 20 万、4.9%、30 年,房贷默认 100 万、3.1%、30 年,每一个都画着「最典型用户」的肖像。
公式负责把输入变成数字,边界负责提醒这个数字不是真相。
生活计算器的全部诚实,都藏在两者的接缝里。
静态公式之外,另一类工具把边界做成了时间:工作多久必须停、停下时身体该做什么。
专注与休息的节律设计
「累了就休息」听起来像常识,实操起来几乎没人做对。要么硬撑到注意力散架,要么一休息就刷手机刷到忘记回来。
真正可持续的专注不是意志力的连续输出,而是一组设计好的节律。工作多长、怎么停下、停多久、停下时身体做什么。
动手版本:番茄钟、白噪音生成、静心冥想、20-20-20 眼睛休息。
时间盒
番茄钟的规则无人不晓:专注 25 分钟,休息 5 分钟,每凑满四轮来一次 15 分钟的长休。
这套 1980 年代由 Francesco Cirillo 用一枚番茄形厨房计时器定下的节奏流传至今,靠的是它同时拆掉了专注路上的三堵墙。
第一堵墙是启动成本。
人对「写完这篇报告」的抵触,远大于对「先专注 25 分钟」的抵触。前者的终点遥不可及,后者的终点钟声可期。
时间盒把承诺缩小到不构成心理负担的尺度。你不是要完成任务,只是要填满一个盒子。
而行为经济学里的目标梯度效应说,越接近目标,单位努力的动力越强。这正解释了为什么 25 分钟盒子的后半段往往比前半段好熬:进度环上每走过一格,收尾的拉力就大一分。
站内的番茄钟把这个「看得见的进度」做成了 SVG 圆环,剩余时间与完成比例同环显示,目标梯度所需要的视觉反馈它一直在场。
第二堵墙是中断管理。
中断分两种:外部中断(别人来找你)和内部中断(自己冒出来的念头)。
番茄钟对内部中断的处理尤其漂亮。25 分钟不是「至少专注这么久」,而是「最多专注这么久」。它给突如其来的杂念提供了一个体面的存放处:这事等铃响再说。
经验上,杂念大多活不过 25 分钟。等铃声真响,一大半已经不值得做了。
对外部中断,Cirillo 给的原始规则是「告知—协商—回电」。告知对方我在番茄中、协商一个稍后的时间点、到点主动兑现。把打断变成预约。
第三堵墙是疲劳的复利。
连续工作两小时的产出往往低于四个 25 分钟。因为疲劳不是线性的,它会在某个点之后指数级吃掉错误率。
定时插入的休息把疲劳曲线拦腰截断,不让它进入复利区间。
睡眠研究里有个相邻的观察可以佐证「工作段不该太长」。人的生理节律里存在约 90 分钟的超日节律(ultradian cycle),觉醒状态下的警觉度以一个半小时上下为周期起伏。
25 分钟的盒子连四轮、连同一次长休约两小时。四个短盒、三个短休、一个长休,这个 4+1 结构与超日节律的尺度是同一量级的:在身体的警觉谷底安排长休,比均匀地硬扛更顺应生理。
25 分钟不是魔法数字
站内实现把三段时长全部开放设置。默认专注 25、短休 5、长休 15 分钟,修改时分别夹在 1–120、1–30、1–60 分钟的区间里。
这个弹性很重要。25/5 是历史偶然(一枚厨房计时器拧出的刻度),不是生理常数。有人 50 分钟才进入状态,有人 15 分钟就到瓶颈。
节律的有效性在于「固定且被遵守」,不在于具体数值。
真正不该改的是结构本身。工作段、短休段、每四轮一次的长休段,三层嵌套。
程序严格照此执行:第四个专注段结束后自动切长休,其余切短休,休完自动回专注。切换不需要人做决定,因为「要不要再歇一会儿」这个问题一旦交给人,答案几乎总是错误的那个。
计时归零时响的是一小段 Web Audio 合成的上行琶音(C5–E5–G5–C6 四个正弦振荡器依次进)。比闹铃温和,又不至于被忽略。
当天完成的番茄数按日期记在本地,第二天清零重来。统计只看今天,是刻意的设计:这个工具的目标是维持节律,不是攒成绩单。
还有一条使用守则:休息段也是段,别拿任务把它填满。
5 分钟刷一遍信息流,注意力不但没恢复,还被塞进了新的输入队列。真正的短休应该做「低输入」的事:站起来接杯水、看看窗外、伸个懒腰,让工作记忆有机会清空缓存。
番茄钟的铃声只负责把你从工作里拔出来,往哪去,得自己守规矩。
它还有个「煮饭计时」标签页,可以同时挂多个命名计时器。同一套倒计时内核,另一种时间盒:厨房里的并行任务恰好是「多个独立小盒子」的形态,哪个先响先处理哪个。
白噪声
为什么是噪声而不是音乐?
对纯体力或高度熟练的重复性劳动,音乐没问题。但对语言密集型工作,带歌词的音乐是负资产。大脑的语言回路没法一边处理歌词一边处理文字,这与「安静环境里突然有人说话最难忽略」是同一个现象,认知心理学叫无关言语效应:凡是携带语义的声音,都会自动占用工作记忆。
纯噪声没有语义、没有结构、没有期待。你不会想「下一拍是什么」,它因此在注意力账本上是唯一近乎零成本的背景。
这也是为什么很多「专注歌单」最终都收敛到电影配乐或 Lo-fi:这些音乐没有人声、没有意外。
白噪声把这两条推到了极致。
工作环境里最伤专注的不是响的声音,而是突兀的声音。隔壁一记关门、楼上一次拖椅子。
注意力系统对新出现的、位置或性质突变的声音有天然的朝向反射,这是进化留下的警报机制,关不掉。
白噪声的策略因此非常清楚:它不消除噪声,而是抬高噪声地板,让突发声失去对比度。一面稳定的、频谱平坦的墙立起来之后,关门的能量不再显著超出背景,警报机制没有被触发的理由。
这就是听觉掩蔽:掩蔽声越宽频、越平稳,对瞬态干扰的压制越有效。
「频谱平坦」是字面意义的。
白噪音生成提供白、粉、棕三种噪声,源码里它们的差别就是几行滤波公式的差别。
白噪声最简单:每个采样点独立取均匀随机数,能量在所有频率上均匀分布。像密度均匀的雨。
粉噪声是白噪声过一个一阶低通滤波器:
pink[i] = (pink[i-1] + 0.02 × white[i]) / 1.02每往高频走一个倍频程,能量衰减约 3 分贝。听感上「沙沙」变「哗哗」,更接近自然界的稳态声。
棕噪声再进一步,把白噪声做积分(同样的一阶累加,再放大 3.5 倍补偿幅度)。能量按每倍频程 6 分贝衰减,低频进一步占优,听感深沉像远处的海。
三种颜色本质上是同一种随机过程的三种频谱整形。高频越多越「亮」,越容易掩蔽高频的人声。低频越多越「闷」,听感越不引人注意。
选哪种没有对错。掩蔽效果取决于你要盖过什么,通勤噪音选棕,人声嘈杂选粉或白。唯一的硬指标是你自己不再注意到它。
实现上还有一处细节:噪声缓冲区只生成了两秒,然后无限循环。
两秒的循环对音乐是致命的。接缝和重复立刻就会被听出来。对噪声却完全无感,因为随机信号没有任何可记忆的结构,大脑无从建立「这段听过」的预期,循环的周期性也就无从捕获注意力。
用最小的一段内存换来源源不断的「新」声音,这是随机信号独有的红利:它的不可预测性就是它的掩护。
音量滑杆默认 0.2、上限 0.6。刚好盖过环境又不需要费力忽略它的区间。掩蔽是让干扰消失,不是让噪声成为主角。
单色的墙够用时,一面墙就够了。
静心冥想里的「白噪音混合」标签页则更像一间小型混音室:雨声、海浪、风声三条声道,各自一根音量推子,随开随混。
三条声道的合成配方各不相同。雨声是带宽最宽的一个(低通滤波留到 8000 赫兹,保留高频的细碎颗粒),海浪和风声都过了 600 赫兹的低通、只留低频的涌动。
三条推子任意组合出的混合声都保持「平稳、无事件」这个掩蔽底线。因为每条声道单独已经是稳态噪声,混音不引入新的突发结构,只改配比。
从声学看这是频谱配比,从体验看它回应的是另一个事实:真实环境的安宁从来不是单一声音,而是几种低强度声音的稳定组合。雨打窗、浪拍岸,掩蔽效果之外,还各自带着一点自然声景(sound-scape)研究里反复提到的「安全信号」气质。
呼吸
心率、血压、消化这些内脏活动归自主神经系统管,平时不受意识控制。但呼吸是这条系统里唯一的例外通道:它自动运行,却随时可以被意识接管,而且接管它,会沿着神经反射往回影响整条系统。
机制的关键在呼气。吸气时心率加快、交感神经占优;呼气时心率减慢、副交感(迷走)神经占优。这是压力反射的固有节律。
于是「延长呼气」就成了手工踩下副交感刹车最直接的办法。心率变异度(HRV)随慢呼吸上升、应激水平随之下降,这是目前证据最扎实的非药物放松手段之一。
站内两个呼吸工具是同一原理的两种封装。
静心冥想里的呼吸引导是可跟练的动画圆:内置箱式呼吸(吸、屏、呼、屏各 4 秒)与 4-7-8 等节奏,圆随相位胀缩,动画带一点惯性,跟随起来不生硬。
每分钟 5 次这个数值不是随手定的。人体压力反射的谐振频率就在每分钟 5 到 6 次呼吸(约 0.1 赫兹)附近。以这个频率呼吸时,呼吸节奏与心血管系统的固有振荡同相叠加,心率变异度被推到个体最大值。
也就是说 12 秒一轮的节律不是随手定的,它恰好落在生理谐振点上。这是「慢呼吸提高 HRV」从定性说法变成定量处方的那一步。
静心冥想的呼吸标签页则内置两套经典处方。
箱式呼吸 4-4-4-4:吸气、屏息、呼气、屏息各 4 秒,因轨迹方形得名。特种部队与狙击手用它做临场镇定。四段等长的结构同样落在谐振区,屏息段的存在让胸腔内压有序起伏。
4-7-8 呼吸:吸气 4、屏息 7、呼气 8。
注意 4-7-8 的形状:呼气时长是吸气的两倍。这是一个呼气主导的模式,单轮 19 秒、每分钟约 3 次,比谐振频率更慢,副交感刺激被刻意拉满,适合入睡前而不是开会前。反过来,需要专注前的唤醒,就把比例倒过来用短呼长吸。
图形引导也有道理。数息数到第三轮一定会走神,而一个胀缩的圆把「现在该吸还是该呼」的判断外包给了视觉。认知负荷越低,节律维持得越久。
这和番茄钟把「何时休息」外包给铃声是同一个设计原则:靠意志力维持的节律会在第一次疲惫时崩溃,外包给外部信号才能跑过疲惫。
眼睛的账单
专注时身体里最超负荷的器官不是大脑,是眼睛。两笔账一目了然。
第一笔是调节疲劳。看近处时睫状肌持续收缩改变晶状体曲率,屏幕工作动辄把这个姿态锁死几个小时。肌肉持续收缩会酸,睫状肌也不例外,它的酸表现为视物模糊和眼胀。
第二笔更隐蔽:眨眼。
正常状态下人每分钟眨 15 到 20 次,每次眨眼在角膜上重铺一层泪膜。高度注视屏幕时,眨眼频率会掉到三分之一上下。泪膜蒸发得不到补充,干眼、异物感、灼烧感接踵而至。
视频终端综合征的两个主要来源,一个锁死了调节肌肉,一个抽干了润滑。
20-20-20 眼睛休息对应的就是那条规定:每 20 分钟,看 20 英尺(约 6 米)以外的东西,看 20 秒。
三个数字各有分工。6 米以外是让睫状肌「松开调节」的距离阈值,调节到无穷远才彻底卸力。20 秒是泪膜重新铺满并让调节系统完成切换的最短时间。20 分钟则控制单次疲劳的累积量,趁还没酸就松手。
工具的实现非常克制:一个 20 分钟的倒计时主循环,归零时弹出 20 秒的休息警示框(倒计时数字放大显示),结束后自动回到下一轮。开始、暂停、重置三个按钮,没有多余的东西。
它的全部价值在于那声提醒。20-20-20 的失败几乎百分之百出在「忘了」,而不是出在「做了没用」。
番茄钟是 25 分钟的工作节律,护眼是 20 分钟的眼部节律,两个周期天然错开。屏幕前的一小时里会有两三次「站起来看点远处」的机会嵌入工作间隙。
节律之间的嵌套与错峰,比任何单一节律都更接近真实身体的多种需求。专注、代谢、视觉各有各的周期,好的工作环境让它们各跑各的表。
护眼这件事上还有两条零成本的配套动作,一并记在这里。
一是屏幕距离与角度。显示器推到一臂开外(50–70 厘米),屏幕上缘与视线齐平。视线微微下俯时眼睛暴露面积更小、泪膜蒸发更慢,这是把「眨眼变少」的损伤再压低一档的姿势设计。
二是环境光。屏幕亮度与背景光差得越远,瞳孔与调节系统来回切换的成本越高。黑屋里看手机格外累,不是因为屏幕伤眼,而是因为高对比迫使调节与瞳孔系统持续做极限运动。
「节律工具 + 姿势 + 光环境」三件事叠满,视疲劳才真正无处落脚。
引导、扫描与重评
前四节都在讲「节律的钟」,最后这一节讲「钟响之后做什么」。
休息的质量取决于休息时的动作,而动作需要流程。
静心冥想是个十标签页的工具箱,里面最该展开的是四件东西。
冥想引导把一次 105 秒的迷你冥想拆成四步自动推进。安坐(20 秒):找个舒适的位置,轻轻闭上眼睛。觉察呼吸(30 秒):把注意力放到气流进出。身体扫描(40 秒):从头顶到脚尖依次放松。回到当下(15 秒):慢慢把注意力带回房间。
每步一句引导语配倒计时,人不需要记流程,跟着走就行。
渐进放松是更结构化的身体版本。按 Jacobson 渐进式肌肉放松法的路数分六个肌群推进:双手与手臂(10 秒)、肩膀(10 秒)、面部(8 秒)、腹部(8 秒)、双腿(10 秒)、全身放松(15 秒)。
每组的要领是「收紧—保持—松开」:先主动制造紧张再骤然释放,松开瞬间的松弛感会形成鲜明对照,比单纯「放松」的指令有效得多。分辨紧张的 absence 比制造放松的 presence 容易。
正念练习要的则是三十秒的注意力收纳。先做一次深呼吸,然后按「我看到了 / 我听到了 / 我感受到了」各记三条。
这套 3×3 的动作把飘出去的注意力强行拉回感官现场,本质上是给走神的大脑一个「回家」的路标。记录留在本地,回头翻看会发现同一张桌子上不同时刻的三个世界。
相邻的感恩日记是同一个思路的慢速版。一句「今天,我感恩……」的提示词,写下即存,按时间倒序排开,随时可删。
把当天的注意力引向「已经拥有的东西」而不是「还缺的东西」,这个动作对情绪基线的修正作用有大量积极心理学文献背书。但它的实现朴素到只剩一个输入框,重点不在记录本身,而在每天一次主动检索好事的习惯。
工具箱里还有一个冥想计时标签页,默认 10 分钟、可设 1 到 180 分钟。给不跟引导的老手留了一个素计时器:有时需要的只是一段被承诺保护的时间。
认知重评与 ABC 模型则是给「休息不了的大脑」准备的。有些人休息不下来,是因为脑子里循环播放着白天的事:消息没回、话说错了、聚会没叫你。
工具内置了这三个场景,每个配一条参考视角(「不回消息不等于否定你」「一次口误不会改变整体评价」「可能只是安排遗漏,直接问比独自猜有效」)。
ABC 模型标签页再把这套逻辑结构化:诱发事件 A 与情绪结果 C 之间隔着信念 B,真正可操作的是 B。检验证据、找反例、换朋友视角,这是认知行为疗法最基础的家用版。
把它们放进「休息工具箱」是恰当的:清不掉的心理反刍,才是最贵的休息税。
节律管住的是时间,化学工具管的是物质——那里有一条更硬的底线:原子和电荷,一个都不能多,一个都不能少。
化学计算的守恒与配平
中学化学的算法含量长期被低估。摩尔是单位换算,配平是解线性方程组,半反应法是电子记账,周期表是一张结构化数据表。
这些事交给计算机,代码往往比课本讲得更诚实。每一条公式的适用范围、每一个解析器吃不下什么输入,都写在源码里。
动手版本:化学计算、化学摩尔计算、化学方程式配平、元素周期表、科学计算器。
摩尔:一条换算链的枢纽
摩尔不是一堆东西的名字,是「数量」的单位。就像「一打」是十二个,一摩尔是 个。
化学选这个奇怪的数当单位,只为一件事:一摩尔任何元素的质量(克数)恰好等于它的相对原子质量。
碳 12.011,那么 12.011 克碳就是一摩尔碳原子。
这个对齐让宏观的天平(克)与微观的个数(原子数)之间有了一条精确的换算链:
质量 除以摩尔质量 得摩尔数 ,再乘阿伏伽德罗常数 得粒子数。
所有化学计量计算都从这条链出发。化学方程式里的系数比是粒子数之比,也就是摩尔比。天平称出的克必须先换算成摩尔才有资格进方程。
为什么非换不可?看氢气燃烧: 的系数比是 2 比 1 比 2,可质量比是 4 克比 32 克比 36 克。系数比在质量的世界里毫无踪影,因为一颗氧原子的质量是氢的十六倍。
方程式描述的是粒子的账本,天平称的是质量的账本,摩尔就是两本账之间的汇率。
98 克纯硫酸里有 0.999 mol 分子,氢原子按化学式是两倍,1.998 mol,约 个。要从克数一步跳到原子个数,中间必须停一站,这一站就是摩尔。
摩尔计算器就是这条链的第一段。
源码的化学式解析是一行正则:([A-Z][a-z]?)(\d*)。大写字母开头、可跟一个小写、再跟数字,逐段累加。
默认输入 ,内置的九种元素(H、C、N、O、Na、S、Cl、Ca、Fe)按表求和: g/mol。质量栏默认 98 克,换算输出 0.999 mol。默认值是对着硫酸的摩尔质量挑的,打开页面就有一个几乎整一的答案。
这个解析器的边界也该看一眼:正则不认识括号。
输入 会得到 58.09。 的 40.078 加一个 加 。而括号本该把 2 乘给氧和氢,正确答案是 74.09。差出来的 16 克,就是被丢掉的第二个氧。
括号、水合结晶这类嵌套结构,要等下一节的配平器才吃得下。一个九行的小工具划出九种元素、无括号的适用范围,然后诚实地只在这个范围内工作。这是它和「万能化学计算器」营销页的区别。
配平即解方程
化学方程式配平这件事,课本教的是凑。先配最复杂的、再凑原子数,凑不出就换分数再通分。
凑法对简单方程够用,但它掩盖了一个事实:配平是一个有严格代数结构的求解问题。
把每种物质的系数设为未知数,每种元素写一条守恒方程:方程两边该元素的原子数相等。
以氢气燃烧为例,设 、、 的系数为 :
右侧物质的系数取负号,两条守恒就合并成一个齐次线性方程组 。
矩阵 有两行(两种元素)、三列(三种物质),秩为 2,零空间一维,由 张成。通分取整得 ,即 。
配平的全部数学,就是求这个矩阵零空间里最小的正整数向量。系数可以同乘一个常数这件事,对应零空间是「一条射线」而不是「一个点」。
化学方程式配平把这套解法原样实现了一遍,而且做得很讲究。三个讲究,一个比一个深。
第一个是化学式解析。
Fe2(SO4)3 这类括号嵌套需要的不只是正则,源码用一个栈。遇元素就把符号和数量累加到栈顶的表里,遇左括号压一层新表,遇右括号弹一层、乘上括号后的数字、并进上层。
走完这趟栈,得到 Fe:2、S:3、O:12。与手算一致。
栈在这里做的事和它在表达式求值里做的事是同一件:把嵌套结构翻译成平的累加。这种「一个栈吃掉一层嵌套」的手法,汉诺塔与递归思维那篇里从另一个方向讨论过。递归是栈的语法糖,栈是嵌套的通解。
第二个是精确算术。
消元过程会产生分数系数(比如 、)。用浮点数算,最后一步「取整」就要面对 1.9999999998 和 2.0000000001 的两难。方程复杂一点,误差会把这些数字推离整数足够远,四舍五入就错。
源码的解法干脆利落:自己实现有理数类型,分子分母都用 BigInt,加减乘除全部按分数规则精确进行,从头到尾不存在舍入。
消元用带列主元的高斯消去(每列选绝对值最大的行做主元,保持数值稳定,尽管精确算术下这更多是习惯),消成简化行阶梯后回代求解。
第三个是解的合法性检查,这一步最见分寸。
零空间必须恰好一维。自由变量多于一个时,源码直接放弃并报「无法配平(请检查化学式)」。
为什么放弃是对的?考虑 :两种元素、四种物质,秩至多 2,零空间至少二维。氢可以多给水、氧可以多给双氧水,配平方案是一整族而不是一个。
化学上这叫平行反应:一个方程式里塞了两套独立的反应,本来就不该有唯一配平。
工具拒绝它,是忠于代数:「一个方程一个配平」是有条件的,条件就是零空间恰好一维。
求出一维解后还有两道工序。所有分母的最小公倍数通分成整数,再除以整体的最大公约数压成最小。若解中出现非正数(理论上不应出现),同样判失败。系数为零意味着某种物质根本不参与,说明方程式写错了。
这套流程用一条带括号的方程完整走一遍:。
四种物质、五种元素,方程组有五条、未知数只有四个。超定?其实不然:五条方程里有两条是别的方程的推论,矩阵的秩恰好是 3,,零空间一维,解出 。
。
超定但相容,是守恒体系的常态。元素多、物质少的时候,约束之间必然互相咬合,秩自动塌到正好留出一维解的程度。一旦物质多到约束管不过来(平行反应),秩又不够了。
零空间的维数像一只仪表,读着它就知道手头这个方程属于哪一类。
有一个边界值得明说:这个配平器面向分子方程式,不认识离子电荷。
解析器只读元素符号和数字,输入 会被理解成两个铁原子。电荷守恒这一维在整体配平里缺席了。
它被挪到了下一节的半反应工具里。那里电子就是记账单位,电荷差全由电子找零补齐。两个工具各守一半守恒律,合起来才是完整的配平图景。
化学计算工具箱
化学计算是五个标签页的组合体,每个标签页都是一条公式加一组默认值,逐个看三条最有代表性的。
pH 计算。,水的离子积 (25 °C)给出另一条腿:。
输入分三种。直接给氢离子浓度。给强酸浓度加稀释前后体积。强酸完全电离,,稀释公式 在这里露了底:它就是摩尔守恒(稀释前后溶质的量不变),和上一节的 是同一条守恒律的两套记号。给强碱浓度则先得 ,再用 反推 。
默认值 0.1 mol/L 的盐酸从 1 L 稀到 10 L,浓度降到 0.01,pH 从 1 到 2。对数尺度的第一个体感:稀释十倍,pH 只挪一格。
缓冲溶液。一条 Henderson–Hasselbalch:。
默认参数是醋酸的 与等浓度的共轭碱和酸。比值为一,对数项归零,pH 恰等于 ,这正是「半中和点」的名字来源。
这条公式的深意在于 是个比值。加水稀释,分子分母同除一个数,比值不动,pH 不变。缓冲溶液抗稀释的能力,在读出公式形状的那一刻就明白了,不用做实验。
比值每翻十倍,pH 平移一格,缓冲范围因此天然是 附近的那一段。
氧化还原配平。这是工具箱里算法含量最高的一页,实现的是半反应法。
把一个氧化还原反应拆成「氧化半反应」和「还原半反应」两条,各配各的,再按电子守恒拼回去。
源码内置了五条氧化半反应(、、、草酸根失电子、 分解)和五条还原半反应(高锰酸根、重铬酸根、、氧气、过氧化氢),介质可选酸性或碱性。
每条半反应的自动配平是一套固定次序:先配主元素,再补氧(差几个氧加几个水),再补氢(差几个氢加几个 ),最后用电数平电荷(两边电荷差几个,就往电荷高的一侧加几个电子)。
电子是这一步的「找零」。原子守恒配完还剩的账,全记在电子头上。
两条半反应拼回总方程,靠的是电子守恒。氧化半反应给出的电子数必须等于还原半反应吃掉的电子数,不等就取两条电子数的最小公倍数、把两条半反应分别放大到相等,相加后电子两消。
以经典的高锰酸钾氧化亚铁为例: 一侧给出 5 个电子, 一侧给出 1 个,最小公倍数 5。五份亚铁配一份高锰酸根:
电子数互质时最小公倍数不省事,电子数本身有公因子时才见威力。草酸根 与高锰酸根的 5 个电子,最小公倍数是 10。两份高锰酸根对五份草酸根:
,电荷左右各加 4,账目分毫不差。
最小公倍数在这里的角色和通分里一模一样:两本按不同倍数记的账,取最小公共倍数后才能相加对消。
界面把两条半反应(连同电子)和总方程一起显示出来,碱性介质时把 连水带 换到另一侧。整套流程就是课本上「化合价升降法」的程序化,只是升降法靠观察,这里靠代数。
半反应本身就是一个微型线性方程组:元素守恒加电荷守恒,五条约束套五类未知量。「配平即解方程」在工具箱这一页里出现了第二次。
工具箱剩下的两个标签页各有小而完整的骨架。
摩尔浓度页管稀释:。四个量里任意指定一个当未知数,选中的输入框被禁用并实时回填计算值。同一条公式换四个方向解,用户界面上呈现为四个按钮,方程的方向对称性被翻译成了四次点击。
Lewis 结构页则是可视化的。六个预设分子(、、、、、NaCl),SVG 画出键(单键一线、双键两线、三键三线)和孤对电子(成对的点),NaCl 单独画成带电荷标注的离子对、不画共价线。
它更像一个图:原子是顶点、键是带「阶数」的边。化学结构式在数学家眼里从来都是图论对象。
周期表
元素周期表的实现朴素得近乎坦白。118 种元素,每种五个字段(原子序数、符号、英文名、相对原子质量、类别),硬编码成一张数组,然后用 CSS 网格把每个元素放到 (x, y) 坐标指定的格子里。
没有数据接口,没有惰性生成,一张表就是一个带布局信息的数据库。
真正值得看的是坐标本身。主表是 18 列 7 行,但镧系 15 个元素全被挪到了第 9 行、锕系挪到第 10 行。这是每一个周期表都在做、却很少有人问为什么的排版决定。
答案藏在电子构型里。第 6 周期本该有 32 个位置,其中 14 个 f 区元素的电子填进 4f 轨道。如果如实画进主表,第 6、7 周期会各占 32 列,整张表变得又长又难读。
把 f 区「折下来」放在脚注,牺牲的是周期性的直观(镧系收缩这类趋势在折叠处断开),换回的是主结构的可读。
排版即知识表示。这张表的形状就是量子数的形状:左边两列填 s 轨道,右边六列填 p 轨道,中间十列填 d 轨道,折叠的十五列填 f 轨道。四个区块恰好是四种轨道的容量。
交互层的三件事也都有明确的设计理由。
类别用 11 种底色分区(碱金属、碱土金属、过渡金属、过渡后金属、类金属、非金属、卤素、稀有气体、镧系、锕系、未知)。格子上的文字颜色不由人工指定,而由一个亮度公式决定。,超过 0.6 用深色字,否则白字。这三个系数是老电视时代的遗产(ITU-R BT.601 亮度加权),人眼对绿色最敏感,绿色通道占了近六成权重。
搜索框按符号或英文名做子串匹配,命中的保持原样、未命中的降到 15% 透明度而不是隐藏。位置记忆比画面干净值钱,被滤掉的元素仍占着自己的格子,整张表的拓扑不动。
点击任意元素弹出详情卡:序数、质量、类别,Esc 关闭。一个查询工具该有的克制,大抵如此。
还要分清表上的两套分类。
11 种类别是化学性质的分档:金属性、成键倾向、反应活性。前文说的 s/p/d/f 四个区块是电子构型的分档。
两套分类大量重叠却不重合。类金属横在金属与非金属之间,把 p 区中段切出一道斜着的过渡带。过渡后金属与过渡金属同住 d 区和 p 区的边界两侧。
类别回答「这类元素怎么表现」,区块回答「电子往哪填」。一张表同时承载两套正交的知识,也就是它被印在每间教室墙上的原因:它不是一张清单,是一张两个维度的索引。
质量栏的数字是硬编码的 IUPAC 值快照,不联网更新。对教学场景,这比实时接口更可靠。元素质量几十亿年不变,唯一的「过期风险」是 IUPAC 又精修了几位小数,而那不影响任何一道中学计算题。
科学计算器
科学计算器是五个工具里最小的一个:一个表达式输入框,一个计算按钮,一行结果。
支持 sin、cos、tan、sqrt、log、ln、abs、pow、exp 九个函数和 pi、e 两个常量,默认算式 sin(0.5) + sqrt(9) 算出约 3.479。
函数名里藏着一个约定:log 是常用对数(10 为底,Math.log10),ln 才是自然对数。与数学手册的记法一致,与多数编程语言的 log 相反,换工具的人最容易在这里栽一跤。
实现要单独立一节,因为它是一条精心设计的捷径。
教科书做法是写一个表达式求值器:词法分析切成 token、按优先级建语法树、递归下降求值。两三百行起步。
这份源码只走了半步:用正则把表达式里出现的已知函数名和常量名改写成带前缀的形式,然后整个表达式丢给 Function 构造器,让 JavaScript 引擎自己完成解析和求值。所有未知的字母串原样保留,求值时自然触发引用错误,被 try/catch 接住、显示成一行错误信息。
安全性不是靠解析器,是靠白名单:只有名单上的名字会被改写、被引用,其余的一律视为非法输入。
这条捷径在「功能明确、输入有限」的场景下是合理的工程判断。它把两三百行语法树代码换成了两行改写,代价是报错信息生硬(引擎说什么就显示什么),以及无法支持自定义运算符。
捷径的价值和边界,都写在这笔交换里。
用法上还有两个容易踩的约定。
其一,三角函数一律按弧度取值。sin(30) 算的不是 sin 30°,想用角度得自己换算成 sin(pi/6)。pi 常量的存在就是为这一步服务的。
其二,幂运算有两条路:函数式的 pow(2, 10) 和语言自带的 ** 运算符。Function 求值意味着后者同样可用。写 2**10 得 1024,这与表达式求值器不同,运算符优先级、括号层级全部由 JavaScript 引擎按语言规范处理,算是借用捷径捎带的福利。
边界还有一层是浮点本身。sin(pi/6) 理论上等于 0.5,算出来是 0.49999999999999994。因为 pi 是个有限精度的近似值, 本就有误差,正弦再把误差非线性地放大。
计算器类工具的输出从来不是数学 truth,是 IEEE 754 双精度浮点的最佳近似。把第十六位有效数字当真,是所有计算器共有的陷阱。
这类工具的通用骨架(一条公式、一组默认值、一条边界)本文生活计算器的公式与边界一节拆过一遍。科学计算器是同一副骨架上最小的一副:它的公式是「求值」本身,它的边界是浮点与白名单。
守恒:一条主线
串起这五个工具的主线只有一条:守恒律。摩尔换算兑现质量守恒的记账,方程配平兑现原子守恒(半反应里再加电荷守恒),pH 与缓冲兑现电离平衡,周期表的分区结构是电子构型的投影,科学计算器则把每条公式落到一次浮点求值上。
这也是化学在全部理科里最接近编程的地方:它的定律大多是约束而非过程。物质不灭、电荷不灭、平衡常数不变,解化学题和解约束满足问题几乎是同一种活动。守恒律只有几条,剩下的都是它们的换算与联立。
守恒律把化学题变成求解,统计检验做的则是另一件事:把数据变成裁决。
统计检验与 p 值的红线
统计检验是科学方法里最常被引用、也最常被读错的一环。
一行「p < 0.05」出现在新闻里时,几乎所有读者(包括不少作者)都把它理解成「结论有 95% 的概率是对的」。这个理解从方向上就是反的。
动手版本:T 检验 / 置信区间、Z 表查询、绘图工具。
零假设与 p 值
统计检验的全部逻辑建立在一个刻意唱反调的动作上:先假设什么都没发生,再看数据有多不像话。
这个「什么都没发生」就是零假设(null hypothesis,记作 )。两组药没有差别、这批零件均值就是标称值、这枚硬币是均匀的。
注意 从来不是你希望证明的东西,它是你打算推翻的靶子。
p 值在这个框架下的定义非常克制:
条件竖线后面的东西是固定的。它假定零假设为真,然后问:在这个前提下,出现手头这批数据(或更极端的数据)的概率有多大。
p 值小,说明「如果什么都没发生,这批数据未免也太巧了」。于是我们拒绝 。
整个过程没有一句涉及「备择假设为真的概率」,更没有涉及「结论正确的概率」。条件概率的方向一旦反过来, 就变成了 ,而这两者中间隔着一整座贝叶斯定理的桥,检验本身不负责搭桥。
所以 p 值度量的不是结论的强度,而是数据对零假设的惊讶程度。这句话是全文的题眼,后面「读 p 值的三条红线」会回头把它掰开。
检验统计量
直接对整批数据算「惊讶程度」没法下手,需要一个压缩步骤。把 n 个样本压成一个检验统计量,再查这个统计量在 下的分布。
均值检验用的就是:
分子是样本均值与零假设均值 的偏差,分母把这个偏差换算成「以标准误为单位」的量。
这个分数的直觉很好读。偏差越大、数据越齐( 小)、样本越多( 大),t 就越极端,「巧了」的辩护就越站不住。
t 统计量的构造
公式里的 值得单独拎出来讲。
如果总体标准差 已知,统计量 服从标准正态分布,查 z 表就能定 p。这是二十世纪初统计学的常规操作。
但现实中 几乎永远未知,只能用样本标准差 顶上:
分母用 而不是 ,称为贝塞尔校正。
样本方差是围绕 算的,而 本身就是对这批数据的「迁就」。数据被均值拉扯着,离真实 所要求的波动总是偏小一点,除以 恰好把这份偏小补回去,使得 。
这个 同时就是 t 分布的自由度。n 个数据里有一个自由度被用来估计均值了,剩下的 个才有资格贡献波动信息。
用 顶替 的代价是分布形状改变。
是常数, 却是个随机变量。小样本时 本身抖得很厉害,偶尔估小了,t 就被虚推得很大。
为了不在这里翻车,t 分布把两条尾巴加厚了一些,给「 估小」这种意外留出容错空间。
厚多少和自由度挂钩。n 越小尾巴越厚,n → ∞ 时 t 分布退化回标准正态。
数字感受一下。双侧 5% 的分位点,正态是 1.96,自由度 7 的 t 分布是 2.365。同样是「显著」,小样本要跨过的门槛高出一截。
这套理论诞生在啤酒厂里。
二十世纪初,都柏林的健力士(Guinness)酒厂想用很少的大麦样本判断品种产量的差异,样本小到十来个,正态近似的假设根本站不住。
厂里的化学家 William Gosset 推出了小样本均值的精确分布。酒厂怕工艺机密泄露,禁止员工以真名发表成果,Gosset 只好署名「Student」。
于是这个分布至今叫「学生 t 分布」,是统计学教材里最成功的化名。
一个食品工业的质量控制问题,最终给整个科学界的统计推断提供了地基。这个故事最动人的部分在于它的动机极其朴素:样本太贵,所以每个样本都必须榨出全部信息。
一百年后这个动机没有变过。临床试验、A/B 测试、用户调研,凡是数据按个计价的场合,t 分布都还在值班。
站内的 T 检验 / 置信区间把这条构造链完整跑了一遍。
粘贴一列逗号分隔的样本(默认那组 12,15,14,10,13,16,11,14),它依次输出 n、均值、样本标准差、标准误,然后给出 与双侧 p 值。
默认数据的均值是 13.125、标准差约 2.031、标准误约 0.718,算出 t ≈ 18.3。因为零假设固定是 ,而这组数据离 0 实在太远,p 值直接显示成 0.0000。
想检验「均值是不是某个别的数」,把样本逐个减去那个数再贴进去就行,这是单样本检验换 的标准手法。
工具源码里还有一行注释抄在这里:p 值是用正态近似算的,注释原话是「n > 30 时没问题,否则偏粗」。
这不是偷懒,而是有意的教学取舍。正态近似在小样本时会低估 p 值(t 分布尾巴更厚,真实的尾概率更大),也就是说工具给出的显著性在小样本下偏乐观。
严谨的做法是拿算出的 t 值去对照自由度 n−1 的 t 分布临界值。比如 n=8 时应该对照 2.365 而不是 1.96。
知道自己的工具在哪里近似、近似往哪个方向偏,比把工具当黑箱信任要安全得多。
把整条计算链对着默认数据走一遍,体会每一步在做什么。
八个数求和得 105,均值 。逐个求偏差 ,平方后累加得 28.875。除以自由度 得方差 4.125,开方得 。标准误 。最后 。
注意这条链里没有任何一步是神秘的。均值是重心,标准差是围绕重心的平均半径,标准误是「再抽一次样本、均值大概会晃动多少」的预估,t 是偏差与晃动之比。
很多人怕 t 检验,是因为教材把四个量一次性甩出来。拆开看,每个量都是一句大白话。
置信区间
t 检验工具的标题里挂着「置信区间」,这不是巧合。区间估计和假设检验是同一个公式的两次使用。
检验问「 离 够不够远」,区间估计直接把所有「不够远」的 圈出来:
拿默认数据算:,即约 。
这个区间的读法有个著名的坑:它不是「真均值有 95% 的概率落在这个区间里」。
频率派的真均值是个定数,不掷骰子,谈不上概率。
严格的读法是流程性的:「如果反复抽样、反复构造这样的区间,长期下来约 95% 的区间会罩住真值」。
单次给出的那个区间要么罩住了要么没罩住,只是你永远不知道是哪种。
区间和检验的关系一望即知。零假设的 落在 95% 区间外,等价于双侧检验在 0.05 水平上显著。落在区间内,等价于不显著。
所以「p = 0.049」和「p = 0.051」根本没有本质差别。前者的 恰好被区间甩出去一毫米。但论文只认前者,这正是阈值思维的荒诞之处,也是后面「读 p 值的三条红线」的主角。
比起单看 p 值,把置信区间画出来信息量大得多。区间越窄估计越精,区间整体偏在一边说明方向明确。而「显著但区间横跨了实用上无关紧要的全部取值」这种最隐蔽的陷阱,只有摆出区间才看得见。
z 表
今天的 Z 表查询输入一个 z 值(默认 1.96),实时给出 与右尾概率。
但在计算器普及之前, 没有闭式解、数值积分算不起,全世界的统计学家靠的都是印刷出来的表。
把标准正态分布函数在 z = 0.00, 0.01, 0.02, … 上预先算好、排版、装订进每本教科书。做一道假设检验题的流程是:算出 z,翻书,手指沿行和列交叉读出尾概率。
表不是辅助工具,表就是那门学科的计算引擎。
1.96 这个数字成为统计学的图腾,正是查表时代的遗产。,左右各截 2.5%,合起来双侧正好 5%。
反过来背也成立。正态分布下约 68% 的数据落在 ±1 个标准差内、95% 落在 ±1.96 内、99.7% 落在 ±3 内。这组「68–95–99.7」经验法则在质控图和考试题里活到了今天。
老式 z 表的排版也得看一眼,因为它解释了「查表」这个动作的全部信息结构。
表的主键是 z 的整数部分和第一位小数(行标 0.0 到 3.9),列标是第二位小数(0 到 9),行列交叉的格子里印着 的值。
查 1.96 = 沿 1.9 那一行横走、对齐 0.06 那一列,读到 0.9750。
表通常只印到 z ≈ 4 就戛然而止,因为 ,再往右全是清一色的 0.9999,纸面上放不下信息量。
尾部概率小到印刷精度之外,这在后来就成了「表格盲区」。某些学科关心的正是 10⁻⁸ 量级的尾概率,查表查不到,只能另寻数值方法。
今天的 z 表工具没有这个天花板,输入任何 z 都能算,因为它的表是即算即所得的函数而不是印刷品。
这张表的历史角色有两层。
第一层是预算换时间。函数值贵,就一次性付清、反复查阅。
这个思路其实随处可见。科学工具箱的常量页把光速、普朗克常数、阿伏伽德罗常数这些值钉在一张表里供复制。光速那行印的是 299,792,458,一个连测量误差都没有的数,因为 1983 年之后「米」就是用它定义的,表上那一格是定义而非测量。
z 表、物理常量表、对数表,本质都是同一类东西:把昂贵的一次计算凝固成可以反复消费的公共财产。
第二层更有意思。当年用多项式近似+ 表拼出 的手工活,如今被塞进了一行浏览器代码。
z 表工具和 t 检验工具共用同一个正态分布函数实现,那是一段经典的 Abramowitz–Stegun 多项式逼近(系数 0.2316419 一眼可辨),最大误差在 量级。对任何查表需求都绰绰有余。
历史在这里画了一个圈:人类先发明表来逃避计算,再发明计算来消灭表。今天「查表」这个动作,实际执行的是一次即席的数值逼近。
读 p 值的三条红线
回到题眼。「p < 0.05」容易读出三种流行病式的误读,每一条都要正面拆一次。
红线一:p 值不是「 为真的概率」。
和 是两个方向的条件概率。说「p = 0.03,所以零假设只有 3% 的可能成立」,等于把「下雨时撑伞的人很多」读成「撑伞导致下雨」。
要谈 ,必须引入先验,那是贝叶斯方法的地盘,频率派检验从头到尾没有进场。
红线二:「不显著」不等于「没差别」。
p = 0.3 只说明「这批数据在 下不算惊讶」。可能是真没差别,也可能是样本太小、噪声把中等大小的效应淹了。
检验的统计功效(在效应真实存在时把它抓住的概率)随 n 增长。「没测出显著」和「测出了不存在」之间隔着一整个功效分析的工作量。
红线三:显著不等于重要——样本量会替你撒谎。
t 统计量的分子是效应大小,分母里蹲着 ,n 拉满之后再微不足道的偏差也会变成天文数字的 t。
构造一个具体的例子。某测试满分 100、标准差 15,某教学方法平均只提高了 0.5 分。做 n = 10000 人的实验,标准误 = 15/100 = 0.15,t = 0.5/0.15 ≈ 3.3,p < 0.001,「高度显著」。
但 0.5 分对任何真实课堂都毫无意义。
反过来,n = 20 的实验里 5 分的大效应也可能够不着 2.09 的临界值。
p 值回答「效应是否存在」,效应量回答「效应有多大」,两者必须一起看。只报前者不报后者,是论文和软文通用的化妆术。
还有一条实践级的告诫:p 值只对「一次检验」成立。
同一批数据切二十个角度各验一次,总有一个角度的 p 会跌破 0.05。这不是发现,是算术。20 次独立检验至少一次假阳性的概率约 。
多重比较要用 Bonferroni 之类的校正把门槛收紧。「p-hacking」(换着角度切数据直到显著)之所以是学术不端的高发区,数学根源就在这里。
阈值 0.05 本身的来历也配不上它的地位。
费希尔在二十世纪二十年代随手取了 0.05 当「值得停下来看一眼」的门槛,原意是提醒读者「这个结果或许值得再做一次实验」,而不是颁布一条合格线。
一百年后,这个随手的数字成了论文生死线。
统计学界的自我纠错在 2016 年到达高潮。美国统计协会罕见地发表正式声明,逐条告诫 p 值不能这么用。更激进的一些期刊干脆宣布「不再接收以 p 值为主要证据的原假设检验论文」,要求改报效应量与区间。
整场风波的要旨和本节标题是同一句话:显著性是门槛属性,不是强度刻度。把 0.049 和 0.051 当成两个世界,是对连续量做了最粗暴的离散化。
先看形状再做检验
所有均值检验都默认数据大致对称、没有离谱的离群点。
t 检验对正态性的要求在样本大时可以被中心极限定理兜住(经验口径 n ≥ 30 后 的分布已经相当正态),但小样本时一个离群点就能把均值拖去任何地方。
所以正经流程里,「检验」之前永远站着一步低科技的操作:把数据画出来看一眼。
看分布形状不需要统计软件,绘图工具的表达式画图就够了。
在函数输入框里敲:
exp(-x*x/2)/sqrt(2*PI)x 范围取 −4 到 4,标准正态的钟形曲线立刻出现,工具会自动缩放 y 轴。
想看 σ 变大的效果,把表达式换成 0.5*exp(-x*x/8)/sqrt(2*PI)(这是 σ = 2 的正态密度),峰值减半、腰身变宽。
均值决定钟的位置、标准差决定钟的胖瘦,这两句话盯十秒钟图就再也不用背了。
你自己的数据可以把每列减去均值再除以标准差,画成直方图和这条钟形线叠着比。表达式框支持 sin、exp、log、sqrt、abs 这些常规函数,随手画一条对照线没有任何门槛。
为什么「n ≥ 30 后 近似正态」可信?核心是方差的可加性。
每个样本 与均值同分布、方差为 ,n 个独立样本求平均,方差变成 。除的是 不是 ,所以均值的标准差只按 收缩。
这也是 t 统计量分母里那个 的来源。想要均值估计精度翻倍,样本量得翻四倍。想要多一位准确数字,得乘一百倍。
这条 √n 收缩律是全统计学最贵的税率。红线三里「n 拉大后微小效应也显著」的现象,根子也在这里。噪声按 √n 消退,而效应不变,天平迟早倒向「显著」一边。
这一步的价值不止是验证假设。
可视化经常在检验之前就暴露问题的形状。双峰意味着样本混了两个总体,右拖尾提醒你先取对数,孤零零的离群点要先问一句「是不是录错了」。
素数在二维里长什么样讲过同一件事的另一面:把数据换个几何姿势排开,沉默的规律会自己浮出水面,然后才轮到数学上场把它变成可证伪的命题。
图形负责发现,检验负责裁决。次序颠倒过来,检验就退化成给先入之见盖章的橡皮图章。
科学工具箱里还住着几个和统计共享同一套思维的小机器。
卡诺图页把真值表化简成最简逻辑式,进制页随机出题练 2/8/10/16 转换。
它们和 z 表同属一个谱系。把「人力昂贵、结果可预制」的部分固化下来,让人脑腾出来做只有人脑能做的那部分:判断。
小结
统计检验是一台把「惊讶程度」量化的机器。
零假设给它舞台,t 统计量把数据压成一个以标准误为单位的分数,z 表(或 t 分布)负责翻译成概率,p 值是翻译结果。
这台机器不产出真理,只产出「这份数据值不值得认真对待」的裁决。效应多大、有没有用、该不该信,是机器之外的人的事。
下次在任何地方看到「研究表明,p < 0.05」,不妨按顺序问三个问题:比的是什么和什么(效应量)、样本多大(分母里那个 √n)、验了几个角度(多重比较)。