数值分析的基础 — FEMFVMFDM的理論精度

分类:基础理论 | 2026-03-25 | 网站地图
NovaSolver Contributors
CAE visualization for numerical methods - technical simulation diagram
Numerical Methods

PDE与数值解法的全景

CAE的所有分析工作,归根结底是用数值方法求解偏微分方程(PDE)。为了在计算机上处理PDE,需要将连续体离散化为有限个点、单元或网格。其中FDM、FEM、FVM三种方法是主要的求解方式。

🧑🎓

老师,我经常听到FEM,OpenFOAM是FVM。这两个从根本上有什么不同吗?有一个比另一个更好吗?

🎓

从哲学上讲,FEM是"在整体上张开试验函数",FVM是"直接守护各单元的守恒律"的方法论差异。FEM擅长复杂边界形状和各向异性材料,是结构分析的主流。FVM保证质量、动量、能量守恒,成为流体分析(CFD)的主流。不是"哪一个更好",而是"根据问题对象进行分工",这样想才是准确的。

1.1 PDE的分类

二阶线性PDE根据系数的性质可分为3种:

分类典型PDE数学特征代表物理现象
椭圆型$\nabla^2 u = f$(拉普拉斯/泊松方程)稳态状态。所有边界条件都有影响稳态热传导、静电场、线性弹性(稳态)
抛物型$\partial u/\partial t = \alpha \nabla^2 u$(扩散方程)时间演化。初值+边界值问题非稳态热传导、扩散、粘性流动
双曲型$\partial^2 u/\partial t^2 = c^2 \nabla^2 u$(波动方程)有限传播速度。具有特征线弹性波、音波、冲击波

1.2 各方法的哲学差异

方法离散化思想守恒性主要应用领域
FDM用泰勒展开近似微分为差分一般不保证(通常)简单域、学术研究、DNS
FEM用基函数近似解并最小化残差在弱形式中自然满足结构、热、电磁、多物理耦合
FVM直接离散化各单元的积分形守恒律局部严格满足流体(CFD)、热流耦合

有限差分法(FDM)

2.1 泰勒展开与差分近似

泰勒展开式:

$$u(x + h) = u(x) + h u'(x) + \frac{h^2}{2}u''(x) + \frac{h^3}{6}u'''(x) + \cdots$$

由此推导一阶导数的近似:

$$u'(x) \approx \frac{u(x+h) - u(x)}{h} - \frac{h}{2}u''(\xi) \quad \text{(前向差分,一阶精度)}$$
$$u'(x) \approx \frac{u(x) - u(x-h)}{h} + \frac{h}{2}u''(\xi) \quad \text{(后向差分,一阶精度)}$$
$$u'(x) \approx \frac{u(x+h) - u(x-h)}{2h} - \frac{h^2}{6}u'''(\xi) \quad \text{(中心差分,二阶精度)}$$

二阶导数的二阶中心差分:

$$u''(x) \approx \frac{u(x+h) - 2u(x) + u(x-h)}{h^2} - \frac{h^2}{12}u^{(4)}(\xi)$$
🧑🎓

「二阶精度」是什么意思?当差分的网格变细时,误差会减少多少?

🎓

$p$ 阶精度的意思是"当格子宽度 $h$ 减半时,误差会变为 $1/2^p$"。一阶精度的话,把网格减半误差也减半;二阶精度的话,把网格减半误差会变成1/4。中心差分是二阶精度,用一阶精度要达到相同精度的话需要4倍的网格点。在三维问题中,那就是 4³ = 64倍的计算量差异!所以高阶精度方案从计算效率的角度来说是非常重要的。

2.2 显式法的稳定性条件 — CFL条件与冯·诺依曼稳定性分析

一维扩散方程 $\partial u/\partial t = \alpha \partial^2 u/\partial x^2$ 用FTCS(前向时间·中心空间)格式离散化:

$$\frac{u_i^{n+1} - u_i^n}{\Delta t} = \alpha \frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\Delta x^2}$$

冯·诺依曼稳定性分析:将 $u_i^n = G^n e^{ikx_i}$ 代入得放大因子 $G$:

$$G = 1 - 4r\sin^2\left(\frac{k\Delta x}{2}\right), \quad r = \frac{\alpha\Delta t}{\Delta x^2}$$

