2025–2026 学年第二学期
北京理工大学 空天科学与技术学院
任杰
John D. Anderson Computational Fluid
Dynamics: The Basics with Applications
McGraw-Hill, 1995
任玉新 陈海昕
计算流体力学基础 清华大学出版社,2006
张德良
计算流体力学教程 高等教育出版社,2010
蔡庆东
计算流体动力学
北京大学本科生研究生专业基础课讲义,2018
真正理解 CFD 的最好方式,是自己实现数值算法并运行计算 - John D. Anderson
Lax–Wendroff 方法是一种显式有限差分方法。考虑二维非定常无粘流,非守恒形式方程为:
\[ \frac{\partial \rho}{\partial t}= -\left(\rho \frac{\partial u}{\partial x}+ u \frac{\partial \rho}{\partial x}+ \rho \frac{\partial v}{\partial y}+ v \frac{\partial \rho}{\partial y}\right) \]
\[ \frac{\partial u}{\partial t}= -\left(u \frac{\partial u}{\partial x}+ v \frac{\partial u}{\partial y}+ \frac{1}{\rho}\frac{\partial p}{\partial x}\right) \]
\[ \frac{\partial v}{\partial t}= -\left(u \frac{\partial v}{\partial x}+ v \frac{\partial v}{\partial y}+ \frac{1}{\rho}\frac{\partial p}{\partial y}\right) \]
\[ \frac{\partial e}{\partial t}= -\left(u \frac{\partial e}{\partial x}+ v \frac{\partial e}{\partial y}+ \frac{p}{\rho}\frac{\partial u}{\partial x}+ \frac{p}{\rho}\frac{\partial v}{\partial y}\right) \]
Lax–Wendroff 方法基于时间方向的泰勒展开。以密度为例:
\[ \rho_{i,j}^{t+\Delta t}=\rho_{i,j}^t+ \left(\frac{\partial \rho}{\partial t}\right)_{i,j}^t \Delta t+ \frac{1}{2}\left(\frac{\partial^2 \rho}{\partial t^2}\right)_{i,j}^t(\Delta t)^2+ \cdots \]
类似地:
\[ u_{i,j}^{t+\Delta t}=u_{i,j}^t+ \left(\frac{\partial u}{\partial t}\right)_{i,j}^t \Delta t+ \frac{1}{2}\left(\frac{\partial^2 u}{\partial t^2}\right)_{i,j}^t(\Delta t)^2 \]
\[ v_{i,j}^{t+\Delta t}=v_{i,j}^t+ \left(\frac{\partial v}{\partial t}\right)_{i,j}^t \Delta t+ \frac{1}{2}\left(\frac{\partial^2 v}{\partial t^2}\right)_{i,j}^t(\Delta t)^2 \]
\[ e_{i,j}^{t+\Delta t}=e_{i,j}^t+ \left(\frac{\partial e}{\partial t}\right)_{i,j}^t \Delta t+ \frac{1}{2}\left(\frac{\partial^2 e}{\partial t^2}\right)_{i,j}^t(\Delta t)^2 \]
由连续方程可得:
\[ \left(\frac{\partial \rho}{\partial t}\right)_{i,j}=-\left[\rho_{i,j}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}+ u_{i,j}\frac{\rho_{i+1,j}-\rho_{i-1,j}}{2\Delta x}+ \rho_{i,j}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}+ v_{i,j}\frac{\rho_{i,j+1}-\rho_{i,j-1}}{2\Delta y}\right] \]
对连续方程再次对时间求导:
\[ \frac{\partial^2 \rho}{\partial t^2}=-\rho \frac{\partial^2 u}{\partial x \partial t}- \frac{\partial u}{\partial t}\frac{\partial \rho}{\partial x}- u \frac{\partial^2 \rho}{\partial x \partial t}- \frac{\partial \rho}{\partial t}\frac{\partial u}{\partial x}+ \rho \frac{\partial^2 v}{\partial y \partial t}+ \frac{\partial v}{\partial t}\frac{\partial \rho}{\partial y}+ v \frac{\partial^2 \rho}{\partial y \partial t} \]
这些混合导数通过对动量方程进一步求导得到。例如右端第一项
\[ \frac{\partial^2 u}{\partial x \partial t}=- u \frac{\partial^2 u}{\partial x^2}+ \left(\frac{\partial u}{\partial x}\right)^2+ v \frac{\partial^2 u}{\partial x \partial y}+ \frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+ \frac{1}{\rho} \frac{\partial^2 p}{\partial x^2}- \frac{1}{\rho^2} \frac{\partial p}{\partial x}\frac{\partial \rho}{\partial x} \]
右端第一项
\[ \frac{\partial^2 u}{\partial x \partial t}=- u \frac{\partial^2 u}{\partial x^2}+ \left(\frac{\partial u}{\partial x}\right)^2+ v \frac{\partial^2 u}{\partial x \partial y}+ \frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+ \frac{1}{\rho} \frac{\partial^2 p}{\partial x^2}- \frac{1}{\rho^2} \frac{\partial p}{\partial x}\frac{\partial \rho}{\partial x} \]
所有项都在时间 \(t\) 处采用二阶中心差分格式表示,即:
\[ \begin{aligned} \left(\frac{\partial^2 u}{\partial x \partial t}\right)^t_{i,j}=& - u^t_{i,j} \frac{u^t_{i+1,j} - 2u^t_{i,j} + u^t_{i-1,j}}{(\Delta x)^2}+ \left(\frac{u^t_{i+1,j} - u^t_{i-1,j}}{2\Delta x}\right)^2 \\&+ v^t_{i,j}\frac{u^t_{i+1,j+1} + u^t_{i-1,j-1} - u^t_{i-1,j+1} - u^t_{i+1,j-1}}{4(\Delta x)(\Delta y)}+ \frac{u^t_{i,j+1} - u^t_{i,j-1}}{2\Delta y}\frac{v^t_{i+1,j} - v^t_{i-1,j}}{2\Delta x} \\ &+ \frac{1}{\rho^t_{i,j}}\frac{p^t_{i+1,j} - 2p^t_{i,j} + p^t_{i-1,j}}{(\Delta x)^2}- \frac{1}{(\rho^t_{i,j})^2}\frac{p^t_{i+1,j} - p^t_{i-1,j}}{2\Delta x}\frac{\rho^t_{i+1,j} - \rho^t_{i-1,j}}{2\Delta x} \end{aligned} \]
右端的所有项都来自于 \(t\) 时刻已知的流场,因此可以计算出左端的数值
通过连续方程关于 \(x\) 求导,并将右端所有导数用二阶中心差分替代即可得到:
\[ \frac{\partial^2 \rho}{\partial x \partial t} \]
进一步,连续方程关于 \(y\)
求导,可得到
\[
\frac{\partial^2 \rho}{\partial y \partial t}
\]
法向动量方程关于 \(y\) 求导,可得到 \[ \frac{\partial^2 v}{\partial y \partial t} \]
所有这些导数同样用二阶中心差分表示。
\[ \frac{\partial^2 \rho}{\partial t^2}=-\rho \frac{\partial^2 u}{\partial x \partial t}- \frac{\partial u}{\partial t}\frac{\partial \rho}{\partial x}- u \frac{\partial^2 \rho}{\partial x \partial t}- \frac{\partial \rho}{\partial t}\frac{\partial u}{\partial x}+ \rho \frac{\partial^2 v}{\partial y \partial t}+ \frac{\partial v}{\partial t}\frac{\partial \rho}{\partial y}+ v \frac{\partial^2 \rho}{\partial y \partial t} \]
此时,上式右端唯一剩下的是一阶空间导数:
\[ \frac{\partial u}{\partial x}, \quad \frac{\partial v}{\partial y}, \quad \frac{\partial \rho}{\partial x}, \quad \frac{\partial \rho}{\partial y} \]
这些同样用二阶中心差分表示,例如:
\[ \left(\frac{\partial u}{\partial x}\right)^t_{i,j}=\frac{u_{i+1,j} - u_{i-1,j}}{2\Delta x} \]
此外,还需要一阶时间导数:
\[ \frac{\partial \rho}{\partial t}, \quad \frac{\partial u}{\partial t}, \quad \frac{\partial v}{\partial t} \]
其中:
通过上述步骤,我们最终得到:
\[ \frac{\partial^2 \rho}{\partial t^2} \]
因此可以通过如下展开得到下一时刻的密度
\[ \rho_{i,j}^{t+\Delta t}=\rho_{i,j}^t+ \left(\frac{\partial \rho}{\partial t}\right)_{i,j}^t \Delta t+ \frac{1}{2}\left(\frac{\partial^2 \rho}{\partial t^2}\right)_{i,j}^t(\Delta t)^2+ \cdots \]
👉 从而实现:已知时刻 ( t ) → 显式推进到 ( t + t )
MacCormack 方法是 Lax–Wendroff 方法的一种变体,但在实际应用中要简单得多。与 Lax–Wendroff 方法类似,MacCormack 方法也是一种显式有限差分方法,在时间和空间上均具有二阶精度。
该方法最早于1969年提出,在随后15年中成为求解流体流动问题最常用的显式差分方法。如今,MacCormack 方法在很大程度上已被更复杂的方法所取代。然而,它具有很强的“教学友好性”,是最容易理解和编程实现的方法之一。此外,其计算结果在许多流动问题中已经足够准确。
时间推进求解欧拉方程,假设在时刻 \(t\),所有网格点上的流场变量已知,目标是计算时刻 \(t + \Delta t\) 的流场变量。以密度为例:
\[ \rho_{i,j}^{t+\Delta t}=\rho_{i,j}^t+\left(\frac{\partial \rho}{\partial t}\right)_{av} \Delta t \]
其中:\(\left(\frac{\partial \rho}{\partial t}\right)_{av}\) 表示时间区间 \([t, t+\Delta t]\) 内的平均时间导数。
👉 本质优势:避免计算二阶时间导数
类似地:
\[ u_{i,j}^{t+\Delta t}=u_{i,j}^t+\left(\frac{\partial u}{\partial t}\right)_{av} \Delta t \]
\[ v_{i,j}^{t+\Delta t}=v_{i,j}^t+\left(\frac{\partial v}{\partial t}\right)_{av} \Delta t \]
\[ e_{i,j}^{t+\Delta t}=e_{i,j}^t+\left(\frac{\partial e}{\partial t}\right)_{av} \Delta t \]
在连续方程中,将空间导数用前向差分(forward difference)表示:
\[ \left(\frac{\partial \rho}{\partial t}\right)^t_{i,j}=-\left[\rho^t_{i,j}\frac{u^t_{i+1,j}-u^t_{i,j}}{\Delta x}+u^t_{i,j}\frac{\rho^t_{i+1,j}-\rho^t_{i,j}}{\Delta x}\right. \]
\[ \left.+\rho^t_{i,j}\frac{v^t_{i,j+1}-v^t_{i,j}}{\Delta y}+v^t_{i,j}\frac{\rho^t_{i,j+1}-\rho^t_{i,j}}{\Delta y}\right] \]
然后利用泰勒展开得到预测值:
\[ \bar{\rho}_{i,j}^{t+\Delta t}=\rho^t_{i,j}+\left(\frac{\partial \rho}{\partial t}\right)^t_{i,j}\Delta t \]
👉 注意:
类似地:
\[ \bar{u}_{i,j}^{t+\Delta t}=u^t_{i,j}+\left(\frac{\partial u}{\partial t}\right)^t_{i,j}\Delta t \]
\[ \bar{v}_{i,j}^{t+\Delta t}=v^t_{i,j}+\left(\frac{\partial v}{\partial t}\right)^t_{i,j}\Delta t \]
\[ \bar{e}_{i,j}^{t+\Delta t}=e^t_{i,j}+\left(\frac{\partial e}{\partial t}\right)^t_{i,j}\Delta t \]
将预测值代入连续方程,并将空间导数改为后向差分(backward difference):
\[ \left(\frac{\partial \rho}{\partial t}\right)^{t+\Delta t}_{i,j}=-\left[\bar{\rho}_{i,j}^{t+\Delta t}\frac{\bar{u}_{i,j}^{t+\Delta t}-\bar{u}_{i-1,j}^{t+\Delta t}}{\Delta x}+\bar{u}_{i,j}^{t+\Delta t}\frac{\bar{\rho}_{i,j}^{t+\Delta t}-\bar{\rho}_{i-1,j}^{t+\Delta t}}{\Delta x}\right. \]
\[ \left.+\bar{\rho}_{i,j}^{t+\Delta t}\frac{\bar{v}_{i,j}^{t+\Delta t}-\bar{v}_{i,j-1}^{t+\Delta t}}{\Delta y}+\bar{v}_{i,j}^{t+\Delta t}\frac{\bar{\rho}_{i,j}^{t+\Delta t}-\bar{\rho}_{i,j-1}^{t+\Delta t}}{\Delta y}\right] \]
\[ \left(\frac{\partial \rho}{\partial t}\right)_{av}=\frac{1}{2}\left[\left(\frac{\partial \rho}{\partial t}\right)^t_{i,j}+\left(\frac{\partial \rho}{\partial t}\right)^{t+\Delta t}_{i,j}\right] \]
\[ \rho_{i,j}^{t+\Delta t}=\rho_{i,j}^t+\left(\frac{\partial \rho}{\partial t}\right)_{av} \Delta t \]
MacCormack 方法的关键特点:
✔ 实现简单 ✔ 精度高(与 Lax–Wendroff 相同) ✔ 计算量更低 ✔ 易于编程
👉 前向预测 + 后向修正 + 平均
本质是一种:对时间导数进行对称近似的策略
👉 MacCormack 方法 = “不用二阶导数的 Lax–Wendroff”
在前面的讨论中,我们通过假设无粘流、采用欧拉方程的非守恒形式,并考虑时间推进过程,来介绍 Lax–Wendroff(第6.2节)和 MacCormack(第6.3节)方法。事实上,这些假设并非必要;上述方法同样适用于:
下面分别加以说明。
黏性流由 Navier–Stokes 方程控制。在稳态情况下,这些方程在数学上表现为部分椭圆型,因此 Lax–Wendroff 和 MacCormack 方法不适用于椭圆型方程。
然而,对于非定常 Navier–Stokes 方程,其性质为抛物型与椭圆型的混合,因此上述方法是适用的。事实上,MacCormack 方法已被广泛用于通过时间推进求解非定常 Navier–Stokes 方程。
其基本思想相同:
唯一的区别在于:Navier–Stokes 方程中的空间导数项比欧拉方程更多。
注:对流项可以采用上述差分方式,而黏性项通常建议在预测和校正步中均采用中心差分。
为简单起见,仍以欧拉方程为例。适用于CFD计算的守恒形式可写为:
\[ \frac{\partial U}{\partial t}=- \frac{\partial F}{\partial x}- \frac{\partial G}{\partial y}+ J \]
其中:
这些量可以通过 Lax–Wendroff 或 MacCormack 方法进行时间推进计算。
⚠️ 注意:由于守恒变量是通量变量,在每个时间步结束后,需要将其转换为原始变量(primitive variables)。
为了说明空间推进思想,考虑图6.3中的二维流动。假设:
守恒形式下,方程可写为:
\[ \frac{\partial F}{\partial x}=J - \frac{\partial G}{\partial y} \]
假设在某一条垂直线(初始数据线)上,流场变量已知:
\[ x = x_0 \]
则可以沿 \(x\) 方向逐步推进计算。
👉 类比:
\[ F_j^{i+1}=F_j^i+\left(\frac{\partial F}{\partial x}\right)_{av} \Delta x \]
将式 (6.24) 中的 \(y\) 导数用前向差分表示:
\[ \left(\frac{\partial F}{\partial x}\right)^i_j=J^i_j-\frac{G^i_{j+1} - G^i_j}{\Delta y} \]
然后得到预测值:
\[ \bar{F}^{i+1}_j=F^i_j+\left(\frac{\partial F}{\partial x}\right)^i_j \Delta x \]
利用预测值,采用后向差分:
\[ \left(\frac{\partial F}{\partial x}\right)^{i+1}_j=J^{i+1}_j-\frac{G^{i+1}_j - G^{i+1}_{j-1}}{\Delta y} \]
\[ \left(\frac{\partial F}{\partial x}\right)_{av}=\frac{1}{2}\left[\left(\frac{\partial F}{\partial x}\right)^i_j+\left(\frac{\partial F}{\partial x}\right)^{i+1}_j\right] \]
\[ F_j^{i+1}=F_j^i+\left(\frac{\partial F}{\partial x}\right)_{av} \Delta x \]
空间推进本质上是:👉 把空间方向当作“时间”来推进
空间推进 vs 时间推进:
👉 空间推进 = “沿流向做时间推进”
松弛方法是一种有限差分方法,特别适用于求解椭圆型偏微分方程。低速亚声速无粘流通常由椭圆型方程控制(见第3.4.3节),因此松弛方法常用于此类问题的求解。
松弛方法可以是显式或隐式形式。本节介绍一种显式松弛方法,也称为:逐点迭代方法(point-iterative method)
考虑一个二维、不可压、无粘、无旋流动,其控制方程为:
速度势函数: \[ \mathbf{V} = \nabla \Phi \]
控制方程(Laplace方程): \[ \frac{\partial^2 \Phi}{\partial x^2} + \frac{\partial^2 \Phi}{\partial y^2} = 0 \]
采用二阶中心差分:
\[ \frac{\Phi_{i+1,j} - 2\Phi_{i,j} + \Phi_{i-1,j}}{(\Delta x)^2}+\frac{\Phi_{i,j+1} - 2\Phi_{i,j} + \Phi_{i,j-1}}{(\Delta y)^2} = 0 \]
该方程包含5个未知量:
\(\Phi_{i,j}\)
\(\Phi_{i+1,j}, \Phi_{i-1,j}\)
\(\Phi_{i,j+1}, \Phi_{i,j-1}\)
边界点:\(\Phi_1 \sim \Phi_{20}\) → 已知
内部点:15个内部点未知
👉 得到 15个线性方程 + 15个未知数

