空调滴水消音垫的数学

Posted by wyj on September 9, 2026

背景

搬家之后,新家的空调是我很讨厌的 Window AC,由于没有外机和室内机的分隔,这种空调会让室内充满压缩机的噪音。这种噪音还是可以忍受的,但完全无法忍受的是滴水声:由于楼上的 Window AC 位于我的空调的正上方,只要楼上人家打开空调,其冷凝水会直接落在我空调的室外部分上,让整个空调金属外壳像鼓一样振动,在室内产生极其响亮的间歇出现的滴水噪音。与我去年的楼顶漏水一样,经过几天的体验,我发现只要滴水声存在就不可能入睡。刚开始我还能打开自己的空调,用压缩机巨大噪音来遮蔽滴水声,结果几天之后这种方法就失效了,因为习惯后我的大脑会自动过滤掉永恒不变的噪音,让一直固定时间间隔出现的滴水声显露出来,导致无法入睡。非常讽刺的是,虽然我最喜欢的二次元歌曲是《雨だれの歌》(1月在豹豹直播间第一次听到这首歌的时候就直接加进歌单了,几年才会有一次这样的歌;还专门为了这首歌去看了《少女终末旅行》,从那开始直到现在都属于我天天唱着的歌),可现实生活中这种滴水可一点也不像乐声,只有一个单调固定的节奏,会让人精神崩溃。

万幸的是,被这个问题困扰的不止我一个人,美国这种可恶的 Window AC 似乎相当流行,以至于我这个看上去很冷门的要求都有人专门做了一款产品来解决:Magnetic Air Conditioner Drip Cushion。这本质上是一种用磁铁吸附在自己空调顶部的海绵,可以吸收楼上空调滴水产生的巨大响声。我花20美元买了一个这种垫子,问题总算解决了。垫子也是 made in China 的,虽然中国根本没有这种空调噪音问题,这么为美国人民操心吗?

垫子表面凹凸不平的形状引起了我的兴趣。这显然是为了减小水滴和表面碰撞的角度来减小噪音,我去年楼顶漏水的几天就是在下面放一个 wedge pillow 来解决的。我的职业病让我不由得想,到底怎么样的垫子对消除噪音最有效呢?这首先需要将这个问题形式化为数学的语言。

问题描述

在水滴下落距离、垫子材质等等条件均相同的情况下(忽略起伏带来的水滴下落距离差距),噪音大小只和水滴下落方向与表面法向量的夹角有关。假设垫子基本上是一个二维平面,其表面就可以写成$z=f(x,y)$,表面的法向量就是$(-f_x,-f_y,1)$,于是和$z$轴的夹角就是$\theta=\arccos \frac{1}{\sqrt{1+f_x^2+f_y^2}}$。水滴的垂直于垫子表面的速度分量正比于$\cos \theta$,撞击能量就正比于$\cos^2\theta$。然而撞击能量和人类的感知并非线性关系,chatGPT 说这个适用 Stevens 幂律,即感知强度$N\propto I^{0.3}$,其中$I$为声强,和$\cos^2\theta$成正比。假设水滴的下落位置是均匀的,我们要最小化的就是$\iint \cos^{0.6}\theta\,dxdy$。

那么限制条件呢?没有任何限制显然不行,因为陡峭的斜坡会让这个夹角任意小。最直接的想法就是限制垫子的体积,毕竟体积直接相关于物料用量和成本,但这也行不通,因为对于任何一个$f$,我们都可以从中扣掉黎曼和那样的阶梯函数,而在表面角度几乎处处不变的同时使得体积任意小,因此优化问题会是病态的(虽然数学上是病态的,但这种设计思路其实很常用:菲涅耳透镜的原理就是这样的)。那么合理的限制条件是什么呢?我觉得是固定垫子的表面积,毕竟这会和加工成本有关,是个现实上有意义也可以数学上处理的优化问题。表面积的微元可以直接用$\theta$表示:考虑表面在$xy$平面上的投影,就得到$dxdy=\cos\theta dS$,于是$dS=\frac{1}{\cos\theta}dxdy$。

这看上去是一个变分问题,其实本质上是平凡的。如果我们记$t=\frac{1}{\cos\theta}$,则这个问题就是“限定一些$t$的和是固定的,要让$t^{-0.6}$的和最小”,由于$t^{-0.6}$是个凸函数,显然最优解是$t$为常数,即$\sqrt{1+f_x^2+f_y^2}$为常数,即梯度的范数$|\nabla f|$为常数。由此可见,这个从 Stevens 幂律来的经验常数$0.3$实际上并不影响解,只要目标函数还是凸函数,解就永远是同一类。这同时也说明,噪音水平会和表面积的$-0.6$次方成正比,即增加表面积对减小噪音的边际效应是递减的。