稳定性条件 $|G| \leq 1$ 给出:

$$r = \frac{\alpha\Delta t}{\Delta x^2} \leq \frac{1}{2} \quad \text{(一维扩散的稳定性条件)}$$

平流方程 $\partial u/\partial t + c\partial u/\partial x = 0$ 的CFL(Courant-Friedrichs-Lewy)条件

$$\text{CFL} = \frac{c\Delta t}{\Delta x} \leq 1$$

物理含义:一个时间步内平流距离不能超过网格宽度。

2.3 高阶差分方案对比

方案精度模板(所需网格点)特点
前向差分(一阶)O(h)i, i+1简单·数值扩散大
中心差分(二阶)O(h²)i-1, i, i+1标准·注意无界条件
四阶中心差分O(h⁴)i-2, i-1, i, i+1, i+2高精度·DNS/LES中使用
一阶迎风差分O(h)i-1, i(上游侧)无条件稳定·有数值扩散
三阶迎风差分(QUICK)O(h³)i-2, i-1, i, i+1CFD广泛使用
WENO(五阶)O(h⁵)各方向5点冲击波周围非振荡·高精度

有限元法(FEM)的数学基础

3.1 加权残差法与伽辽金法

椭圆型PDE的例子:$-\nabla \cdot (k\nabla u) = f$ in $\Omega$,边界条件: $u = g$ on $\Gamma_D$。

强形式: $r(u) = -\nabla \cdot (k\nabla u) - f = 0$ 在所有点都成立。

加权残差法: 对于权函数 $v$:

$$\int_\Omega v \cdot r(u) \, d\Omega = 0$$

弱形式(用格林定理分部积分):

$$\int_\Omega k \nabla v \cdot \nabla u \, d\Omega = \int_\Omega v f \, d\Omega + \int_{\Gamma_N} v \, q_n \, d\Gamma$$

伽辽金法: 从同一空间选择近似解和权函数 — $u \approx \sum_j u_j N_j(\mathbf{x})$, $v = N_i(\mathbf{x})$:

$$\sum_j \left[\int_\Omega k \nabla N_i \cdot \nabla N_j \, d\Omega\right] u_j = \int_\Omega N_i f \, d\Omega + \int_{\Gamma_N} N_i q_n \, d\Gamma$$

这以矩阵形式表示为 $\mathbf{K}\mathbf{u} = \mathbf{f}$。

3.2 形状函数的种类

代表性的形状函数:

一维拉格朗日形状函数(2节点线性单元,$\xi \in [-1,1]$):

$$N_1(\xi) = \frac{1-\xi}{2}, \qquad N_2(\xi) = \frac{1+\xi}{2}$$

3节点二阶单元($\xi \in [-1,1]$):

$$N_1(\xi) = \frac{\xi(\xi-1)}{2}, \quad N_2(\xi) = 1-\xi^2, \quad N_3(\xi) = \frac{\xi(\xi+1)}{2}$$
🧑🎓

二阶单元(Quadratic element)比一阶单元精度好我理解,但为什么有些问题就是用不了二阶单元呢?

🎓

二阶单元在单元大变形并被压扁的问题上很困难。在显式法碰撞分析中,当网格发生剧烈变形时,中间节点会飞到单元外面,雅可比矩阵会变得奇异(行列式≒0),计算就停止了。还有体积锁定现象 — 在不可压缩性很强的材料(橡胶)或塑性上,二阶单元的完全积分会"过度约束体积不变"。对此需要低减积分或非协调模式的处理。

3.3 等参数单元与数值积分

物理坐标 $\mathbf{x}$ 与参考坐标 $\boldsymbol{\xi}$ 的变换(等参数变换):

$$\mathbf{x}(\boldsymbol{\xi}) = \sum_i N_i(\boldsymbol{\xi}) \mathbf{x}_i$$

积分的变换:

$$\int_{\Omega_e} f(\mathbf{x}) \, d\mathbf{x} = \int_{[-1,1]^d} f(\mathbf{x}(\boldsymbol{\xi})) |\mathbf{J}(\boldsymbol{\xi})| \, d\boldsymbol{\xi}$$

高斯-勒让德求积($n_g$ 点):