理论上可以用:
实际 CFD 中:
因此采用:
在第 \(n\) 次迭代中:
\[ \Phi_{i,j}^{n+1}=\frac{(\Delta x)^2 (\Delta y)^2}{2(\Delta y)^2 + 2(\Delta x)^2}\left[\frac{\Phi_{i+1,j}^n + \Phi_{i-1,j}^n}{(\Delta x)^2}+\frac{\Phi_{i,j+1}^n + \Phi_{i,j-1}^n}{(\Delta y)^2}\right] \]
步骤:
改进点:👉 一旦计算出新值,立即使用
例如:
\[ \Phi_{21}^{n+1}=\frac{(\Delta x)^2 (\Delta y)^2}{2(\Delta y)^2 + 2(\Delta x)^2}\left[\frac{\Phi_{22}^n + \Phi_{20}}{(\Delta x)^2}+\frac{\Phi_{24}^n + \Phi_{2}}{(\Delta y)^2}\right] \]
\[ \Phi_{22}^{n+1}=\frac{(\Delta x)^2 (\Delta y)^2}{2(\Delta y)^2 + 2(\Delta x)^2}\left[\frac{\Phi_{23}^n + \Phi_{21}^{n+1}}{(\Delta x)^2}+\frac{\Phi_{25}^n + \Phi_{3}}{(\Delta y)^2}\right] \]
👉 注意:\(\Phi_{21}^{n+1}\) 已经被立即使用

