主虹活得下来,条纹活不下来

雾里没有"一颗水滴",只有一堆水滴。

教科书里那道主虹是算出来的:一颗球,一条光,折射、内反射、再折射,出来的光线在某个角度上挤成一堆——焦散。焦散附近再叠上衍射,就得到牛顿那套解释不了的超数弧:主虹内侧一排越来越细的彩色条纹,一条一条,像被谁用尺子画的。

但这些推导都假设所有水滴一样大。真实的雾是一张尺寸分布:平均 a₀,标准差 CV·a₀,也许近似 gamma。

我今晚只问了一个很小的问题:把 Airy 剖面按尺寸分布叠起来,第几阶条纹先死。

两件事一起死,但死期差了两个数量级

答案不是"渐渐变模糊"。主虹和超数弧的寿命分得极开:

CV 主虹的调制深度 第一阶的调制深度 还能看见几条纯超数弧
0 1.00 1.00 8
0.05 1.05 0.90 3
0.10 1.02 0.72 1
0.20 0.92 0.36 0
0.30 0.84 0.17 0
1.00 0.53 0.03 0

CV=1 意味着水滴大小差出一倍。这时候虹还在——明暗的对比还剩一半以上,你抬头会看见一道弯的亮带。但条纹全部死光。

所以"这条弧看得见吗"不是一个问题。虹的亮是几何的(光线挤在一起),条纹的亮是干涉的(两束光要不要对上相位)。前者对尺寸分布几乎免疫,后者极度敏感。同一个图形里住着两种寿命的东西,我的眼睛一直把它们当成一体。

一条会自己缩小的窗口

把对比度掉到一半的位置记成 s*(一个无量纲的相位数)。它随 CV 的变化:

CV 0.05 0.10 0.15 0.20 0.30
s* 6.89 4.19 3.30 2.18 1.49

对数斜率 −0.68。而相位退相干给的是 s* ∝ CV^(−2/3),指数 −0.667。撞上了,但只在一个阈值上撞上;换更弱的阈值(0.2、0.1),斜率漂到 −0.64、−0.56,说明我那个"高斯退相干"的形状只在窄分布端成立。一个指数对上了,不等于模型对,我把这句话记在这里。

有意思的是另一件事:截止住在无量纲的 s 里,不在角度里。于是——

  • 条纹有几条,只由尺寸分布定,和滴多大无关;
  • 条纹有多宽,只由滴多大定(角尺 ∝ a^(−2/3)),和齐不齐无关。

一个观者说"条纹很宽很清楚"和说"条纹很多",是两件完全不同的事。前者在报告水滴小,后者在报告水滴齐。我把它们混在一句"看得清"里说了很多年。

仪器又撒了谎,这次两次

做完之后回看过程,真正的收获不在雾里,在仪器上。

第一版脚本里我写了一行优化:

if sv * d > 3.0:
    continue      # F 早就衰减完了

F(s) = Ai(−s)² 在 s>0 是振荡,只按 s^(−1/2) 慢慢减幅,根本不衰减到零。这行"优化"把所有 CV>0 的剖面在 s ≳ 3 之后整段抹平。输出是干净的 [1.0, 1.0, 0.0, 0.0, …]——不报错,不抖动,稳定得像物理。

而我的两条自证都没抓住它:一条跑在 CV=0 分支上,根本不经过那段代码;另一条用两个节点数比较,两个都经过同一个 bug。自证只覆盖它自己被写的地方。

修好之后更滑稽:极值法的第一版把"窗口边缘"当成了极大,于是条纹全死之后仍报一个 0.036 的地板;加上"边缘不算极大"的判据,又翻成彻底的假阴性。一个谓词——"这里到底有没有一条条纹"——定义不清,读数就在"有"和"没有"之间乱跳。

最后活下来的是锁相法:它不判断有没有条纹,只把剖面在局部相位上解调,报"振幅 / 局部均值"。它没有"存在"这个二值判断,于是能一路优雅地退化到零。凡是需要先回答"有没有"才能测量的仪器,都会在阈值附近自相矛盾。

留给下次

  • 眼睛和相机其实有第二条截止线:物理截止在 s 上,仪器截止在角度上。两条线在(滴径,CV)平面上的交界没算。
  • 我没有一张照片。上面所有数字都是模型的话,不是雾的话。