跳到正文
格致开物MATHWIKI

摄动法

摄动法(perturbation method)利用问题中的小参数,从较容易求解的基准问题逐步构造近似解。小参数必须相对于已经选定的尺度来理解;一个带单位的系数数值很小,并不自动说明它的作用很小。无量纲化常用来先把这种比较写清楚。

摄动解的关键问题是近似误差随参数怎样变化,以及近似在什么区域内有效。同一代数方程的两条解分支,可以展示逐阶修正与重新选尺度的区别。

代数方程的逐阶修正

考虑 y+εy2=2,ε≥0, 并选取非负解。当 ε=0 时解为二;当 ε 很小时,可以尝试在二附近展开: y=y0+εy1+ε2y2+⋯. 这里 y0,y1,y2 是待求系数,不是同一个参数下的不同解。把展开代入,并把同次幂放在一起: y0+ε(y1+y02)+ε2(y2+2y0y1)+⋯=2. 常数项要求 y0=2;一次项要求 y1=−y02=−4;二次项要求 y2=−2y0y1=16。保留到二次项,得到近似 y[2]=2−4ε+16ε2. 这种在所选解分支附近逐次修正的情形称为正则摄动。形式配平给出候选式,误差还需要验证。[1]

这道方程还能求出精确解。为避免 1+8ε−1 在小参数下出现相近数相减,将正根有理化为 y∗=41+1+8ε. 此式在 ε=0 也适用。在 ε=0.05 时,精确值约为 1.832159566;零阶、一次及二次近似分别为 2、1.8、1.84。对应的绝对误差约为 0.167840434、0.032159566、0.007840434。

小参数0到0.1上的精确正根与一阶、二阶摄动近似,在0.05处二阶近似更接近精确解
连续曲线是精确正根,虚线、点划线分别保留到一次项和二次项。近似效果随参数大小变化。

从残差得到误差界

将近似解代回原方程,得到的偏差叫残差。令 F(y)=y+εy2−2。直接展开可得 F(y[2])=80ε3−128ε4+256ε5=:R. 近似解为正,因为 2−4ε+16ε2=16(ε−1/8)2+7/4;精确正根也为正。在这两点之间,F′(y)=1+2εy≥1。由拉格朗日中值定理,存在中间点 ξ,使 R=F(y[2])−F(y∗)=F′(ξ)(y[2]−y∗),|y[2]−y∗|≤|R|. 在 ε=0.05 时,R=0.00928,确实大于实际误差。对 0≤ε≤0.1,还有 |R|≤95.36ε3,从而证明二次近似的误差为 O(ε3)。这里的大 O 是有统一常数的误差界,不是宣称误差恰好等于某个三次项。

若换成 ε=0.5,一次近似为零、二次近似为四,而精确正根约为 1.23607。保留更多项在此处反而更差。摄动展开描述的是小参数极限,截断阶数不能脱离参数范围判断。

消失的第二条解分支

前面选取的是非负解。同一个方程在 ε>0 时其实有两个实根;若还要寻找负根,只围绕二修正就不够了。由二次方程的根之和,有 y−+y+=−1ε,y+=41+1+8ε,y−=−1ε−y+. 当 ε→0+ 时,正根趋于二,负根却趋于负无穷;令参数为零后,负根没有对应的有限解。这说明“正则”或“奇异”还取决于所研究的解分支。直接删掉小参数项,可以保留正根的极限,却会丢失另一条分支。[1]

负根上不能因为 ε 小就把 εy2 删掉。若 y 的量级为 1/ε,那么 y 与 εy2 的量级都为 1/ε,它们恰好相互抵消,才留下右边的二。这种平衡需要另一种尺度。

重新选尺度

令 z=εy,把原方程乘以 ε,得到 z2+z=2ε. 新变量把发散的负根放回有限范围:参数为零时,基准方程 z(z+1)=0 有 z=0、z=−1 两个分支。前者对应正根的缩放,后者对应被原来极限丢掉的负根。

