数值分析基础 — 有限元、有限体积、有限差分理论与求解器选择
老师,我知道FEM用于结构,FVM用于CFD,但为什么不同问题用不同方法?它们有根本性的区别吗?
这是个很好的问题!三种方法的区别本质上是"如何把连续的PDE变成离散的代数方程组"。FDM最直接(用差商近似导数);FVM从守恒形式出发,天然守恒性好(适合流体);FEM从弱形式出发,能灵活处理复杂几何和多物理场(适合结构、热、电磁)。没有万能的方法,选择取决于物理问题的性质。
1. 偏微分方程分类与数值方法综述
1.1 二阶PDE的分类
一般形式的二阶线性PDE(二维,$u = u(x,y)$):$A u_{xx} + B u_{xy} + C u_{yy} + \ldots = 0$,判别式 $\Delta = B^2 - 4AC$ 决定类型:
| 类型 | 判别式 | 典型方程 | 物理意义 | 特征 |
|---|---|---|---|---|
| 椭圆型 | Δ < 0 | 拉普拉斯方程 $\nabla^2 u = 0$,泊松方程 | 稳态:静力学、稳态热、静电 | 解光滑,边界值问题,全局信息传播 |
| 抛物型 | Δ = 0 | 热扩散方程 $u_t = \alpha\nabla^2 u$ | 瞬态扩散:瞬态热、准静态结构 | 信息沿时间正向传播,初边值问题 |
| 双曲型 | Δ > 0 | 波动方程 $u_{tt} = c^2\nabla^2 u$ | 波传播:声波、弹性波、可压缩流 | 有限速度传播,特征线存在,间断可能 |
PDE类型直接影响数值方法选择:椭圆型适合直接求解器;抛物型适合时间推进(隐式稳定);双曲型适合显式格式(但需稳定性条件)。
1.2 三大数值方法对比
| 方法 | 离散基础 | 守恒性 | 几何适应性 | 主要应用 |
|---|---|---|---|---|
| 有限差分(FDM) | Taylor展开近似导数 | 需要特殊构造 | 差(规则网格为主) | 计算流体(历史)、地震波传播 |
| 有限元(FEM) | 变分/弱形式,形函数插值 | 弱守恒性 | 极好(任意几何) | 结构、热、电磁、多物理场 |
| 有限体积(FVM) | 控制体积守恒,通量平衡 | 精确(强守恒) | 好(非结构网格支持) | CFD(主流),热流体 |
2. 有限差分法(FDM)
FDM是最简单的数值方法?原理是什么?
对,FDM是最直观的。核心思想就是用"差商"近似导数——把连续的微分操作换成相邻网格点值的差商。比如中心差分 $(u_{i+1} - u_{i-1})/(2\Delta x)$ 近似 $du/dx$,精度是二阶(误差量级 $\Delta x^2$)。越细的网格误差越小,这就是收敛性。
2.1 常用差分格式
泰勒展开推导差分公式:
一阶迎风格式(对流主导问题稳定):
2.2 稳定性——冯诺依曼分析
显式格式的稳定性条件(以热扩散方程为例):
违反此条件会导致数值振荡并发散。隐式格式(如Crank-Nicolson)无条件稳定,但每时间步需求解线性方程组。
2.3 FDM的局限性
- 复杂几何难以处理(需要贴体坐标变换,增加实现难度)
- 非结构网格支持差(规则/结构化网格为主)
- 边界条件施加不如FEM/FVM灵活
- 但在均匀矩形网格+简单边界情况下,FDM最高效、代码最简洁
3. 有限元法(FEM)数学基础
FEM的"弱形式"我总是搞不清楚——为什么要变成弱形式,直接用强形式(PDE本身)不行吗?
直接离散强形式(PDE)就是FDM的思路,但要求解在每个点处都满足方程(需要解足够光滑,有两阶连续导数)。弱形式只要求解在积分意义上满足方程,对解的光滑性要求低很多——这样就可以用分片多项式(形函数)来近似,处理复杂几何和不连续材料界面,这正是FEM的优势所在。
3.1 从强形式到弱形式
以泊松方程为例(强形式):$-\nabla^2 u = f$ 在 $\Omega$ 上,$u = 0$ 在 $\partial\Omega$ 上。
乘以任意测试函数 $v$(满足 $v = 0$ 在 $\partial\Omega$)并在 $\Omega$ 上积分:
通过分部积分(Green定理)降低对 $u$ 的可微性要求:
弱形式只要求 $u$ 有一阶偏导,而强形式要求二阶偏导存在。
3.2 Galerkin离散——形函数
将解近似为有限维子空间中的函数:$u_h = \sum_{j=1}^n u_j N_j(x)$,用同样的函数作为测试函数(Galerkin法),代入弱形式,得到线性方程组 $\mathbf{K}\mathbf{u} = \mathbf{f}$:
3.3 高阶单元与收敛率
$p$ 阶完全多项式单元对光滑解的收敛率:
$h$ 是网格尺寸,$p$ 是多项式阶次,$C$ 是与网格无关的常数。对于足够光滑的解,提高 $p$(h-p 加密)比单纯加密网格(h 加密)更高效。这就是谱元法、p型FEM的出发点。
3.4 常用单元及其特性
| 单元类型 | 形状 | 节点数 | 积分点数(标准) | 精度阶次 |
|---|---|---|---|---|
| 线性三角形(TRI3) | 三角形 | 3 | 1(面心) | O(h) |
| 二次三角形(TRI6) | 三角形(含中节点) | 6 | 3 | O(h²) |
| 线性四面体(TET4) | 四面体 | 4 | 1 | O(h) |
| 二次四面体(TET10) | 四面体(含棱中节点) | 10 | 4 | O(h²) |
| 线性六面体(HEX8) | 六面体 | 8 | 2×2×2=8 | O(h²)(规则) |
| 二次六面体(HEX20) | 六面体(含棱中节点) | 20 | 3×3×3=27 | O(h²)~O(h³) |
4. 有限体积法(FVM)
FVM说是"守恒",FEM说是"弱形式",守恒有什么特别的优势?
FVM的守恒意味着:在每一个离散控制体(网格单元)里,净流入 = 净流出 + 源项,精确成立。这对流体非常重要——质量守恒、动量守恒、能量守恒在每个格子里都精确满足,不会因为离散误差导致"质量凭空消失"或"能量不守恒"。FEM的守恒性只在整个域上的积分意义上成立,局部不一定守恒。
4.1 FVM的守恒形式
对守恒律 $\frac{\partial \phi}{\partial t} + \nabla \cdot \mathbf{F}(\phi) = S$ 在控制体 $V_P$ 上积分,并用高斯散度定理:
对所有面上的通量求和(以一维为例,$P$ 是当前格,$E/W$ 是东/西邻格):
$F_e$、$F_w$ 是界面通量,需要插值计算(此处是各种格式——迎风、中心、QUICK的区别所在)。
4.2 通量插值格式对比
| 格式 | 精度 | 数值扩散 | 稳定性 | 适用场景 |
|---|---|---|---|---|
| 一阶迎风 | O(h) | 大(过扩散) | 无条件稳定(稳态) | 快速粗略计算,复杂物理调试 |
| 中心差分(CDS) | O(h²) | 无数值扩散 | 可能振荡(高Pe数) | LES,低Pe数流动 |
| 二阶迎风(LUDS) | O(h²) | 小 | 好 | 工业CFD默认(Fluent) |
| QUICK | O(h³) | 很小 | 需限制器 | 结构化网格,精度要求高 |
| TVD格式 | O(h²)(单调区) | 自适应 | 无振荡(单调性保持) | 激波捕捉,可压缩流 |
4.3 OpenFOAM的FVM实现
OpenFOAM是开源FVM求解器,其代码结构高度模块化:
// OpenFOAM的扩散+对流方程(C++对象语法)
solve(
fvm::ddt(rho, phi) // 时间导数
+ fvm::div(phi, U) // 对流(使用插值)
- fvm::laplacian(nu, U) // 扩散
== fvOptions(rho, phi) // 源项
);
这种高级语法直接对应PDE,极大降低了实现新求解器的门槛。
5. 线性方程组求解器
FEM最终要解一个大型稀疏线性方程组,有哪些求解方法?选择时要考虑什么?
分两大类:直接求解器(Gauss消去/LU分解)和迭代求解器(共轭梯度、GMRES等)。简单说:直接求解器稳健但内存消耗大,适合中小规模(<10⁷自由度);迭代求解器内存效率高,适合大规模,但需要好的预处理器才能收敛快。
5.1 直接求解器
基于LU分解:$\mathbf{A} = \mathbf{L}\mathbf{U}$($\mathbf{L}$ 下三角,$\mathbf{U}$ 上三角),求解 $\mathbf{A}\mathbf{x} = \mathbf{b}$ 分为:
- 分解阶段:$\mathbf{A} = \mathbf{L}\mathbf{U}$,计算量 $O(n^3)$(一般矩阵)或 $O(n \cdot b^2)$(带宽 $b$ 的带状矩阵)
- 前代/回代:$\mathbf{L}\mathbf{y} = \mathbf{b}$,$\mathbf{U}\mathbf{x} = \mathbf{y}$,计算量 $O(n^2)$
稀疏直接求解器(MUMPS, PARDISO, SuperLU)通过填充最小化重排序(如Metis, AMD算法)大幅减少非零元素填入,使实际计算量远低于密集矩阵的 $O(n^3)$。3D结构问题约为 $O(n^{2})$。
5.2 迭代求解器
求解 $\mathbf{A}\mathbf{x} = \mathbf{b}$ 的迭代法:
- CG(共轭梯度):仅适用于对称正定矩阵(SPD),结构静力学的刚度矩阵满足此条件;收敛性好,每步计算一次矩阵-向量乘法
- GMRES(广义最小残差):适用于非对称矩阵(CFD压力方程、非对称刚度矩阵);需要存储Krylov子空间向量,内存随迭代步增加(重启策略:GMRES(m))
- BiCGSTAB:适用于非对称矩阵,内存需求固定(不需要重启),CFD中广泛使用
5.3 预处理器——提速的关键
迭代求解的收敛速度取决于矩阵条件数 $\kappa(\mathbf{A})$。预处理器 $\mathbf{M} \approx \mathbf{A}^{-1}$ 将问题变换为 $\mathbf{M}^{-1}\mathbf{A}\mathbf{x} = \mathbf{M}^{-1}\mathbf{b}$,使条件数减小:
| 预处理器 | 效果 | 计算代价 | 适用场景 |
|---|---|---|---|
| Jacobi(对角缩放) | 弱 | 极低 | 条件较好的矩阵,快速迭代 |
| ILU(0)(不完全LU) | 中 | 低 | CFD默认预处理,OpenFOAM中广泛用 |
| ILU(k)(允许k层填充) | 中高 | 中 | 条件数大的问题 |
| AMG(代数多重网格) | 最高(网格无关收敛) | 高(设置复杂) | 大规模结构和流体问题 |
6. 特征值求解器
模态分析要解广义特征值问题,实际FEM里的自由度有几百万,怎么可能全部求解特征值?
确实不可能全求解——$10^6$ 自由度的系统有$10^6$ 个特征值,但我们只需要前几十或几百阶(低频模态)。Lanczos算法是工业FEM软件(ANSYS、Nastran、Abaqus)用于大规模模态分析的主流算法,它通过Krylov子空间迭代,只求前$m$个最小特征值,计算量正比于 $m$(不是 $n$)。
6.1 常用特征值求解算法
| 算法 | 适用规模求解类型 | 特点 | 软件 | |
|---|---|---|---|---|
| 完全分解(LAPACK) | n < 10,000 | 所有特征值 | 精确,但O(n³),仅用于小模型 | MATLAB, SciPy |
| Lanczos | n < 10⁷ | 前m个最小 | 对称SPD矩阵,工业标准 | ANSYS, Nastran, Abaqus |
| Arnoldi/ARPACK | n < 10⁷ | 前m个(任意位置) | 非对称矩阵,声-结构耦合 | ARPACK, SLEPc |
| 幂迭代(Power Method) | 任意大 | 最大特征值 | 极简单,收敛慢,通常不单独用 | 教学用 |
| Jacobi-Davidson | 中大规模 | 内部特征值 | 目标特征值附近,适合特定频段 | SLEPc |
7. 数值精度与误差管理
网格收敛性研究怎么做?只是"加细网格看结果变化"这么简单吗?
不只是"看"——要定量评估。推荐用Richardson外推法和网格收敛指数(GCI)。三套网格(细/中/粗),网格细化比约 $r \approx 1.5$(每方向细化1.5倍),计算关键量的GCI值,就能给出误差的上界估计和外推后的"精确解"估计。这是ASME V&V 20标准推荐的方法,是CFD报告的必要内容。
7.1 Richardson外推
设关键量在三套网格上的值为 $f_1$(细)、$f_2$(中)、$f_3$(粗),细化比 $r = h_2/h_1 = h_3/h_2$,数值精度阶次 $p$:
外推"精确"值:
7.2 网格收敛指数(GCI)
细网格上的GCI(相对误差上界):
$e_{12} = (f_2 - f_1)/f_1$ 是相对误差,$F_s = 1.25$ 是安全系数(标准建议值)。一般要求 $GCI < 3\%$ 可认为网格收敛。
7.3 错误的来源与分类
| 误差类型 | 来源 | 控制方法 |
|---|---|---|
| 建模误差 | 简化假设(几何、物理、边界条件) | 与实验对比,V&V |
| 离散误差(截断误差) | FDM/FEM/FVM的网格近似 | 网格收敛性研究(GCI) |
| 迭代误差 | 非线性迭代或线性求解器未完全收敛 | 降低收敛残差(<10⁻⁶) |
| 舍入误差 | 浮点运算精度(双精度约10⁻¹⁵) | 通常不主导;大型问题用双精度 |
| 输入数据误差 | 材料属性、边界条件的不确定度 | 不确定性分析(UQ) |
8. 求解器选择指南
面对一个新的仿真问题,怎么决定用哪个数值方法和求解器?
按以下顺序决策:① 物理场类型(结构/流体/热/电磁/多物理)→ 基本确定用FEM还是FVM;② 问题规模(自由度数/网格数)→ 确定直接还是迭代求解器;③ 几何复杂度 → 确定网格类型(结构化/非结构化);④ 对精度和速度的要求→ 确定单元类型和格式精度。我把常见场景整理成一个表。
| 应用场景 | 推荐数值方法 | 推荐求解器 | 代表软件 |
|---|---|---|---|
| 线性/非线性结构分析 | FEM(TET10或HEX20) | 直接(<10⁷)或AMG预处理CG(>10⁷) | Abaqus, ANSYS Mechanical, CalculiX |
| 不可压缩CFD(湍流) | FVM(非结构多面体) | SIMPLE/SIMPLEC + ILU预处理BiCGSTAB | Fluent, OpenFOAM, Star-CCM+ |
| 可压缩流(激波) | FVM(TVD格式) | 密度基,Roe/AUSM格式 | Fluent(密度基), SU2 |
| 稳态热传导 | FEM(标量场,TET4/TET10) | CG + AMG(大规模) | Abaqus/Heat, ANSYS Steady-State Thermal |
| 模态分析(大规模) | FEM + Lanczos特征值 | 前k阶Lanczos迭代 | Nastran, ANSYS Modal, Abaqus Frequency |
| 电磁(低频涡流) | FEM(棱边元) | 直接或GMRES + AMG | ANSYS Maxwell, Flux |
| 高频电磁(天线) | FEM(频域)或FDTD | 直接(小),迭代(大) | HFSS, CST |
| 一维扩散(教学/原型) | FDM(FTCS/Crank-Nicolson) | 直接三对角(Thomas法) | Python/NumPy自写 |
数值方法常见误区
- 混淆收敛和正确:残差收敛≠结果正确。需要分别验证数值收敛(GCI)和物理正确(V&V与实验对比)
- 忽略条件数:病态矩阵(条件数大)会使迭代求解器收敛慢,直接求解器精度下降。单位制不一致(如N和kN混用)是条件数恶化的常见原因
- 高阶格式≠更准确:在非光滑解(激波、不连续性)处,高阶格式反而会产生振荡;需要限制器或降阶处理
- 时间步过大的隐式格式:隐式格式无条件稳定,但时间步过大会引入显著的时间离散误差(精度下降),并不代表步长可以任意大
- 不检查质量守恒:FVM计算后必须检查整体质量/能量守恒(CFD里进出口质量流量差应<0.1%)