$$\int_{-1}^{1} g(\xi) \, d\xi \approx \sum_{i=1}^{n_g} w_i g(\xi_i)$$

可精确积分至 $2n_g - 1$ 次多项式($n_g$ 点高斯积分的精度)。

积分点数 $n_g$高斯点 $\xi_i$权重 $w_i$多项式精度
1021阶
2±1/√3 ≈ ±0.57741, 13阶
30, ±√(3/5) ≈ ±0.77468/9, 5/95阶
4±0.3399, ±0.86110.6521, 0.34797阶

有限体积法(FVM)

4.1 守恒律的积分形式

一般性保存方程(平流-扩散)的积分形式(应用于每个控制体积CV):

$$\frac{d}{dt}\int_\text{CV} \phi \, dV + \oint_\text{CS} \phi \mathbf{v} \cdot d\mathbf{S} = \oint_\text{CS} \Gamma \nabla\phi \cdot d\mathbf{S} + \int_\text{CV} S_\phi \, dV$$

$\phi$:通用变量(密度·动量·能量等),$\Gamma$:扩散系数,$S_\phi$:源项。

物理意义:「CV中积累的量 = 流入平流通量 - 流出平流通量 + 扩散通量 + 体积源」。

4.2 单元中心 vs 单元顶点

配置特点使用求解器
单元中心(Cell-centred)变量定义在单元中心。边界通量用插值计算OpenFOAM, Ansys Fluent
单元顶点(Cell-vertex)变量定义在节点。CV构造在节点周围某些CFD求解器、结构流体混合

4.3 界面通量的插值方案

界面 $f$ 处标量值 $\phi_f$ 的计算方案比较:

$$\phi_f^\text{CD} = \frac{\phi_P + \phi_E}{2} \quad \text{(中心差分,二阶精度,非有界)}$$
$$\phi_f^\text{UD} = \begin{cases} \phi_P & (F_f > 0) \\ \phi_E & (F_f < 0) \end{cases} \quad \text{(一阶迎风差分,无条件有界,数值扩散大)}$$

$F_f = \mathbf{v}_f \cdot \mathbf{S}_f$ 是界面通量。

高分辨率方案(TVD: Total Variation Diminishing)用通量限制器 $\psi(r)$ 兼顾精度与有界性:

$$\phi_f^\text{TVD} = \phi_f^\text{UD} + \psi(r)\left(\phi_f^\text{CD} - \phi_f^\text{UD}\right)$$
限制器名称$\psi(r)$ 的式子特点
minmod$\max(0, \min(1,r))$最保守。适于冲击波周围
van Leer$(r + |r|)/(1+|r|)$光滑流中高精度
superbee$\max(0,\min(2r,1),\min(r,2))$最积极。注意过压缩
limitedLinearOpenFOAM默认光滑流中保持二阶精度
🧑🎓

OpenFOAM的fvSchemes中的「divSchemes」设定成「Gauss linearUpwind」或「Gauss limitedLinear」这种。实务中该选哪个呢?

🎓

最初用「Gauss limitedLinear 1」或「Gauss linearUpwind grad(U)」比较平衡。纯粹的中心差分「Gauss linear」精度高,但在湍流分析中容易出现数值振荡。初始解不收敛时,临时用「Gauss upwind」(一阶迎风)制作粗糙解,之后再切换到高阶方案,这种"两段式方法"是实务的定式。对于高速压缩性流动(有冲击波的情况)则需要weno等高阶有界方案。

线性方程组求解器

FEM/FVM最终需要求解大规模稀疏矩阵方程 $\mathbf{A}\mathbf{x} = \mathbf{b}$。根据问题规模和性质选择求解器。

5.1 直接法

LU分解: $\mathbf{A} = \mathbf{L}\mathbf{U}$($\mathbf{L}$:下三角,$\mathbf{U}$:上三角)。通过前代和回代求解。

Cholesky分解(对称正定矩阵用): $\mathbf{A} = \mathbf{L}\mathbf{L}^T$。计算量约为LU分解的一半。结构分析静力学中常用。

直接法的复杂度(带状矩阵,半带宽 $b$):

5.2 迭代法 — 共轭梯度法(CG法)

