4. 边界条件离散
在有限差分法中,边界条件不是“附加说明”,而是决定解是否唯一、精度是否达标的关键组成部分。内部节点用中心差分近似二阶导数,但边界节点缺少一侧邻居,必须单独处理。本节围绕三类常见边界条件——Dirichlet(给定函数值)、Neumann(给定法向导数)、Robin(给定函数值与法向导数的线性组合)——说明它们的离散方式,并重点讲清虚拟节点法与单侧差分格式的取舍。
一、先约定方向与符号
为避免正负号混乱,本节统一约定:一维区间为 [0, L],节点 x_i = i·h,i = 0,1,…,N,h = L/N;外法向导数在左端 x=0 指向负方向,在右端 x=L 指向正方向。即左端法向导数写作 −∂u/∂x,右端写作 +∂u/∂x。后文所有公式与图示均按此约定,切换参照系时必须显式说明。
二、Dirichlet 边界:最直接,但要处理“未知量编号”
若 u(0)=g₀,则边界值已知,不需要为节点 0 建立方程。内部节点 i=1 的方程中会出现 u₀,直接代入 g₀ 并移到右端项即可。例如泊松方程 −u''=f 的中心差分:
(−u_{i−1} + 2u_i − u_{i+1}) / h² = f_i
i=1 时: (2u_1 − u_2) / h² = f_1 + g₀ / h²
右端同理。Dirichlet 边界的实质是“消元”:边界节点不进入未知量向量,只贡献右端项。实现上,若采用全局编号并保留边界未知量,也可把边界行写成 u₀ = g₀,但更常见的做法是压缩未知量规模。
三、Neumann 边界:虚拟节点法 vs 单侧差分
设左端 −u'(0)=q₀(即 u'(0)=−q₀)。边界节点 0 没有 x_{−1},有两种主流处理。
虚拟节点法(二阶精度,推荐)。在区间外引入虚拟节点 x_{−1}=−h,令 u_{−1} 为虚拟值。用中心差分表示边界导数:
(u_1 − u_{−1}) / (2h) = −q₀ ⇒ u_{−1} = u_1 + 2h·q₀
再对节点 0 写中心差分方程:
(−u_{−1} + 2u_0 − u_1) / h² = f_0
将 u_{−1} 代入,消去虚拟值:
(2u_0 − 2u_1) / h² = f_0 + 2q₀ / h
这样边界方程与内部方程同为二阶精度,且矩阵仍保持对称三对角结构(若原问题对称)。虚拟节点法的要点是:虚拟值只作为中间量,最终必须被消去,不能留在未知量向量中,否则方程数与未知量数不匹配。
单侧差分格式(一阶或二阶)。不引入虚拟节点,直接用节点 0、1、2 近似导数。一阶格式:
(u_1 − u_0) / h = −q₀ ⇒ u_0 − u_1 = h·q₀
该式只有一阶精度,会拉低整体误差阶。二阶单侧格式用三点:
(−3u_0 + 4u_1 − u_2) / (2h) = −q₀
精度恢复为二阶,但边界方程涉及三个节点,矩阵首行不再对称,且当 h 很小时系数 −3/(2h) 量级较大,条件数略差。工程上若追求实现简单、网格较粗,一阶单侧格式可接受;若做收敛性验证或精度敏感问题,应优先虚拟节点法或二阶单侧格式。
四、Robin 边界:把两类信息合成一个方程
设左端 αu(0) − βu'(0) = γ(α,β 为常数,β≠0)。仍用虚拟节点:由 u'(0)=(u_1−u_{−1})/(2h) 得 u_{−1}=u_1−2h·u'(0),而 u'(0)=(αu_0−γ)/β,代入后消去 u_{−1},再与节点 0 的中心差分方程联立,得到只含 u_0,u_1 的边界方程。其一般形式为:
(2αh + 2β)u_0 − 2βu_1 = 2hγ + h²·f_0·β / h (示意,按具体系数整理)
实际实现时不必背公式,按“写虚拟值表达式 → 代入边界节点方程 → 整理同类项”三步走即可。Robin 边界的关键是:它同时含 u 与 u',不能像 Dirichlet 那样直接消元,也不能像纯 Neumann 那样只改右端项,必须生成一条独立的边界代数方程。
五、一个可手算的示例
取 L=1、N=4、h=0.25,方程 −u''=0,左端 u(0)=0(Dirichlet),右端 u'(1)=1(Neumann,外法向)。精确解为 u=x。内部节点 1、2、3 的中心差分给出 −u_{i−1}+2u_i−u_{i+1}=0。右端用虚拟节点:u_{N+1}=u_{N−1}+2h·1,代入节点 4 的方程得 2u_4−2u_3=2h,即 u_4−u_3=h。联立可解出 u_1=0.25, u_2=0.5, u_3=0.75, u_4=1.0,与精确解一致。这说明对线性函数,虚拟节点法能精确复现(因为格式对一次多项式精确)。若改用一阶单侧格式 u_4−u_3=h,结果相同;但对二次解,一阶格式会引入 O(h) 误差,而虚拟节点法仍保持 O(h²)。
六、实现要点与常见错误
- 虚拟值必须消去。若把
u_{−1}当作未知量保留,方程数会多一个或少一个,矩阵非方。 - 法向符号要统一。左端外法向为负,右端为正;写
q₀时先确认它对应的是−u'(0)还是u'(0)。 - 边界方程也要满足精度阶。内部二阶、边界一阶,整体收敛阶会被拉低到一阶;做网格收敛验证时,应同时加密网格观察误差斜率。
- Robin 边界不要漏掉
f_0项。边界节点同样满足微分方程,虚拟值代入后f_0仍在右端。 - 矩阵结构变化要提前评估。二阶单侧格式使首行非对称,若使用对称求解器需改用通用稀疏求解器或做对称化处理。
总结来说,Dirichlet 边界做消元,Neumann 边界优先用虚拟节点法消去虚拟值以获得二阶精度,Robin 边界则把虚拟值表达式代入边界方程生成独立代数行。三者共同的原则是:边界方程必须与内部方程组成方阵,且精度阶尽量与内部格式匹配。