delta 根本不可能是一个函数
到现在为止,你已经自由地用着[[dirac-delta-function|狄拉克 delta]] delta(x)——把它当作拉普拉斯变换里完美的脉冲,当作本级整座大厦所赖以建立的「单次尖锐戳击」,其响应即格林函数。通常的漫画是:delta(x) 除了在 x = 0 处之外处处为零,而在 x = 0 处它无穷大,可它的总面积却恰好为一,于是从负无穷到正无穷的 delta(x) dx 的积分等于 1。停下来诚实地盯着这幅漫画,因为它是不可能的。没有任何真正的函数能做到这一点。一个除了一个孤立点外处处为零的函数,按任何合理的面积概念——你所知的定积分——其积分恰好是零。改动一个函数在单独一点上的取值,根本无法使它的积分挪动分毫。
再说,「无穷大」本来就不是一个你被允许指派为函数值的数;你一旦写下 delta(0) = 无穷大,就已经离开了函数的世界——函数在每一点都取普通的实数值。所以 delta 不是一个表现糟糕的函数——它压根不是函数。有那么一阵子,物理学家把它当函数来用,而且用得漂亮极了,这既可疑又奇妙。本篇指南的任务,就是找出 delta 真正所是的那个诚实对象,好让你一直在用它做的一切,从「碰巧管用」变成「可被证明为正确」。
别问它等于什么,要问它做什么
下面是修好一切的那个概念性转轴,值得放慢脚步。一个经典函数由它的取值来定义:递给它一个点 x,它回给你一个数 f(x)。delta 没有合理的取值,所以这条路封死了。但请注意我们在实践中总是怎样使用 delta——从不单用,总是放在对某个光滑、规矩的函数 f 的积分里,而它唯一的活计就是伸进去、把一个值拈出来:delta(x) f(x) dx 的积分 = f(0)。delta 的全部身份都活在那个动作里。于是我们做一个激进的动作:我们不再用取值、而用 delta 对它所遇见的函数做了什么来重新定义它。我们一劳永逸地宣布:delta 就是这条规则——「喂我一个光滑函数 f,我把数 f(0) 还给你」。这条规则定义得完美无瑕、完全有限,且处处不牵涉任何无穷。
一个由它「如何作用于函数」来定义的对象——吃进一个函数、吐出一个数——叫做[[generalized-function|广义函数]],或称分布。我们被允许喂给它的那些光滑函数叫做测试函数:把它们想成有礼貌、肯听话的探针,规定为无穷可微、并在某个有界区域之外恒为零,这样就永远不会有边界项来捣乱。于是一个广义函数无非就是一条(线性、连续的)规则,给每个测试函数指派一个数。delta 是其中最简单而有趣的一个:它的规则是「返回原点处的取值」。每个普通而合理的函数 g 也定义这样一条规则——喂它 f,它返回诚实的 g(x) f(x) dx 的积分——所以旧的函数全都仍然住在这个新世界里。这个新世界严格地更大,而 delta 正是它腾出地方来容纳的新住客之一。
如何对一个没有图像的东西求导
新世界的回报在这里壮观地兑现。一旦一个广义函数由它「如何作用于测试函数」来定义,我们就有权通过「决定它的导数应当如何作用」来定义它的导数——而恰好只有一种诚实的做法。取一个普通可微函数 g,把它的导数 g' 对一个测试函数 f 作积分。因为 f 在远处恒为零,分部积分没有边界项,给出 g'(x) f(x) dx 的积分 = 负的 g(x) f'(x) dx 的积分。导数从 g 上跳下来、落到了 f 上,带一个负号。现在把这个等式当作定义来读:对任何广义函数 T,它的导数 T' 就是这条规则——「T' 作用于 f 等于负的 T 作用于 f'」。由于测试函数 f 无穷光滑,f' 永远存在,所以每一个广义函数都可微——而且无穷多次。再没有什么东西会没有导数了。
拿数学里最有名的台阶——[[heaviside-step-function|赫维赛德阶跃]] H(x)——来检验一下,它在 x < 0 时为 0、x > 0 时为 1。经典地看,它在原点处有一道跳跃、在那里压根没有导数。作为广义函数,它的导数 H' 是这条规则——「H' 作用于 f = 负的 H 作用于 f' = 负的从 0 到无穷的 f'(x) dx 的积分」。由微积分基本定理,最后那个积分是 f(无穷) 减 f(0),而 f 在远处恒为零故 f(无穷) = 0,恰好剩下 +f(0)。但「返回 f(0)」正是 delta 自己的规则。所以 H' = delta,干净且可证。台阶的斜率——经典微积分拒绝定义的东西——就是 delta,而现在这句话是一条定理、不是挥挥手蒙混。这一个恒等式,就是你将遇到的每一道跳跃背后的引擎。
DERIVATIVE OF A DISTRIBUTION (move d/dx onto the test function, flip the sign)
< T' , f > := - < T , f' > for every smooth test function f
(no boundary term: f vanishes far away)
WORKED: the step function H (H = 0 for x<0, H = 1 for x>0)
< H' , f > = - < H , f' >
= - integral over all x of H(x) f'(x) dx
= - integral from 0 to infinity of f'(x) dx
= - [ f(infinity) - f(0) ]
= - [ 0 - f(0) ]
= + f(0)
= < delta , f >
==> H' = delta (and one more derivative: < delta' , f > = - f'(0) )delta 的家族:导数、平移与缩放
既然求导不再花费什么,delta 便长出了一整个家族。它的一阶导数 delta',即偶极子,按我们刚导出的规则作用:delta' 作用于 f 等于负的 f'(0)。把它物理地想象成一对无穷靠近、方向相反的尖峰——一记小小的推紧接着一记同样大小的拉,这正是你为一个理想化的点偶或偶极子建模的方式。二阶导数 delta'' 返回 f''(0),沿着这架梯子继续往上;每一个新的导数都多探测测试函数在原点处行为的一个阶。这些不是稀奇玩意儿——你一旦对一个带折角的格林函数(大多数格林函数都带折角)求导,delta' 与 delta'' 就立刻冒出来。
另有两个操作让你能在 delta 落到哪里都对付得了。一个平移的 delta,delta(x 减 a),只不过是在点 a 处、而非原点处对测试函数采样:delta(x 减 a) f(x) dx 的积分 = f(a)。那正是坐落在位置 a 处的点源——你把它放在任何你想戳一下系统的地方的那个脉冲,整套格林函数构造的心脏。而一个缩放的 delta 服从 delta(c x) = delta(x) / |c|:把横轴按因子 c 压缩,会让尖峰在唯一要紧的意义上——积分——变高 c 倍,因为面积必须保持为一。绝对值要紧——用负的 c 把坐标轴翻转,并不会引入一个符号,因为面积是无符号的。这些规则不是要单独记下的孤立事实;每一条都是「要求那条作用于测试函数的定义保持自洽」逼出来给你的。
为什么这恰是格林函数所讲的语言
本级里的一切都悄悄依赖于我们刚搭起来的东西。一个格林函数 G(x, a) 被定义为对单位点源的响应,即 L G = delta(x 减 a) 的解,其中 L 是你的微分算子。那个方程在 delta 成为一个你能放到微分方程右端的正当对象之前,毫无意义——而广义函数恰恰就是这样一个对象。你用来手工搭出 G 的那条著名的跳跃条件——解连续,但它的导数在越过源点时跳变一个确定的量——无非就是把恒等式 H' = delta 倒着读:右端的一个 delta 迫使最高阶导数发生一个单位跳跃,因为「靠求导制造出一个 delta」唯一的办法就是这个。你当作菜谱学下来的那套记账,骨子里就是广义函数理论。
同样的思想把一个偏微分方程的基本解提升为一个严格的对象——例如拉普拉斯算子的自由空间格林函数,在广义函数的意义下满足 nabla 平方 G = delta,尽管 G 自身在源处爆掉、在那里当然不按经典方式二次可微。经典地看,那个方程在奇异点处是胡言乱语;而作为一句关于「两边如何作用于测试函数」的陈述,它精确无误。这就是整套方法之所以管用的更深层缘由:一个广义函数能解一个它逐点绝不可能满足的微分方程,因为那些导数是在弱的、测试函数的意义下被诠释的。delta 是让「单次尖锐戳击」成为正当输入的东西,而格林函数则是那正当的输出。
- 你遇到一个 delta 时,绝不要把它读作一个函数值;把它读作这条规则——「喂我一个光滑测试函数 f,我返回 f(0)」(对平移到 a 的 delta 则返回 f(a))。
- 要对任何广义函数求导,就把导数转移到测试函数上并翻转符号:T' 作用于 f 等于负的 T 作用于 f'。这总是行得通,因为测试函数无穷光滑。
- 使用主恒等式 H' = delta,在跳跃与 delta 之间来回换算——这恰恰是你手工构造格林函数时所施加的那条跳跃条件。
- 把 L G = delta(x 减 a) 读作一句关于「在测试函数上的作用」的陈述,而非逐点取值;正是这一点,让基本解与自由空间格林函数即便在 G 自身奇异之处也变得严格。