对称正定矩阵 $\mathbf{A}$ 的CG法算法:

初值: x₀(通常 x₀ = 0)
残差: r₀ = b - Ax₀
搜索方向: p₀ = r₀

for k = 0, 1, 2, ...
  α_k = (r_k^T r_k) / (p_k^T A p_k)   // 步长
  x_{k+1} = x_k + α_k p_k              // 解的更新
  r_{k+1} = r_k - α_k A p_k            // 残差的更新
  β_k = (r_{k+1}^T r_{k+1}) / (r_k^T r_k)
  p_{k+1} = r_{k+1} + β_k p_k          // 搜索方向更新

收敛条件:$\|r_k\| / \|b\| < \varepsilon$(通常 $\varepsilon = 10^{-6}$ 〜 $10^{-8}$)

5.3 预处理(Preconditioning)

条件数 $\kappa(\mathbf{A})$ 较大(病态)的矩阵收敛缓慢。用预处理矩阵 $\mathbf{M} \approx \mathbf{A}$ 求解等价系统 $\mathbf{M}^{-1}\mathbf{A}\mathbf{x} = \mathbf{M}^{-1}\mathbf{b}$。

预处理方法计算成本收敛改善用途
对角缩放(Jacobi)简单问题·初期测试
不完全LU(ILU(0))中〜大通用(OpenFOAM默认)
ILU(k)(fill-in层级k)中〜高更难问题
代数多重网格(AMG)高(初期)非常大大规模结构·流体分析
几何多重网格(GMG)高(设计成本)最大结构化网格CFD
🧑🎓

Ansys分析很慢时,求解器设定里有各种选项很烦恼。PCG、SPARSE、JCG什么的...该选哪个?

🎓

Ansys Mechanical的话,静力分析首选SPARSE(直接法稀疏求解器)。问题规模较小(不超过数十万自由度)的话一般没问题。PCG是预处理共轭梯度法,大规模问题·节省内存时适用。JCG在非均质问题或非线性分析时,SPARSE内存不足的代选方案。大规模并行的话用Distributed SPARSE或基于AMG的PCG。实务的做法是先试试,再改。

5.4 稀疏矩阵的存储格式

高效存储大规模稀疏矩阵的数据结构:

$n$ 节点、$nnz$ 非零元素的CSR矩阵内存:$3 \times nnz + (n+1)$ 整数 + $nnz$ 浮点数。

特征值求解器

6.1 幂法与反迭代法

幂法(Power method): 求最大特征值的最简单方法:

$$\mathbf{v}^{(k+1)} = \frac{\mathbf{A}\mathbf{v}^{(k)}}{\|\mathbf{A}\mathbf{v}^{(k)}\|}$$

收敛速率:$|\lambda_2/\lambda_1|$(第二大特征值与最大特征值之比)。特征值密集时收敛非常慢。

反迭代法(Inverse iteration): 用位移 $\mu$ 的反迭代求与指定值 $\lambda \approx \mu$ 最接近的模式:

$$\mathbf{v}^{(k+1)} = \frac{(\mathbf{A} - \mu\mathbf{I})^{-1}\mathbf{v}^{(k)}}{\|(\mathbf{A} - \mu\mathbf{I})^{-1}\mathbf{v}^{(k)}\|}$$

6.2 Lanczos法

大规模对称特征值问题中应用最广的方法。对Krylov子空间 $\mathcal{K}_m(\mathbf{A}, \mathbf{v}_1) = \text{span}\{\mathbf{v}_1, \mathbf{A}\mathbf{v}_1, \ldots, \mathbf{A}^{m-1}\mathbf{v}_1\}$ 进行三对角化:

$$\mathbf{A}\mathbf{V}_m = \mathbf{V}_m \mathbf{T}_m + \beta_{m+1}\mathbf{v}_{m+1}\mathbf{e}_m^T$$

$\mathbf{T}_m$ 是 $m \times m$ 三对角矩阵,其特征值(Ritz值)是 $\mathbf{A}$ 特征值的良好近似。即使 $n = 10^6$ 自由度的系统,$m = 100 \sim 300$ 个Lanczos向量也足以达到足够精度。

6.3 子空间反迭代法与ARPACK

