2. 一维Poisson方程:强形式与弱形式推导,边界条件的引入

好,咱们正式开始动手了。这一章是整个有限元求解的基石——从一维Poisson方程出发,把强形式、弱形式、边界条件这些概念彻底理清楚。我当年刚学有限元时,就是被这些“形式”绕晕的。后来发现,说白了就三件事:方程怎么列、怎么积分、边界怎么处理。

2.1 问题定义:一维Poisson方程

考虑一个最简单的物理场景——一根长度为L的细杆,内部有热源分布,两端保持固定温度。稳态下,温度分布u(x)满足一维Poisson方程:

-d²u/dx² = f(x),   x ∈ (0, L)

其中f(x)是已知的热源项。边界条件我们分两类讨论:

  • Dirichlet边界:u(0) = u₀, u(L) = u_L(温度给定)
  • Neumann边界:du/dx(0) = q₀(热流给定)

我在项目中遇到过不少新手,一上来就写代码求解,结果边界条件加错了,算出来的温度场完全不对。所以咱们先把数学底子打牢。

2.2 强形式(Strong Form)

强形式就是原始微分方程加上边界条件。它要求解u(x)在每一点都满足方程,这对解的光滑性要求很高——u必须是二阶可导的连续函数。

强形式完整表述:

控制方程:-d²u/dx² = f(x),   x ∈ (0, L)
边界条件:u(0) = u₀,  u(L) = u_L

要求:u ∈ C²(0, L) ∩ C⁰[0, L]

你想想看,实际工程中哪有这么理想的函数?杆件材料不均匀、截面突变、载荷不连续……强形式在数值求解时非常困难。这就是为什么我们需要弱形式。

2.3 弱形式(Weak Form)的推导

弱形式的核心思想:不要求每一点都满足方程,只要求在“平均意义”上满足。怎么实现?用加权残量法。

具体步骤我带你走一遍:

  1. 引入权函数:将控制方程乘以一个任意权函数v(x),然后在全域积分
  2. 分部积分:降低对u的导数阶数,同时自然引入边界项
  3. 施加边界条件:将已知边界值代入

推导过程如下:

∫₀ᴸ v(x) · [-d²u/dx²] dx = ∫₀ᴸ v(x) · f(x) dx

分部积分:
∫₀ᴸ (dv/dx)(du/dx) dx - [v · du/dx]₀ᴸ = ∫₀ᴸ v · f dx

整理得弱形式:
∫₀ᴸ (dv/dx)(du/dx) dx = ∫₀ᴸ v · f dx + v(L) · du/dx(L) - v(0) · du/dx(0)

个人经验:分部积分这一步是核心。它把对u的二阶导数降为一阶,这样我们就可以用线性插值函数(C⁰连续)来近似u了。我早期做热-力耦合分析时,这一步理解透了,后面处理复杂边界就顺了。

2.4 边界条件的引入方式

边界条件在弱形式中分两种方式引入,这是最容易出错的地方。

边界类型 数学表述 弱形式处理 我的建议
Dirichlet(本质边界) u = ū 强制施加到试探函数空间;权函数在边界上取零 先处理,再组装矩阵
Neumann(自然边界) du/dx = q̄ 直接代入弱形式边界项 后处理,加到右端项
Robin(混合边界) du/dx + αu = β 代入后产生附加刚度项 同时影响矩阵和右端项

嗯,这里要注意:Dirichlet边界是“强制”的,你必须修改刚度矩阵和右端向量来满足它。而Neumann边界是“自然”的,它自动出现在弱形式的边界积分项中,你只需要把已知值代进去就行。

我曾经踩过的坑:做一维热传导时,把Neumann边界条件直接加到刚度矩阵里了,结果算出来的温度场在边界处出现异常跳跃。后来排查了半天才发现——Neumann边界只影响右端项,不影响矩阵。记住这个教训。

2.5 知识体系结构图

下面这张图把本章的核心逻辑串起来了。我建议你把它当作思维导图来用。

一维Poisson方程:强形式 → 弱形式 → 边界条件 一维Poisson方程 强形式 (Strong Form) -d²u/dx² = f(x) u ∈ C²(0,L) ∩ C⁰[0,L] 每点精确满足 弱形式 (Weak Form) ∫(dv/dx)(du/dx)dx = ∫v·f dx + 边界项 u ∈ H¹(0,L)(C⁰连续即可) 平均意义满足(加权残量) 边界条件引入方式 Dirichlet(本质边界) Neumann(自然边界) Robin(混合边界)

2.6 一个完整的推导示例

咱们用具体边界条件走一遍完整流程。假设:

  • 杆长L = 1,热源f(x) = 2
  • 左端温度u(0) = 0(Dirichlet)
  • 右端热流du/dx(1) = 1(Neumann)

Step 1:写出强形式

-d²u/dx² = 2,  x ∈ (0,1)
u(0) = 0
du/dx(1) = 1

Step 2:推导弱形式

∫₀¹ v·(-d²u/dx²) dx = ∫₀¹ v·2 dx

分部积分:
∫₀¹ (dv/dx)(du/dx) dx - [v·du/dx]₀¹ = ∫₀¹ 2v dx

代入边界:
v(1)·du/dx(1) - v(0)·du/dx(0) = v(1)·1 - v(0)·du/dx(0)

由于u(0)=0是本质边界,权函数v(0)=0,所以v(0)·du/dx(0)=0

最终弱形式:
∫₀¹ (dv/dx)(du/dx) dx = ∫₀¹ 2v dx + v(1)·1

关键观察:

  • Neumann边界条件(du/dx(1)=1)直接出现在右端项中
  • Dirichlet边界条件(u(0)=0)通过限制试探函数空间来施加
  • 权函数v在Dirichlet边界上必须取零

Step 3:解析解验证

对强形式积分两次:
u(x) = -x² + C₁x + C₂

代入边界条件:
u(0) = 0 → C₂ = 0
du/dx(1) = -2 + C₁ = 1 → C₁ = 3

解析解:u(x) = -x² + 3x

这个解析解可以用来验证后续有限元代码的正确性。我每次开发新程序,都会先用这种简单例子做验证——确保弱形式推导和边界条件施加都没问题,再上复杂模型。

2.7 常见误区与避坑指南

误区1:认为弱形式比强形式“弱”所以精度低。其实不是——弱形式放宽了对解的光滑性要求,但通过选择合适的权函数空间,可以保证解在能量范数下收敛到真解。

误区2:忘记在Dirichlet边界上限制权函数。如果权函数v在Dirichlet边界上不为零,会导致刚度矩阵奇异,求解失败。

我的调试习惯:每次写完弱形式代码,先用一个已知解析解的问题做测试。如果误差在10⁻⁶量级,说明推导和实现都正确。如果误差大,优先检查边界条件施加是否正确——这是80%问题的根源。

好了,这一章的内容就到这儿。强形式到弱形式的推导,边界条件的分类与引入方式,这些是后续所有章节的基础。你把这些吃透了,后面处理复杂边界条件就会轻松很多。