数值分析基础 — 有限元、有限体积、有限差分理论与求解器选择

🧑‍🎓

老师,我知道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 常用差分格式

泰勒展开推导差分公式:

$$\frac{du}{dx}\bigg|_i \approx \frac{u_{i+1} - u_{i-1}}{2\Delta x} + O(\Delta x^2) \quad\text{(二阶中心差分)}$$
$$\frac{d^2u}{dx^2}\bigg|_i \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{\Delta x^2} + O(\Delta x^2) \quad\text{(二阶中心二阶导)}$$

一阶迎风格式(对流主导问题稳定):

$$\frac{du}{dx}\bigg|_i \approx \frac{u_i - u_{i-1}}{\Delta x} + O(\Delta x) \quad\text{(向后差分,一阶精度)}$$

2.2 稳定性——冯诺依曼分析

显式格式的稳定性条件(以热扩散方程为例):

$$\frac{\alpha\Delta t}{\Delta x^2} = \text{CFL数} \leq \frac{1}{2} \quad\text{(一维,显式Euler)}$$

违反此条件会导致数值振荡并发散。隐式格式(如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$ 上积分:

$$-\int_\Omega v \nabla^2 u\, d\Omega = \int_\Omega v f\, d\Omega$$

通过分部积分(Green定理)降低对 $u$ 的可微性要求:

$$\int_\Omega \nabla v \cdot \nabla u\, d\Omega = \int_\Omega v f\, d\Omega \quad\text{(弱形式)}$$

弱形式只要求 $u$ 有一阶偏导,而强形式要求二阶偏导存在。

3.2 Galerkin离散——形函数

将解近似为有限维子空间中的函数:$u_h = \sum_{j=1}^n u_j N_j(x)$,用同样的函数作为测试函数(Galerkin法),代入弱形式,得到线性方程组 $\mathbf{K}\mathbf{u} = \mathbf{f}$:

$$K_{ij} = \int_\Omega \nabla N_i \cdot \nabla N_j\, d\Omega, \quad f_i = \int_\Omega N_i f\, d\Omega$$

3.3 高阶单元与收敛率

$p$ 阶完全多项式单元对光滑解的收敛率:

$$\|u - u_h\|_{H^1} \leq C h^p \|u\|_{H^{p+1}}$$

$h$ 是网格尺寸,$p$ 是多项式阶次,$C$ 是与网格无关的常数。对于足够光滑的解,提高 $p$(h-p 加密)比单纯加密网格(h 加密)更高效。这就是谱元法、p型FEM的出发点。

3.4 常用单元及其特性

单元类型形状节点数积分点数(标准)精度阶次
线性三角形(TRI3)三角形31(面心)O(h)
二次三角形(TRI6)三角形(含中节点)63O(h²)
线性四面体(TET4)四面体41O(h)
二次四面体(TET10)四面体(含棱中节点)104O(h²)
线性六面体(HEX8)六面体82×2×2=8O(h²)(规则)
二次六面体(HEX20)六面体(含棱中节点)203×3×3=27O(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$ 上积分,并用高斯散度定理:

$$\frac{d}{dt}\int_{V_P} \phi\, dV + \oint_{\partial V_P} \mathbf{F} \cdot d\mathbf{S} = \int_{V_P} S\, dV$$

对所有面上的通量求和(以一维为例,$P$ 是当前格,$E/W$ 是东/西邻格):

$$\frac{\partial \bar{\phi}_P}{\partial t} V_P + (F_e - F_w) A = \bar{S}_P V_P$$

$F_e$、$F_w$ 是界面通量,需要插值计算(此处是各种格式——迎风、中心、QUICK的区别所在)。

4.2 通量插值格式对比

格式精度数值扩散稳定性适用场景
一阶迎风O(h)大(过扩散)无条件稳定(稳态)快速粗略计算,复杂物理调试
中心差分(CDS)O(h²)无数值扩散可能振荡(高Pe数)LES,低Pe数流动
二阶迎风(LUDS)O(h²)工业CFD默认(Fluent)
QUICKO(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}$ 分为:

  1. 分解阶段:$\mathbf{A} = \mathbf{L}\mathbf{U}$,计算量 $O(n^3)$(一般矩阵)或 $O(n \cdot b^2)$(带宽 $b$ 的带状矩阵)
  2. 前代/回代:$\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
Lanczosn < 10⁷前m个最小对称SPD矩阵,工业标准ANSYS, Nastran, Abaqus
Arnoldi/ARPACKn < 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$:

$$p = \frac{\ln\left(\frac{f_3-f_2}{f_2-f_1}\right)}{\ln r}$$

外推"精确"值:

$$f_{exact} \approx f_1 + \frac{f_1 - f_2}{r^p - 1} \quad\text{(Richardson外推)}$$

7.2 网格收敛指数(GCI)

细网格上的GCI(相对误差上界):

$$GCI_{fine} = \frac{F_s |e_{12}|}{r^p - 1} \times 100\%$$

$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预处理BiCGSTABFluent, 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 + AMGANSYS Maxwell, Flux
高频电磁(天线)FEM(频域)或FDTD直接(小),迭代(大)HFSS, CST
一维扩散(教学/原型)FDM(FTCS/Crank-Nicolson)直接三对角(Thomas法)Python/NumPy自写

数值方法常见误区

  • 混淆收敛和正确:残差收敛≠结果正确。需要分别验证数值收敛(GCI)和物理正确(V&V与实验对比)
  • 忽略条件数:病态矩阵(条件数大)会使迭代求解器收敛慢,直接求解器精度下降。单位制不一致(如N和kN混用)是条件数恶化的常见原因
  • 高阶格式≠更准确:在非光滑解(激波、不连续性)处,高阶格式反而会产生振荡;需要限制器或降阶处理
  • 时间步过大的隐式格式:隐式格式无条件稳定,但时间步过大会引入显著的时间离散误差(精度下降),并不代表步长可以任意大
  • 不检查质量守恒:FVM计算后必须检查整体质量/能量守恒(CFD里进出口质量流量差应<0.1%)
跨主题标签(Cross-topics)
结构力学FEM 流体力学FVM 传热学FEM 验证与确认 GCI网格收敛计算器 截断误差可视化