通常采用:
也可以:
当满足:
\[ |\Phi_{i,j}^{n+1} - \Phi_{i,j}^{n}| < \epsilon \]
👉 认为收敛
定义中间值:
\[ \tilde{\Phi}_{i,j}^{n+1}=\frac{(\Delta x)^2 (\Delta y)^2}{2(\Delta y)^2 + 2(\Delta x)^2}\left[\frac{\Phi_{i+1,j}^n + \Phi_{i-1,j}^{n+1}}{(\Delta x)^2}+\frac{\Phi_{i,j+1}^n + \Phi_{i,j-1}^{n+1}}{(\Delta y)^2}\right] \]
然后:
\[ \Phi_{i,j}^{n+1}=\Phi_{i,j}^{n}+\omega \left(\tilde{\Phi}_{i,j}^{n+1} - \Phi_{i,j}^{n}\right) \]
松弛因子 \(\omega\)
松弛法本质是: 局部更新 + 全局收敛
Gauss-Seidel 比 Jacobi 更快
SOR 可大幅加速:👉 收敛步数可减少一个数量级(甚至30倍)
👉 本质问题:
👉 解决方案:
现实往往并不像表面看起来那样简单——CFD 亦是如此。我们已经讨论了多种用于求解控制方程的数值方法。我们一直采用这样一种观点:
数值解是带有截断误差和舍入误差的近似解
但实际上,还有另一种理解方式。
考虑一维波动方程:
\[ \frac{\partial u}{\partial t} + a \frac{\partial u}{\partial x} = 0 \]
其中 \(a>0\)。时间:一阶前向差分;空间:一阶后向差分。得到差分方程:
\[ \frac{u_i^{t+\Delta t} - u_i^t}{\Delta t}+a \frac{u_i^t - u_{i-1}^t}{\Delta x}= 0 \]
对差分项进行展开:
\[ u_i^{t+\Delta t}=u_i^t+\left(\frac{\partial u}{\partial t}\right)_i \Delta t+\left(\frac{\partial^2 u}{\partial t^2}\right)_i \frac{(\Delta t)^2}{2}+\left(\frac{\partial^3 u}{\partial t^3}\right)_i \frac{(\Delta t)^3}{6}+ \cdots \]
\[ u_{i-1}^t=u_i^t-\left(\frac{\partial u}{\partial x}\right)_i \Delta x+\left(\frac{\partial^2 u}{\partial x^2}\right)_i \frac{(\Delta x)^2}{2}-\left(\frac{\partial^3 u}{\partial x^3}\right)_i \frac{(\Delta x)^3}{6}+ \cdots \]
代入差分方程, \[ \frac{u_i^{t+\Delta t} - u_i^t}{\Delta t}+a \frac{u_i^t - u_{i-1}^t}{\Delta x}= 0 \]
得到:
\[ \frac{\partial u}{\partial t}+a \frac{\partial u}{\partial x}=-\frac{\partial^2 u}{\partial t^2}\frac{\Delta t}{2}-\frac{\partial^3 u}{\partial t^3}\frac{(\Delta t)^2}{6}+a\frac{\partial^2 u}{\partial x^2}\frac{\Delta x}{2}-a\frac{\partial^3 u}{\partial x^3}\frac{(\Delta x)^2}{6}+\cdots \]
\[ \frac{\partial u}{\partial t}+a \frac{\partial u}{\partial x}=-\frac{\partial^2 u}{\partial t^2}\frac{\Delta t}{2}-\frac{\partial^3 u}{\partial t^3}\frac{(\Delta t)^2}{6}+a\frac{\partial^2 u}{\partial x^2}\frac{\Delta x}{2}-a\frac{\partial^3 u}{\partial x^3}\frac{(\Delta x)^2}{6}+\cdots \]
通过进一步推导(用时间导数替换为空间导数)最终得到:
\[ \frac{\partial u}{\partial t}+a \frac{\partial u}{\partial x}=\frac{a \Delta x}{2}(1-\nu)\frac{\partial^2 u}{\partial x^2}+\frac{a(\Delta x)^2}{6}(3\nu - 2\nu^2 -1)\frac{\partial^3 u}{\partial x^3}+ \cdots \]
其中:
\[ \nu = \frac{a \Delta t}{\Delta x} \]
重要结论:差分方程的“精确解”,实际上是某个不同偏微分方程(修正方程)的解
即:
观察
\[ \frac{\partial u}{\partial t}+a \frac{\partial u}{\partial x}=\frac{a \Delta x}{2}(1-\nu)\frac{\partial^2 u}{\partial x^2}+\frac{a(\Delta x)^2}{6}(3\nu - 2\nu^2 -1)\frac{\partial^3 u}{\partial x^3}+ \cdots \]
其中
\[ \frac{a \Delta x}{2}(1-\nu)\frac{\partial^2 u}{\partial x^2} \]
类似粘性项(\(\mu \partial^2 u/\partial x^2\))👉 结论:数值方法会引入“类粘性效应”
👉 类似真实粘性