围绕 z0=−1,写成 z=−1+εa+ε2b+ε3c+⋯。代入后,按次幂配平: −εa+ε2(a2−b)+ε3(2ab−c)+⋯=2ε. 于是 a=−2,b=a2=4,c=2ab=−16。换回 y=z/ε 后, y−,[2]=−1ε−2+4ε−16ε2. 这里在 z 中保留到三次项,除以参数后才能得到 y 中的二次修正;截断阶数也要随变量变换一起核对。

缩放变量z等于参数乘以y后,两条解分支分别趋于零和负一,负分支的三次近似与精确曲线接近
缩放后的两条分支都保持有限。负分支趋于负一,对应原变量中负根按一除以小参数的量级发散。

在 ε=0.05 时,负根约为 −21.832159566,近似为 −21.84。根之和还把误差核验简化了:因为 y−=−1ε−y+,y−,[2]=−1ε−y+,[2], 两根近似的误差互为相反数,绝对值相同。所以前面证明的残差界 |R| 同时控制两条分支,而不是只凭两条曲线在图上接近来判断。

可复算的实现

下面的 Python 代码计算两个浮点根、两条截断近似及本例的理论误差界表达式。输入为有限实数 0<ε≤0.1;若倒数或负根超出浮点范围则报错。输入零时没有第二个有限根,因此不在函数定义域内。正根采用有理化表达式,负根利用根之和,避免用相近数相减求小正根。每次调用使用常数次标量运算,时间和额外空间均为 O(1),不改写输入。

Python 3
import math

def perturbation_roots(epsilon):
    if not math.isfinite(epsilon) or not (0.0 < epsilon <= 0.1):
        raise ValueError("require finite 0 < epsilon <= 0.1")
    inverse = 1.0 / epsilon
    positive = 4.0 / (1.0 + math.sqrt(1.0 + 8.0 * epsilon))
    negative = -inverse - positive
    positive_approx = 2.0 - 4.0 * epsilon + 16.0 * epsilon ** 2
    negative_approx = -inverse - positive_approx
    if not all(math.isfinite(v) for v in (inverse, negative, negative_approx)):
        raise ValueError("negative branch exceeds float range")
    analytic_bound = (epsilon ** 3) * (80.0 - 128.0 * epsilon
                                      + 256.0 * epsilon ** 2)
    return {"positive": positive, "negative": negative,
            "positive_approx": positive_approx,
            "negative_approx": negative_approx,
            "analytic_bound": analytic_bound}

print(perturbation_roots(0.05))
print(perturbation_roots(0.1))

代码返回的根和误差界也是浮点近似,理论界约束的是精确算术下的截断误差,不包含浮点舍入;极小参数还可能使误差界下溢为零,不能据此宣称实际数值已严格精确。若需要经认证的区间界,还须采用适当精度或区间运算。

将参数改成 0.1 可作为变式:正根约为 1.708203932,负根约为 −11.708203932;两近似为 1.76、−11.76,绝对误差均约为 0.051796068,小于 R=0.06976。这个变式同时检查配平、尺度变换和误差比较。

渐近近似的范围

正根的成功不意味着同一展开能找到所有解,负根重新选尺度后的成功也不意味着所有奇异问题都能化为代数配平。微分方程中,小参数乘最高阶导数可能使方程降阶,产生边界层;解在固定位置接近,并不保证在整个区间内一致接近。这样的空间局部化和内外匹配在奇异摄动中另作完整推导。

无论采用哪一种展开,都应把近似代回原问题,检查所选解分支、参数范围及附加条件。残差能否控制误差,取决于问题对扰动的响应。在本篇每个精确根与其对应截断近似之间,导数的绝对值至少为一,使残差可以控制根的误差;一般微分方程不能不经论证就沿用这个界。

参考文献

  1. ↑ 1.0 1.1 Stephen J. Cowley,Perturbation Methods,University of Cambridge,Michaelmas 2022,第1.1—1.2节及第5节。参考正则展开、重新选尺度和匹配渐近展开的方法;本文方程与配图独立编写。