椭圆型方程还没有正式解过。本节把细杆弯成圆盘,在极坐标里重演分离变量:直角坐标下束手无策的圆形边界,在同心圆坐标里变成"半径方向与圆周方向解耦"的标准局面。推导的终点是泊松积分公式——圆盘内部任一点的温度,等于边界值与一个显式核的加权平均。这是全书第一次拿到"边界数据决定内部解"的闭式公式,也是下一节格林函数思想的预演。
拉普拉斯方程 u_xx + u_yy = 0 在直角坐标里形式最简,但圆盘边界(x² + y² = R²)在直角网格上参差不齐——分离变量要求边界恰好落在坐标线上。极坐标 x = r·cosθ、y = r·sinθ 下,拉普拉斯算子变成
Δu = u_rr + (1/r)·u_r + (1/r²)·u_θθ,
而圆盘边界恰是 r = R 的坐标线。形式变复杂是买路钱:买到的是边界的简单。这个取舍在数值方法里反复出现——坐标选择本质上是"把几何难度转移给方程系数"。
设定问题:圆盘 r 小于 R,边界温度给定为 φ(θ)(圆周上位置的函数),求稳态温度分布。注意椭圆问题没有初始条件——温度场不随时间变,输入只有边界(2.2 节性格档案的又一兑现)。
假设 u(r,θ) = R(r)·Θ(θ),代入并同除 R·Θ,乘以 r²:
(r²R'' + rR')/R = −Θ''/Θ。
左边只依赖 r,右边只依赖 θ,两边只能等于同一常数 n²。角度方程 Θ'' + n²Θ = 0 的解要求在 θ 环绕一周后回到自身(单值性),这立刻强制 n 取整数:n = 0, 1, 2…,Θ = cos(nθ) 或 sin(nθ)。半径方程是欧拉型方程:
r²R'' + rR' − n²R = 0。
试解 R = r^m,得 m² − n² = 0,m = ±n。于是每个 n 给出两个分支:r 的 n 次幂与 r 的负 n 次幂。关键抉择在此:r 的负幂在原点爆炸,而圆盘内部包含原点、温度必须有限——负幂分支整体出局。有界性条件不动声色地完成了筛选,这是椭圆问题"内部自动光滑"性格(2.2 节)的第一次显形。
于是通解是
u(r,θ) = A₀ + Σ (r/R)ⁿ·[a_n·cos(nθ) + b_n·sin(nθ)],
系数由边界值做傅里叶展开读出:a_n、b_n 正是 φ(θ) 的傅里叶系数(A₀ 是均值项)。与 3.1 完全平行的三件套再次出现:离散谱、正交基、系数公式——区域从线段换成圆周,剧本不变。

级数解好用但不直观——想要某点的温度,得把无穷级数加一遍。把系数代回、交换求和次序并动用几何级数求和,级数可以收敛成一个闭式积分(推导是标准的几何级数练习,值得自己在草稿纸上走一遍):
u(r,θ) = (1/2π)·∫[0,2π] P(r,θ−s)·φ(s) ds,其中核
P(r,α) = (R² − r²) / (R² − 2Rr·cos(α) + r²)。
这就是泊松积分公式。它的读法极富物理味:内部点的温度是边界温度的加权平均,权重由泊松核分配。核的两个性质可以直接核验:r = 0 时 P 恒等于 1,圆心温度是边界值的算术平均(对称位置互相抵消);r 趋近 R 时核收缩成德尔塔式尖峰,边界点附近的值由正对的边界数据接管。加权平均结构还立刻给出极值原理:平均不可能超过输入的最大值——2.3 节的契约在公式层面看得一清二楚。
解析两条路线(部分和、泊松积分)应当重合;再请来一条独立路线:在圆盘网格上直接离散拉普拉斯算子迭代求解(简单迭代法,第四章正式讲),三方互证。取边界值 φ(θ) = cos(2θ)(一侧热一侧冷的偶极分布),理论解恰是单项 u = (r/R)²·cos(2θ),这是极坐标分离变量的"教科书款"。
import numpy as np R = 1.0 # 理论单项解 u_exact = lambda r, th: (r/R)**2 * np.cos(2*th) # 路线一:级数(只有 n=2 项非零,系数 a2 = 1) th = np.linspace(0, 2*np.pi, 361, endpoint=False) r_in, th_in = 0.6, np.pi/5 u_series = (r_in/R)**2 * np.cos(2*th_in) # 路线二:泊松核数值积分 s = np.linspace(0, 2*np.pi, 3601, endpoint=False) phi_b = np.cos(2*s) P = (R**2 - r_in**2) / (R**2 - 2*R*r_in*np.cos(th_in - s) + r_in**2) u_poisson = np.trapz(P * phi_b, s) / (2*np.pi) # 路线三:极坐标网格上 Jacobi 迭代解离散拉普拉斯(n_r=40, n_th=90) nr, nt = 40, 90 rs = np.linspace(0.05, R, nr); ths = np.linspace(0, 2*np.pi, nt, endpoint=False) U = np.zeros((nr, nt)) U[-1, :] = np.cos(2*ths) # 边界条件 for _ in range(20000): Un = U.copy() c = (rs[1:-1]**2 + rs[1:-1]) / (2*rs[1:-1]**2) # 径向系数(步长均一简化) d = (rs[1:-1]**2 - rs[1:-1]) / (2*rs[1:-1]**2) ang = rs[1:-1]**2 * (1/rs[1:-1]**2) # 角向系数 = 1 U[1:-1,1:-1] = 0.5/(1+ang)*(c*Un[2:,1:-1] + d*Un[:-2,1:-1] + ang*(np.roll(Un[1:-1],1,axis=1)[:,1:-1] + np.roll(Un[1:-1],-1,axis=1)[:,1:-1])) i = np.argmin(np.abs(rs - r_in)); j = np.argmin(np.abs(ths - th_in)) print("理论:", u_exact(r_in, th_in)) print("级数:", u_series, " 泊松核:", round(u_poisson, 6), " 迭代:", round(U[i,j], 6))
四个数在网格与求和精度内重合。三方对表的意义各不相同:级数与核的重合验证了"求和可化为积分"的推导;迭代解与前两者的重合验证了离散拉普拉斯算子写对了——椭圆问题的数值路线在本节提前亮相,误差来源(网格分辨率、迭代次数)到第四章展开。
两个延伸标注坐标。其一,圆环、扇形、半球沿用同一剧本:环域允许负幂分支回归(原点不在区域内),内外边界两组条件定系数;扇形需要额外的楔角条件。其二,泊松核是圆盘的格林函数:把边界点源对内部点的响应写成公式,就是下一节的主角——格林函数把"边界加权平均"推广成"源与响应的通用语言",泊松积分只是它在圆盘上的具体长相。
⚠️ 常见坑:n 从 0 数起还是 1 数起、常数项系数是 1/2 还是 1,是极坐标傅里叶展开最高频的记号事故。写完通解后必须做两个体检:r = 0 处有界、边界处退化回 φ——两条都过,记号才算对。
加权平均的核从哪里来?把"边界上的一点"想成一个源,答案就有了统一的名字:格林函数。下一节把点源响应讲成通用语言,椭圆问题的求解从此获得集成视角。