来源:
\[ \frac{\partial^3 u}{\partial x^3} \]
👉 不同频率传播速度不同

| 类型 | 来源 | 表现 |
|---|---|---|
| 数值耗散 | 偶数阶导数 | 平滑、扩散 |
| 数值色散 | 奇数阶导数 | 振荡 |
在CFD中:数值耗散 ≈ 人工粘性
定义:人为加入项
\[ S_{i,j}=C_x \frac{|p_{i+1,j}-2p_{i,j}+p_{i-1,j}|}{p_{i+1,j}+2p_{i,j}+p_{i-1,j}}(U_{i+1,j}-2U_{i,j}+U_{i-1,j})+ \cdots \]
优点:
缺点:
随着人工粘性增大:
👉 CFD的核心矛盾:稳定性 vs 精度
近年来:自适应人工粘性(如 TVD 方法)
特点:
让我们回到隐式格式的讨论,以第2章介绍的 Crank–Nicolson 方法为例。本节中,我们考虑一个推进求解(marching)的例子;将 \(t\) 作为推进变量。
👉 Crank–Nicolson格式
\[ \frac{\partial T}{\partial t} = \alpha \frac{\partial^2 T}{\partial x^2} \]
\[ \frac{T_i^{n+1} - T_i^n}{\Delta t}=\alpha \frac{1}{2}\left[\frac{T_{i+1}^{n} - 2T_i^{n} + T_{i-1}^{n}}{(\Delta x)^2}+\frac{T_{i+1}^{n+1} - 2T_i^{n+1} + T_{i-1}^{n+1}}{(\Delta x)^2}\right] \]
该方程只有一个额外的自变量,即 \(x\)。由于我们处理的是线性方程,因此采用 Crank–Nicolson 方法得到的隐式解可以直接通过 Thomas 算法(见教材附录A)求解。
当问题涉及多个空间变量时(三维或二维问题),差分方程将不再保持三对角结构。
考虑二维非定常导热方程:
\[ \frac{\partial T}{\partial t} = \alpha \left( \frac{\partial^2 T}{\partial x^2} + \frac{\partial^2 T}{\partial y^2} \right) \]
采用 Crank–Nicolson 离散,可得:
\[ \frac{T_{i,j}^{n+1} - T_{i,j}^{n}}{\Delta t}=\alpha \frac{1}{2} \left[\frac{T_{i+1,j}^{n+1} -2T_{i,j}^{n+1} + T_{i-1,j}^{n+1}}{(\Delta x)^2}+\frac{T_{i+1,j}^{n} -2T_{i,j}^{n} + T_{i-1,j}^{n}}{(\Delta x)^2} \right] \]
\[ + \alpha \frac{1}{2} \left[\frac{T_{i,j+1}^{n+1} -2T_{i,j}^{n+1} + T_{i,j-1}^{n+1}}{(\Delta y)^2}+\frac{T_{i,j+1}^{n} -2T_{i,j}^{n} + T_{i,j-1}^{n}}{(\Delta y)^2}\right] \]
\[ \frac{T_{i,j}^{n+1} - T_{i,j}^{n}}{\Delta t}=\alpha \frac{1}{2} \left[\frac{T_{i+1,j}^{n+1} -2T_{i,j}^{n+1} + T_{i-1,j}^{n+1}}{(\Delta x)^2}+\frac{T_{i+1,j}^{n} -2T_{i,j}^{n} + T_{i-1,j}^{n}}{(\Delta x)^2} \right] \]
\[ + \alpha \frac{1}{2} \left[\frac{T_{i,j+1}^{n+1} -2T_{i,j}^{n+1} + T_{i,j-1}^{n+1}}{(\Delta y)^2}+\frac{T_{i,j+1}^{n} -2T_{i,j}^{n} + T_{i,j-1}^{n}}{(\Delta y)^2}\right] \]
该方程包含 5 个未知量:
\[ T_{i,j}^{n+1},\; T_{i+1,j}^{n+1},\; T_{i-1,j}^{n+1},\; T_{i,j+1}^{n+1},\; T_{i,j-1}^{n+1} \]
👉 因此:
为了恢复三对角结构,引入: 交替方向隐式(Alternating-Direction Implicit, ADI)方法
核心思想:
在时间区间 \(\Delta t/2\) 内:x方向 👉 隐式、y方向 👉 显式
\[ \frac{T_{i,j}^{n+1/2} - T_{i,j}^{n}}{\Delta t/2}=\alpha \frac{T_{i+1,j}^{n+1/2} -2T_{i,j}^{n+1/2} + T_{i-1,j}^{n+1/2}}{(\Delta x)^2}+\alpha \frac{T_{i,j+1}^{n} -2T_{i,j}^{n} + T_{i,j-1}^{n}}{(\Delta y)^2} \]
整理得到三对角形式:
\[ A T_{i-1,j}^{n+1/2} - B T_{i,j}^{n+1/2} + A T_{i+1,j}^{n+1/2} = K_i \]
其中:
\[ A = \frac{\alpha \Delta t}{2(\Delta x)^2} \]
\[ B = 1 + \frac{\alpha \Delta t}{(\Delta x)^2} \]
\[ K_i =- T_{i,j}^{n}- \frac{\alpha \Delta t}{2(\Delta y)^2}\left(T_{i,j+1}^{n} -2T_{i,j}^{n} + T_{i,j-1}^{n} \right) \]
固定 \(j\):对 \(i = 1 \rightarrow N\) 扫掠(每一行使用 Thomas 算法)
总共执行:\(M\) 次扫掠(每个 \(j\) 一次)👉 得到:\(T_{i,j}^{n+1/2}\)
从 \(t + \Delta t/2\) 推进到 \(t + \Delta t\)
此时:
离散格式:
\[ \frac{T_{i,j}^{n+1} - T_{i,j}^{n+1/2}}{\Delta t/2}=\alpha \frac{T_{i+1,j}^{n+1/2} -2T_{i,j}^{n+1/2} + T_{i-1,j}^{n+1/2}}{(\Delta x)^2}+\alpha \frac{T_{i,j+1}^{n+1} -2T_{i,j}^{n+1} + T_{i,j-1}^{n+1}}{(\Delta y)^2} \]
化为三对角形式
\[ C T_{i,j+1}^{n+1} - D T_{i,j}^{n+1} + C T_{i,j-1}^{n+1} = L_j \]
化为三对角形式
\[ C T_{i,j+1}^{n+1} - D T_{i,j}^{n+1} + C T_{i,j-1}^{n+1} = L_j \]
其中:
\[ C = \frac{\alpha \Delta t}{2(\Delta y)^2} \]
\[ D = 1 + \frac{\alpha \Delta t}{(\Delta y)^2} \]
\[ L_j =- T_{i,j}^{n+1/2}- \frac{\alpha \Delta t}{2(\Delta x)^2}\left(T_{i+1,j}^{n+1/2} -2T_{i,j}^{n+1/2} + T_{i-1,j}^{n+1/2}\right) \]
求解方法(y方向扫掠),固定 \(i\):
👉 得到最终结果:\(T_{i,j}^{n+1}\)