实用的大规模特征值求解器多数基于ARPACK(Arnoldi PACKage),实现了对非对称矩阵也适用的隐式重启Arnoldi法(IRAM)。

基于ARPACK的特征值求解器例子:

数值精度与误差管理

7.1 误差的种类

误差类型定义原因削减方法
舍入误差(Round-off error)浮点运算的精度限界IEEE 754双精度: $\varepsilon_\text{mach} \approx 2.2 \times 10^{-16}$使用双精度、选择数值稳定算法
截断误差(Truncation error)差分·有限元近似引入的误差泰勒展开的截断网格细化·高阶单元
离散化误差离散近似不满足连续方程的误差网格宽度·时间步的有限性网格收敛性验证
建模误差物理模型的近似(湍流模型等)现实复杂性的简化采用更高级模型·实验验证

7.2 Richardson外推与GCI

网格收敛研究中用3个网格解估计真解的Richardson外推法(Richardson Extrapolation)

$$f_h = f_0 + C h^p + O(h^{p+1})$$

从两个网格($h_1 < h_2$,细化比 $r = h_2/h_1$)得到:

$$f_0 \approx f_1 + \frac{f_1 - f_2}{r^p - 1}$$

网格收敛指数(GCI: Grid Convergence Index): Roache(1994)提出的标准误差评价指标:

$$\text{GCI}_{12} = \frac{F_s |e_{12}|}{r^p - 1} \times 100\%$$

$e_{12} = (f_2 - f_1)/f_1$(相对误差),$F_s = 1.25$(安全系数,Roache推荐)。

GCI < 5%时"收敛充分"被普遍认可。ASME V&V 20-2009标准也采纳了这一指标。

🧑🎓

听说有论文评审"因没计算GCI被拒"。实务中也需要GCI吗?

🎓

学术论文基本已必须。Journal of Fluids Engineering和International Journal for Numerical Methods in Engineering等都在作者指南中要求GCI。产业CAE中,汽车·航空认证分析(把仿真作为证据时)也要按ASME V&V和NASA GCI指南。"做两个网格变化5%以下就OK"这种定性法太笼统。GCI虽然多花2小时工作,但证明分析可信性不可或缺。

7.3 数值陷阱与对策

问题原因对策
有效数字丧失差不多大小的数相减(上位数字抵消)改变运算顺序、引入辅助变量
信息丧失大数与小数的和(舍入误差累积)Kahan补偿求和算法
数值振荡(振铃)高阶方案通过急剧变化(不连续)限制器·迎风化·WENO
零主元(直接法)矩阵奇异或病态主元选择·预处理·检查边界条件
沙漏模式(Hourglass)低减积分单元的零能模式沙漏控制(稳定化)

最优求解方法选择指南

8.1 问题类型别求解器选择表

问题类型典型方法代表求解器/库
线性静分析(小规模 <50万DOF)直接法(Cholesky/LU)PARDISO, MUMPS, SuperLU
线性静分析(大规模 >50万DOF)PCG + AMGBoomerAMG, AMGCL, ML/MueLu
特征值分析(少数模式)Lanczos/子空间反迭ARPACK, SLEPc, FEAST
特征值分析(多数模式)分布式+LanczosScaLAPACK, SLEPc
非线性静分析NR + 直接法(内部)求解器内置(Abaqus, Marc)
非定常显式法中心差分+集中质量LS-DYNA, Abaqus/Explicit
CFD 不可压缩SIMPLE/PISO + PCG/GAMGOpenFOAM, Fluent
CFD 可压缩高阶FVM + Runge-Kutta + AMGOpenFOAM rhoCentralFoam, SU2

8.2 并行计算可扩展性

阿姆达尔定律: 可并行化比例 $p$ 时,$N$ 处理器的理论最大加速比:

$$S = \frac{1}{(1-p) + p/N}$$

$p = 0.95$(95%可并行化)时,理论极限 $N \to \infty$ 仅 $1/(1-0.95) = 20$ 倍。

大规模FEM/FVM并行计算的注意事项:

相关交互式工具

动手验证理论

本文评价
感谢回答!
有帮助
希望更详细
报告错误
有帮助
0
希望更详细
0
报告错误
0
由 NovaSolver 贡献者撰写
匿名工程师 & AI — 查看简介