那么到底是什么函数能让$|\nabla f|$为常数呢?ChatGPT 说这个是二维的 Eikonal 方程。很多数学研究者看到这种东西就高兴得不得了,立刻开始分析什么什么抽象的函数空间,做什么什么数学变换,但我说到底不是一个数学研究者,不喜欢这么思考问题,在我看来,比起讨厌的 PDE,建立计算上的直观理解要重要得多。假设该问题的解已经在某个区域上给出了,我们想要将它延拓到外面一圈,该怎么办呢?对于一般形状的区域似乎没有什么好办法,但如果加上“区域边界上函数值相同”这个限制(即我们沿某条等高线切开了表面),梯度方向就是垂直于区域边界的,而且梯度大小又是个常数,因此整个梯度向量已经全部确定了,如果我们沿着区域周围走一圈,把边界上每个点都向外扩展同样的无穷小距离,得出的新区域就仍然满足我们的限制(由于梯度大小和扩展的距离相同,新区域边界上的函数值仍然全部相同),而且我们利用确定的梯度值就成功填上了这个更大区域的解。不断重复这个过程,我们就可以写出 Eikonal 方程的解了。

有没有觉得这个过程看起来非常眼熟?如果把平面看成一个巨大的二维数组,这其实就是 BFS 求无权最短路的流程!因此 Eikonal 方程的解就是最短路的连续类比,即到某个“源”的距离函数。“源”可以不止一个点,但不能是个有面积的区域,否则内部距离就都是0了,因此一般来讲“源”是一条曲线。比如“源”是单点的话所得的解表面就是一个圆锥,而“源”是直线的话解就会是一个平面。将这个结论推广一下,如果我们要求$|\nabla f|$为一个给定的非负函数$w$,然后指定一个“源”集合上$f=0$,解$f$就会是以$w$为连续权重的二维平面上的最短路。

除了这种距离函数$d(x)$之外,显然任何形如$ad(x)+b$的函数也都是原问题的解。还有别的解吗?显然是有的,比如将任意多个不同的解取$\max$得到的新函数仍然是解。但这些其余形式的解似乎都是通过不可导的部分在不同的距离函数之间切换的,如果只考虑一个$C^2$的局部,就一定是距离函数的一次函数吗?答案是肯定的,chatGPT 给我写了一个证明,大致上说是给$f_x^2+f_y^2=1$求导变成$2D^2f\nabla f=0$,其中$D^2 f$是指 Hessian 矩阵;定义积分曲线$\gamma$满足$\gamma’(s)=\nabla f(\gamma(s))$表示沿着$f$梯度的流线,则有$\gamma’'(s)=D^2f\nabla f=0$,即$\gamma$是一条直线,且其上有$\frac{d}{ds}f(\gamma(s))=\nabla f\cdot \nabla f=1$。于是如果我们固定$f$的一个水平集$f=f_0$,则$f(\gamma(s))=f_0+s$。而该水平集附近足够小的邻域内,每个点都能唯一地投影到水平集上,因此位于某条$\gamma$上,即整个邻域内有$f(x)=f_0+d(x)$。因此从某种角度上来说,这些距离函数就是唯一的解了。如果要求全局$C^2$,则这些梯度流线直线就不能相交,因此$\nabla f$方向相同,即其为常向量,解就只剩下平面了。

回到空调滴水消音垫这个实际问题,为了让垫子的体积尽量小,实际会做成锯齿形的,也就是说这个距离函数的“源”是一个较密的二维点阵。我买到的这个垫子其实是波浪形而非锯齿形,恐怕消音效果并不是最好的吧?

与 straight skeleton 的联系和区别

这种到曲线的距离函数立刻让我联想起 straight skeleton:这是计算几何中一个相关的概念,表示一个简单多边形的所有边以相同速度向内移动,直到缩成单点时多边形顶点经过的轨迹。straight skeleton 是具有固定斜率的屋顶的屋脊线的形状,而毫无疑问地这种屋顶满足$|\nabla f|$为常数(事实上这是我看到这个方程之后想到的第一种解的形状),那么它和距离函数给出的解相同吗?对于凸多边形,答案是肯定的。而如果非凸,比如“凹”字的两个凹角附近,曲线上离其最近的顶点是拐角处顶点,因此距离函数会给出抛物线形状的分水岭(到点和到直线的距离相同),但 straight skeleton 的屋脊线永远是直线,因此两者不同。

straight skeleton 除了屋顶之外,也在我熟悉的折纸领域有重要的意义:在 uniaxial box pleating 这种常用的折纸设计方法中,每个 hinge polygon 内部的 ridge crease 就是该多边形的 straight skeleton;参见折纸大师 Robert J. Lang 的 Origami Design Secrets 一书第587页,即上方的图片。而距离函数在计算几何中也有不少应用,毕竟其本质上就是连续版本的最短路,可用于机器人的路径规划。