在本章,我们已经讨论了求解无粘不可压流动的一种数值方法,即松弛法。
无粘不可压流动由椭圆型偏微分方程控制,而松弛法本质上是一种迭代方法,适用于求解椭圆问题。
然而:
黏性不可压流动由Navier–Stokes方程控制,其具有混合的椭圆-抛物特性
因此,松弛方法并不适用于此类问题。
该方法:
\[ \text{连续方程:}\quad \nabla \cdot \mathbf{V} = 0 \]
\[ \text{x动量:}\quad\rho \frac{Du}{Dt}=-\frac{\partial p}{\partial x}+ \mu \nabla^2 u + \rho f_x \]
\[ \text{y动量:}\quad\rho \frac{Dv}{Dt}=-\frac{\partial p}{\partial y}+ \mu \nabla^2 v + \rho f_y \]
\[ \text{z动量:}\quad\rho \frac{Dw}{Dt}=-\frac{\partial p}{\partial z}+ \mu \nabla^2 w + \rho f_z \]
👉 数值困难
对于可压缩流:声速有限 → 时间步长有限
对于不可压流:声速 \(\to \infty\)。显式方法要求 \(\Delta t \to 0\)
👉 不可行!
连续方程离散:
\[ \frac{u_{i+1,j} - u_{i-1,j}}{2\Delta x}+\frac{v_{i,j+1} - v_{i,j-1}}{2\Delta y}= 0 \]
速度可以呈现:
👉 非物理解

压力梯度同样问题
\[ \frac{\partial p}{\partial x}=\frac{p_{i+1,j} - p_{i-1,j}}{2\Delta x}, \qquad \frac{\partial p}{\partial y}=\frac{p_{i,j+1} - p_{i,j-1}}{2\Delta y} \]
👉 非物理解

解决方法:交错网格(Staggered Grid)
连续方程变为:
\[ \frac{u_{i+1/2,j} - u_{i-1/2,j}}{\Delta x}+\frac{v_{i,j+1/2} - v_{i,j-1/2}}{\Delta y}= 0 \]
👉 使用相邻点 → 消除奇偶失联(棋盘格)
核心步骤:
\[ p = p^* + p', \qquad u = u^* + u', \qquad v = v^* + v' \]
从动量方程离散:
\[ (\rho u)^{n+1}_{i+1/2,j}=(\rho u)^n + A\Delta t- \frac{\Delta t}{\Delta x}(p'_{i+1,j} - p'_{i,j}) \]
\[ (\rho u)^{n+1}_{i+1/2,j}=(\rho u)^n + A\Delta t- \frac{\Delta t}{\Delta x}(p'_{i+1,j} - p'_{i,j}) \]
\[ (\rho v)^{n+1}_{i,j+1/2}=(\rho v)^n + B\Delta t- \frac{\Delta t}{\Delta y}(p'_{i,j+1} - p'_{i,j}) \tag{6.93} \]
代入连续方程
\[ \frac{(\rho u)_{i+1/2,j} - (\rho u)_{i-1/2,j}}{\Delta x}+\frac{(\rho v)_{i,j+1/2} - (\rho v)_{i,j-1/2}}{\Delta y}= 0 \]
得到压力修正方程
\[ a p'_{i,j}+ b p'_{i+1,j}+ b p'_{i-1,j}+ c p'_{i,j+1}+ c p'_{i,j-1}+ d = 0 \]
\[ a p'_{i,j}+ b p'_{i+1,j}+ b p'_{i-1,j}+ c p'_{i,j+1}+ c p'_{i,j-1}+ d = 0 \]
其中:
\[ a = 2\left(\frac{\Delta t}{\Delta x^2} + \frac{\Delta t}{\Delta y^2}\right) \]
\[ b = -\frac{\Delta t}{\Delta x^2},\quad c = -\frac{\Delta t}{\Delta y^2} \]
\[ d =\frac{1}{\Delta x}\left[(\rho u^*)_{i+1/2,j} - (\rho u^*)_{i-1/2,j}\right]+\frac{1}{\Delta y}\left[(\rho v^*)_{i,j+1/2} - (\rho v^*)_{i,j-1/2}\right] \]
该方程本质是:
\[ \nabla^2 p' = Q \]
👉 即:Poisson方程
\[ p = p^* + p' \]
边界条件
\[ \frac{\partial p}{\partial y} = 0 \]
核心思想 👉 压力修正 = 用Poisson方程强制满足连续方程
方法本质
广泛应用于:
👉 压力修正方法 = 用压力调整速度,使流场满足连续方程