2025–2026 学年第二学期
北京理工大学 空天科学与技术学院
任杰
John D. Anderson Computational Fluid
Dynamics: The Basics with Applications
McGraw-Hill, 1995
任玉新 陈海昕
计算流体力学基础 清华大学出版社,2006
张德良
计算流体力学教程 高等教育出版社,2010
蔡庆东
计算流体动力学
北京大学本科生研究生专业基础课讲义,2018
真正理解 CFD 的最好方式,是自己实现数值算法并运行计算 - John D. Anderson
EXPLICIT TIME-MARCHING METHOD
Lax–Wendroff 方法
以时间方向的泰勒展开为核心,
将时间导数转化为空间导数,
实现从已知时刻到下一时刻的显式推进。
Taylor expansion · Centered difference · Explicit update
Lax–Wendroff 方法基于 时间方向的泰勒展开:
\[ \rho_{i,j}^{\,n+1} =\rho_{i,j}^{\,n} +\left(\frac{\partial \rho}{\partial t}\right)_{i,j}^{\,n}\Delta t +\frac{1}{2}\left(\frac{\partial^2 \rho}{\partial t^2}\right)_{i,j}^{\,n}(\Delta t)^2 +O(\Delta t^3) \]
\[ u_{i,j}^{\,n+1} =u_{i,j}^{\,n} +\left(\frac{\partial u}{\partial t}\right)_{i,j}^{\,n}\Delta t +\frac{1}{2}\left(\frac{\partial^2 u}{\partial t^2}\right)_{i,j}^{\,n}(\Delta t)^2 +O(\Delta t^3) \]
\[ v_{i,j}^{\,n+1} =v_{i,j}^{\,n} +\left(\frac{\partial v}{\partial t}\right)_{i,j}^{\,n}\Delta t +\frac{1}{2}\left(\frac{\partial^2 v}{\partial t^2}\right)_{i,j}^{\,n}(\Delta t)^2 +O(\Delta t^3) \]
\[ e_{i,j}^{\,n+1} =e_{i,j}^{\,n} +\left(\frac{\partial e}{\partial t}\right)_{i,j}^{\,n}\Delta t +\frac{1}{2}\left(\frac{\partial^2 e}{\partial t^2}\right)_{i,j}^{\,n}(\Delta t)^2 +O(\Delta t^3) \]
\[ t^{n+1}=t^n+\Delta t \]
💻 代码演示
Lax_Wendroff_transport1D.m
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) \]
\(e\) 表示 单位质量内能, 若采用理想气体状态方程,还需要补充:
\[ p=(\gamma-1)\rho e \]
一阶时间导数由 连续方程 得到:
\[ \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) \]
在均匀网格上,若空间导数采用 二阶中心差分,有:
\[ \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] \]
二阶时间导数可由连续方程再次对时间求导得到:
\[ \rho_{tt} =-\left[ \rho_t u_x +\rho u_{xt} +u_t\rho_x +u\rho_{xt} +\rho_t v_y +\rho v_{yt} +v_t\rho_y +v\rho_{yt} \right] \]
混合导数可以通过对动量方程继续求空间导数得到。由 \(x\) 方向动量方程:
\[ u_t =-\left( u u_x +v u_y +\frac{1}{\rho}p_x \right) \]
\[ u_t =-\left( u u_x +v u_y +\frac{1}{\rho}p_x \right) \]
对 \(x\) 求导:
\[ u_{xt} =-\frac{\partial}{\partial x} \left( u u_x +v u_y +\frac{1}{\rho}p_x \right) \]
逐项展开:
\[ \frac{\partial}{\partial x}(u u_x) =u_x^2+u u_{xx} \]
\[ \frac{\partial}{\partial x}(v u_y) =v_xu_y+v u_{xy} \]
\[ \frac{\partial}{\partial x} \left( \frac{1}{\rho}p_x \right) =\frac{1}{\rho}p_{xx} -\frac{\rho_x}{\rho^2}p_x \]
类似地,由 \(y\) 方向动量方程:
\[ v_t =-\left( u v_x +v v_y +\frac{1}{\rho}p_y \right) \]
对 \(y\) 求导:
\[ v_{yt} =-\frac{\partial}{\partial y} \left( u v_x +v v_y +\frac{1}{\rho}p_y \right) \]
展开得到:
\[ v_{yt} =-u_yv_x -u v_{xy} -v_y^2 -v v_{yy} -\frac{1}{\rho}p_{yy} +\frac{\rho_y}{\rho^2}p_y \]
\[ \rho_{tt} =-\left[ \rho_t u_x +\rho u_{xt} +u_t\rho_x +u\rho_{xt} +\rho_t v_y +\rho v_{yt} +v_t\rho_y +v\rho_{yt} \right] \]
为了计算 \(\rho_{tt}\), 还需要 \(\rho_{xt}\) 与 \(\rho_{yt}\)。
由连续方程:
\[ \rho_t =-\left( \rho u_x +u\rho_x +\rho v_y +v\rho_y \right) \]
对 \(x\) 求导:
\[ \rho_{xt} =-\frac{\partial}{\partial x} \left( \rho u_x +u\rho_x +\rho v_y +v\rho_y \right) \]
展开:
\[ \rho_{xt} =-2\rho_xu_x -\rho u_{xx} -u\rho_{xx} -\rho_xv_y -\rho v_{xy} -v_x\rho_y -v\rho_{xy} \]
同理,对 \(y\) 求导:
\[ \rho_{yt} =-\rho_yu_x -\rho u_{xy} -u_y\rho_x -u\rho_{xy} -2\rho_yv_y -\rho v_{yy} -v\rho_{yy} \]
因此,密度的二阶时间导数可计算:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \rho_{tt} =-\rho_t u_x -\rho u_{xt} -u_t\rho_x -u\rho_{xt} -\rho_t v_y -\rho v_{yt} -v_t\rho_y -v\rho_{yt} } $} \]
其中:
\[ \rho_t =-\left( \rho u_x +u\rho_x +\rho v_y +v\rho_y \right) \]
\[ u_t =-\left( u u_x +v u_y +\frac{1}{\rho}p_x \right) \]
\[ v_t =-\left( u v_x +v v_y +\frac{1}{\rho}p_y \right) \]
\[ u_{xt} =-u_x^2 -u u_{xx} -v_xu_y -vu_{xy} -\frac{1}{\rho}p_{xx} +\frac{\rho_x}{\rho^2}p_x \]
\[ v_{yt} =-u_yv_x -u v_{xy} -v_y^2 -v v_{yy} -\frac{1}{\rho}p_{yy} +\frac{\rho_y}{\rho^2}p_y \]
空间离散均采用 中心差分,例如
\[ \frac{\partial^2 u}{\partial x\partial t} =-\left(\frac{\partial u}{\partial x}\right)^2 -u\frac{\partial^2u}{\partial x^2} -\frac{\partial v}{\partial x}\frac{\partial u}{\partial y} -v\frac{\partial^2u}{\partial x\partial y} -\frac{1}{\rho}\frac{\partial^2p}{\partial x^2} +\frac{1}{\rho^2}\frac{\partial\rho}{\partial x}\frac{\partial p}{\partial x} \]
所有项都在时间 \(t\) 处采用 二阶中心差分格式 表示,即:
\[ \begin{aligned} \left(\frac{\partial^2u}{\partial x\partial t}\right)^t_{i,j} =&-\left(\frac{u^t_{i+1,j}-u^t_{i-1,j}}{2\Delta x}\right)^2 -u^t_{i,j}\frac{u^t_{i+1,j}-2u^t_{i,j}+u^t_{i-1,j}}{(\Delta x)^2} -\frac{v^t_{i+1,j}-v^t_{i-1,j}}{2\Delta x} \frac{u^t_{i,j+1}-u^t_{i,j-1}}{2\Delta y}\\ &-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{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{\rho^t_{i+1,j}-\rho^t_{i-1,j}}{2\Delta x} \frac{p^t_{i+1,j}-p^t_{i-1,j}}{2\Delta x} \end{aligned} \]
右端的所有项都来自于 \(t\) 时刻已知的流场, 因此可以计算出左端的数值。
因此可以通过如下展开得到下一时刻的密度
\[ \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 \]
将 \(n+1\) 时刻的基本物理量在 \(n\) 时刻泰勒展开
用控制方程将时间导数转为空间导数
用空间差分替代空间导数
代入泰勒展开完成时间推进
👉 从而实现: 已知时刻 \(\color{black}{t}\) → 显式推进到 \(\color{black}{t+\Delta t}\)
EXPLICIT TIME-MARCHING METHOD
Lax–Wendroff 方法
以时间方向的泰勒展开为核心,
将时间导数转化为空间导数,
实现从已知时刻到下一时刻的显式推进。
Taylor expansion · Centered difference · Explicit update
从数值离散的角度看,Lax–Wendroff 方法最核心的思想是什么?
A. 用人工粘性抑制高频振荡
B. 用时间方向的泰勒展开实现显式时间推进
C. 用迎风差分保证计算稳定
D. 用隐式格式求解线性方程组
参考判断:B
Lax–Wendroff 方法的本质是:
\[ \text{时间方向泰勒展开} \rightarrow \text{用控制方程替换时间导数} \rightarrow \text{转化为空间差分} \]
通过控制方程把时间推进转化为可计算的空间导数表达。
PREDICTOR–CORRECTOR STRATEGY
MacCormack 方法
预测步
→
校正步
→
时间推进
用一次预测和一次校正,
在保持显式计算优势的同时,
获得二阶时间精度与更清晰的算法结构。
与Lax-Wendroff方法类似,以密度为例:
\[ \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]\) 内的 平均时间导数。
MacCormack 方法是 Lax–Wendroff 方法的一种变体, 但在实际应用中 要简单得多。
与 Lax–Wendroff 方法类似,MacCormack 方法也是一种 显式有限差分方法, 在 时间 和 空间 上均具有 二阶精度。
该方法最早于 1969 年 提出,在随后约 15 年 中成为求解流体流动问题最常用的显式差分方法之一。
如今,MacCormack 方法在很大程度上已被更复杂的方法所取代,但它仍然是理解 预测-校正思想 和 显式时间推进策略 的重要入门格式。
Lax–Wendroff 方法需要计算二阶时间导数
MacCormack 方法通过平均时间导数实现二阶精度
从而避免复杂推导
👉 本质优势:避免计算二阶时间导数
类似地:
\[ 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 \]
\[ \rho_t =-\left( \rho u_x +u\rho_x +\rho v_y +v\rho_y \right) \]
在连续方程中,将空间导数用 前向差分(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}+\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 \]
👉 注意:
该值仅为 预测值(predicted value)
仅具有 一阶精度
类似地:
\[ \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(\overline{\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}+\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(\overline{\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 相同) ✔ 计算量更低 ✔ 易于编程
本质是一种: 对时间导数进行对称近似的策略
预测步和校正步可以交换(forward/backward 对调)
仍保持 二阶精度
在前面的讨论中,我们通过假设 无粘流、 采用欧拉方程的 非守恒形式, 并考虑 时间推进过程, 来介绍 Lax–Wendroff和 MacCormack方法。
事实上,这些假设并非必要;上述方法同样适用于:
黏性流
控制方程的守恒形式
空间推进(space marching)
下面分别加以说明。
MacCormack 方法已被广泛用于通过时间推进求解非定常 Navier–Stokes 方程。
其基本思想相同:
时间导数放在方程左侧
空间导数放在方程右侧
预测步使用 前向差分
校正步使用 后向差分
唯一的区别在于:Navier–Stokes 方程中的 空间导数项比欧拉方程更多。
注:对流项可以采用上述差分方式,而黏性项通常建议在预测和校正步中均采用中心差分。
为简单起见,仍以欧拉方程为例。适用于CFD计算的守恒形式可写为:
\[ \frac{\partial U}{\partial t}=-\frac{\partial F}{\partial x}-\frac{\partial G}{\partial y}+J \]
其中:
\(U,F,G,J\) 为向量
\(U\) 的分量包括:\(\rho,\rho u,\rho v,\rho(e+V^2/2)\)
这些量可以通过 Lax–Wendroff 或 MacCormack 方法进行时间推进计算。
为了说明空间推进思想,考虑图中的二维流动。假设:
流动方向为 \(\color{black}{x}\) 方向(从左到右)
流动为无粘流(欧拉方程)
守恒形式下,方程可写为:
\[ \frac{\partial F}{\partial x}=J-\frac{\partial G}{\partial y} \]
亚声速流:方程为椭圆型 ❌ 不适用空间推进
超声速流:方程为双曲型 ✅ 可采用空间推进

假设在某一条垂直线(初始数据线)上,流场变量已知:
\[ x=x_0 \]
则可以沿 \(\color{black}{x}\) 方向 逐步推进计算。
👉 类比:
时间推进: \(\color{black}{t\rightarrow t+\Delta t}\)
空间推进: \(\color{black}{x\rightarrow x+\Delta x}\)
考虑如下空间推进形式:
\[ \frac{\partial F}{\partial x}=J-\frac{\partial G}{\partial y} \]
其中,\(F\)、\(G\) 和 \(J\) 均为流场变量的函数。
在第 \(i\) 条网格线上,采用 前向差分 近似 \(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 \]
这里, \(\color{black}{\bar{F}^{i+1}_j}\) 表示在第 \(i+1\) 条网格线上的预测值。
由于 \(G\) 和 \(J\) 通常依赖于流场变量,因此校正步中应使用由预测值 \(\color{black}{\bar{F}^{i+1}_j}\) 计算得到的预测通量和预测源项:
\[ \bar{G}^{i+1}_j=G\left(\bar{F}^{i+1}_j\right) \]
\[ \bar{J}^{i+1}_j=J\left(\bar{F}^{i+1}_j\right) \]
在第 \(i+1\) 条网格线上,采用 后向差分 近似 \(y\) 方向导数:
\[ \left(\frac{\partial \bar{F}}{\partial x}\right)^{i+1}_j=\bar{J}^{i+1}_j-\frac{\bar{G}^{i+1}_j-\bar{G}^{i+1}_{j-1}}{\Delta y} \]
注意:这里必须使用预测量 \(\color{black}{\bar{G}^{i+1}}\) 和 \(\color{black}{\bar{J}^{i+1}}\), 而不是最终未知量 \(\color{black}{G^{i+1}}\) 和 \(\color{black}{J^{i+1}}\)。
将预测步和校正步得到的空间导数取平均:
\[ \left(\frac{\partial F}{\partial x}\right)_{av}=\frac{1}{2}\left[\left(\frac{\partial F}{\partial x}\right)^i_j+\left(\frac{\partial \bar{F}}{\partial x}\right)^{i+1}_j\right] \]
最终得到第 \(i+1\) 条网格线上的校正值:
\[ F^{i+1}_j=F^i_j+\left(\frac{\partial F}{\partial x}\right)_{av}\Delta x \]
也可以写成:
\[ F^{i+1}_j=F^i_j+\frac{\Delta x}{2}\left[\left(\frac{\partial F}{\partial x}\right)^i_j+\left(\frac{\partial \bar{F}}{\partial x}\right)^{i+1}_j\right] \]
代入预测步和校正步的具体表达式,可得:
\[ F^{i+1}_j=F^i_j+\frac{\Delta x}{2}\left[J^i_j-\frac{G^i_{j+1}-G^i_j}{\Delta y}+\bar{J}^{i+1}_j-\frac{\bar{G}^{i+1}_j-\bar{G}^{i+1}_{j-1}}{\Delta y}\right] \]
空间推进本质上是:👉 把空间方向当作“时间”来推进
空间推进 vs 时间推进:
需要使用 守恒形式
需要进行 变量解码(flux → primitive)
仅适用于 双曲型问题(如超声速流)
MacCormack 方法不仅适用于时间推进
也可以用于空间推进
关键在于方程类型(双曲性)
👉 空间推进 = “沿流向做时间推进”
综合算例:准一维喷管流动
Quasi-One-Dimensional Nozzle Flow
收缩–扩张喷管
MacCormack 方法
时间推进求稳态
边界条件
从一个看似简单的喷管问题出发,
贯通 物理建模、
控制方程、
差分格式
与 数值边界条件。
Nozzle physics · Predictor–Corrector scheme · Boundary-condition design
我们已经讨论了多种求解控制方程的数值方法。通常会这样理解:
数值解是原始偏微分方程的近似解,其误差来自截断误差和舍入误差。
但也可以换一个角度:
差分方程的精确解,往往不是原始方程的精确解,
而是另一个“被数值格式修改过”的偏微分方程的精确解。
这个被修改后的方程称为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \text{Modified Equation} } $} \]
考虑一维线性波动方程:
\[ \frac{\partial u}{\partial t}+a\frac{\partial u}{\partial x}=0,\qquad a>0 \]
采用如下差分格式:
时间方向:一阶前向差分
空间方向:一阶后向差分
得到差分方程:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \frac{u_i^{t+\Delta t}-u_i^t}{\Delta t}+a\frac{u_i^t-u_{i-1}^t}{\Delta x}=0 } $} \]
一阶迎风格式(FTBS)。
对时间项作 Taylor 展开:\(u_i^{t+\Delta t}=u_i^t+\left(\frac{\partial u}{\partial t}\right)_i^t\Delta t+\left(\frac{\partial^2u}{\partial t^2}\right)_i^t\frac{(\Delta t)^2}{2}+\left(\frac{\partial^3u}{\partial t^3}\right)_i^t\frac{(\Delta t)^3}{6}+\cdots\)
对空间项作 Taylor 展开:\(u_{i-1}^t=u_i^t-\left(\frac{\partial u}{\partial x}\right)_i^t\Delta x+\left(\frac{\partial^2u}{\partial x^2}\right)_i^t\frac{(\Delta x)^2}{2}-\left(\frac{\partial^3u}{\partial x^3}\right)_i^t\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 \]
得到:
\[ u_t+\frac{\Delta t}{2}u_{tt}+\frac{(\Delta t)^2}{6}u_{ttt}+a\left(u_x-\frac{\Delta x}{2}u_{xx}+\frac{(\Delta x)^2}{6}u_{xxx}\right)+\cdots=0 \]
将上一页结果整理为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+au_x=-\frac{\Delta t}{2}u_{tt} -\frac{(\Delta t)^2}{6}u_{ttt} +\frac{a\Delta x}{2}u_{xx} -\frac{a(\Delta x)^2}{6}u_{xxx} +\cdots } $} \]
到这里为止,右端仍然同时含有时间导数和空间导数。
修正方程的关键步骤,就是把右端的时间导数逐步替换为空间导数。
首先对初步整理式关于 \(t\) 求导:
\[ u_{tt}+au_{xt}=-\frac{\Delta t}{2}u_{ttt}-\frac{(\Delta t)^2}{6}u_{tttt}+\frac{a\Delta x}{2}u_{xxt}-\frac{a(\Delta x)^2}{6}u_{xxxt}+\cdots \]
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+au_x=-\frac{\Delta t}{2}u_{tt} -\frac{(\Delta t)^2}{6}u_{ttt} +\frac{a\Delta x}{2}u_{xx} -\frac{a(\Delta x)^2}{6}u_{xxx} +\cdots } $} \]
再对初步整理式关于 \(x\) 求导,并乘以 \(a\):
\[ a u_{tx}+a^2u_{xx}=-\frac{a\Delta t}{2}u_{ttx}-\frac{a(\Delta t)^2}{6}u_{tttx}+\frac{a^2\Delta x}{2}u_{xxx}-\frac{a^2(\Delta x)^2}{6}u_{xxxx}+\cdots \]
\[ u_{tt}+au_{xt}=-\frac{\Delta t}{2}u_{ttt}-\frac{(\Delta t)^2}{6}u_{tttt}+\frac{a\Delta x}{2}u_{xxt}-\frac{a(\Delta x)^2}{6}u_{xxxt}+\cdots \]
两式相减,利用 \(u_{xt}=u_{tx}\),得到:
\[ \colorbox{#9ACD32}{$\displaystyle \color{black}{ u_{tt}=a^2u_{xx} +\frac{\Delta t}{2}\left(-u_{ttt}+a u_{ttx}+O(\Delta t)\right) +\frac{\Delta x}{2}\left(a u_{xxt}-a^2u_{xxx}+O(\Delta x)\right) } $} \]
由上一页的结果,保留最低阶关系可得:
\[ u_{tt}=a^2u_{xx}+O(\Delta t,\Delta x) \]
对其关于 \(t\) 求导:
\[ u_{ttt}=a^2u_{xxt}+O(\Delta t,\Delta x) \]
另一方面,由:
\[ u_t+au_x=O(\Delta t,\Delta x) \Longrightarrow u_{xxt}=-au_{xxx}+O(\Delta t,\Delta x) \]
因此:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_{ttt}=-a^3u_{xxx}+O(\Delta t,\Delta x) } $} \]
由
\[ u_{tt}=a^2u_{xx}+O(\Delta t,\Delta x)\quad\Longrightarrow\quad u_{ttx}=a^2u_{xxx}+O(\Delta t,\Delta x) \]
\[ \left. \begin{aligned} u_{ttt}&=a^2u_{xxt}+O(\Delta t,\Delta x)\\ u_{ttt}&=-a^3u_{xxx}+O(\Delta t,\Delta x) \end{aligned} \right\} \quad\Longrightarrow\quad u_{xxt}=-au_{xxx}+O(\Delta t,\Delta x) \]
于是有:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_{ttx}=a^2u_{xxx}+O(\Delta t,\Delta x),\qquad u_{xxt}=-au_{xxx}+O(\Delta t,\Delta x) } $} \]
将
\[ u_{ttt}=-a^3u_{xxx}+O(\Delta t,\Delta x),\qquad u_{ttx}=a^2u_{xxx}+O(\Delta t,\Delta x),\qquad u_{xxt}=-au_{xxx}+O(\Delta t,\Delta x) \]
代入:
\[ \colorbox{#9ACD32}{$\displaystyle \color{black}{ u_{tt}=a^2u_{xx} +\frac{\Delta t}{2}\left(-u_{ttt}+a u_{ttx}+O(\Delta t)\right) +\frac{\Delta x}{2}\left(a u_{xxt}-a^2u_{xxx}+O(\Delta x)\right) } $} \]
得到:
\[ u_{tt}=a^2u_{xx}+\frac{\Delta t}{2}\left(a^3u_{xxx}+a^3u_{xxx}+O(\Delta t,\Delta x)\right)+\frac{\Delta x}{2}\left(-a^2u_{xxx}-a^2u_{xxx}+O(\Delta t,\Delta x)\right)+\cdots \]
即:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_{tt}=a^2u_{xx}+a^3\Delta t\,u_{xxx}-a^2\Delta x\,u_{xxx}+\cdots } $} \]
这就是教材推导中修正三阶项的关键结果。
初步整理式为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+au_x=-\frac{\Delta t}{2}u_{tt} -\frac{(\Delta t)^2}{6}u_{ttt} +\frac{a\Delta x}{2}u_{xx} -\frac{a(\Delta x)^2}{6}u_{xxx} +\cdots } $} \]
代入:
\[ u_{tt}=a^2u_{xx}+a^3\Delta t\,u_{xxx}-a^2\Delta x\,u_{xxx}+\cdots \]
以及:
\[ u_{ttt}=-a^3u_{xxx}+\cdots \]
得到:
\[ u_t+au_x=-\frac{a^2\Delta t}{2}u_{xx}-\frac{a^3(\Delta t)^2}{2}u_{xxx}+\frac{a^2\Delta x\Delta t}{2}u_{xxx}+\frac{a^3(\Delta t)^2}{6}u_{xxx}+\frac{a\Delta x}{2}u_{xx}-\frac{a(\Delta x)^2}{6}u_{xxx}+\cdots \]
将同类项合并:
\[ u_t+au_x=\left(\frac{a\Delta x}{2}-\frac{a^2\Delta t}{2}\right)u_{xx}+\left(\frac{a^2\Delta x\Delta t}{2}-\frac{a^3(\Delta t)^2}{2}+\frac{a^3(\Delta t)^2}{6}-\frac{a(\Delta x)^2}{6}\right)u_{xxx}+\cdots \]
定义 CFL 数:\(\nu=\frac{a\Delta t}{\Delta x}\)
于是:
\[ \frac{a\Delta x}{2}-\frac{a^2\Delta t}{2}=\frac{a\Delta x}{2}(1-\nu) \]
并且:
\[ \frac{a^2\Delta x\Delta t}{2}-\frac{a^3(\Delta t)^2}{2}+\frac{a^3(\Delta t)^2}{6}-\frac{a(\Delta x)^2}{6}=\frac{a(\Delta x)^2}{6}(-2\nu^2+3\nu-1) \]
最终得到修正方程:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+au_x=\frac{a\Delta x}{2}(1-\nu)u_{xx}+\frac{a(\Delta x)^2}{6}(-2\nu^2+3\nu-1)u_{xxx}+\cdots } $} \]
其中:
\[ \nu=\frac{a\Delta t}{\Delta x} \]
这说明:差分格式并不是在精确求解原方程 \(u_t+au_x=0\),
而是在精确求解一个包含额外高阶项的“修正方程”。
修正方程中的第一项为:
\[ \frac{a\Delta x}{2}(1-\nu)u_{xx} \]
它与粘性扩散项形式相似。因此,可以把
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \mu_{\mathrm{num}}=\frac{a\Delta x}{2}(1-\nu) } $} \]
理解为一阶迎风格式引入的数值粘性。
当 \(0<\nu<1\) 且 \(a>0\) 时,\(\mu_{\mathrm{num}}>0\)。
数值解会表现出类似物理粘性的扩散作用。
这就是数值耗散,也常被称为人工粘性。
修正方程中的第二项为:
\[ \frac{a(\Delta x)^2}{6}(3\nu-2\nu^2-1)u_{xxx} \]
这一项为色散项。
数值色散会使不同波数的扰动以不同的相速度传播,
从而导致波形变形、相位误差,甚至在间断附近产生振荡。
\[ u_{xx} \]
表现为扩散、平滑、耗散
对应:数值耗散
\[ u_{xxx} \]
改变相速度,引入振荡
对应:数值色散
👉 类似真实粘性

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

考虑一维线性对流方程:
\[ u_t+au_x=0 \]
其物理含义很简单:
初始波形以速度 \(a\)
向右传播,
理想情况下波形不应衰减,也不应变形。
将扰动写成 Fourier 模态:
\[ u(x,t)=\hat{u}e^{i(kx-\omega t)} \]
其中 \(k\) 为波数,\(\omega\) 为角频率。
对 Fourier 模态,有:
\[ u_t=-i\omega u,\qquad u_x=iku \]
代入原始方程:
\[ u_t+au_x=0 \]
得到:
\[ -i\omega u+aiku=0 \]
因此:
\[ \omega=ak \]
相速度为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{c_p=\frac{\omega}{k}=a}$} \]
结论:所有波数 \(k\) 的 Fourier
模态都以同一速度 \(a\) 传播,
因此波形整体平移,不发生变形。
若修正方程中含有二阶导数项:
\[ u_t+au_x=\mu u_{xx} \]
对 Fourier 模态,有:
\[ u_{xx}=(ik)^2u=-k^2u \]
代入可得:
\[ -i\omega u+aiku=-\mu k^2u \Longrightarrow \omega=ak-i\mu k^2 \]
\(\omega\)不再是实数,因此解\(u(x,t)=\hat{u}e^{i(kx-\omega t)}\)中包含衰减因子:
\[ \colorbox{yellow}{$\displaystyle \color{black}{e^{-\mu k^2t}}$} \]
\[ u_{xx}\rightarrow -k^2u \]
带来振幅衰减:
\[ e^{-\mu k^2t} \]
二阶导数项主要改变振幅,因此对应 数值耗散。
若修正方程中含有三阶导数项:
\[ u_t+au_x=\beta u_{xxx} \]
对 Fourier 模态,有:
\[ u_{xxx}=(ik)^3u=-ik^3u \]
代入可得:
\[ -i\omega u+aiku=-i\beta k^3u \Longrightarrow \omega=ak+\beta k^3 \]
因此相速度为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{c_p=\frac{\omega}{k}=a+\beta k^2}$} \]
原始方程中:
\[ c_p=a \]
所有波数传播速度相同。
而加入三阶导数项后:
\[ c_p=a+\beta k^2 \]
相速度依赖于波数 \(k\)。
这意味着:
以二阶导数为例:
\[ u_{xx}\rightarrow -k^2u \]
主要影响:
\[ \text{振幅} \]
表现为:
\[ \text{平滑、扩散、衰减} \]
以三阶导数为例:
\[ u_{xxx}\rightarrow -ik^3u \]
主要影响:
\[ \text{相位} \]
表现为:
\[ \text{相速度误差、振荡} \]
💻 代码演示
show_signal.m
例如迎风格式的修正方程:
\[ u_t+au_x =\frac{a\Delta x}{2}(1-\nu)u_{xx} +\frac{a(\Delta x)^2}{6}(3\nu-2\nu^2-1)u_{xxx} +\cdots \]
其中:
\[ \nu=\frac{a\Delta t}{\Delta x} \]
\[ u_{xx} \]
对应数值耗散:
波峰降低,波形被抹平。
\[ u_{xxx} \]
对应数值色散:
相速度误差,波形前后振荡。
二阶导数项改变 Fourier 模态的振幅,
因此表现为数值耗散;
三阶导数项改变 Fourier 模态的相速度,
因此表现为数值色散。
耗散让波形“变矮、变宽”;
色散让不同波长“跑得快慢不一样”,从而产生振荡。
考虑最简单的一维对流方程:
\[ u_t+cu_x=0,\qquad c>0 \]
其精确解表示:
\[ u(x,t)=u_0(x-ct) \]
理想情况下,初始波形只应整体向右平移:
不衰减、不变宽、不振荡、不变形。
本算例用不同差分格式求解同一个方程,比较它们的数值误差特征。
一维线性对流方程虽然简单,但非常适合展示数值格式的本质差异。
\[ u_t+cu_x=0 \]
只描述波形平移。
如果数值解发生衰减、振荡或变形,主要来自数值格式本身。
不同格式会引入不同的修正项:
\[ u_t+cu_x=A_2u_{xx}+A_3u_{xxx}+\cdots \]
由此产生耗散与色散。
主要观察:
\[ \text{稳定性} \]
\[ \text{数值耗散} \]
主要观察:
\[ \text{数值色散} \]
\[ \text{人工耗散} \]
核心问题:同一个物理方程,为什么不同格式会给出完全不同的波形演化?
代码中提供三类初始条件:
\[ u_0=e^{-160(x-x_0)^2} \]
适合观察:
\[ u_0= \begin{cases} 1,&x_1\leq x\leq x_2\\ 0,&\text{else} \end{cases} \]
适合观察:
\[ u_0=e^{-160(x-x_0)^2}+0.08\sin(40\pi x) \]
适合观察:
💻 代码演示
LinearTransportV3.m
代码中不仅画波形,还计算三个诊断量。
\[ \max(u) \]
主要看:
\[ \text{数值耗散} \]
波峰降低越快,耗散越强。
\[ \left[\frac{1}{N}\sum_i(u_i-u_i^{exact})^2\right]^{1/2} \]
主要看:
\[ \text{整体精度} \]
\[ TV=\sum_i|u_{i+1}-u_i| \]
主要看:
\[ \text{振荡与抹平} \]
TV 增大通常意味着振荡增强。
FTCS 格式为:
\[ u_i^{n+1}=u_i^n-\frac{\nu}{2}\left(u_{i+1}^n-u_{i-1}^n\right), \qquad \nu=\frac{c\Delta t}{\Delta x} \]
修正方程:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+cu_x =-\frac{c\Delta x}{2}\nu u_{xx} +\frac{c(\Delta x)^2}{6}(\nu^2-1)u_{xxx} +\cdots } $} \]
FTCS 对一维线性对流方程是无条件不稳定的。
注意这个二阶导数项的系数是负的!
课堂观察:
\[ \text{波形逐渐失真,误差快速增长} \]
当 \(c>0\) 时,采用后向差分:
\[ u_i^{n+1}=u_i^n-\nu\left(u_i^n-u_{i-1}^n\right) \]
其修正方程主导项为:
\[ u_t+cu_x =\frac{c\Delta x}{2}(1-\nu)u_{xx} +\frac{c(\Delta x)^2}{6}(3\nu-2\nu^2-1)u_{xxx} +\cdots \]
当 \(0<\nu<1\) 时,\(u_{xx}\) 项系数为正。
因此 Upwind 格式会引入正的数值粘性。
Upwind 的典型表现:稳定,但“太粘”。
Lax 格式为:
\[ u_i^{n+1} =\frac{1}{2}\left(u_{i+1}^n+u_{i-1}^n\right) -\frac{\nu}{2}\left(u_{i+1}^n-u_{i-1}^n\right) \]
它与 FTCS 的主要区别是:
\[ u_i^n \quad\Longrightarrow\quad \frac{1}{2}\left(u_{i+1}^n+u_{i-1}^n\right) \]
这个相邻点平均操作,本质上引入了强数值耗散。
修正方程:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ u_t+cu_x= \frac{c\Delta x}{2\nu}\left(1-\nu^2\right)u_{xx} -\frac{c(\Delta x)^2}{6}\left(1-\nu^2\right)u_{xxx} +\cdots } $} \]
利用上游信息:
\[ u_i^n-u_{i-1}^n \]
耗散来自迎风偏置。
特点:
\[ \text{稳定、耗散中等} \]
用邻点平均替代中心点:
\[ u_i^n\rightarrow\frac{u_{i+1}^n+u_{i-1}^n}{2} \]
耗散来自显式平均。
特点:
\[ \text{稳定、耗散更强} \]
Lax-Wendroff 格式为:
\[ u_i^{n+1}=u_i^n -\frac{\nu}{2}\left(u_{i+1}^n-u_{i-1}^n\right) +\frac{\nu^2}{2}\left(u_{i+1}^n-2u_i^n+u_{i-1}^n\right) \]
其修正方程主导项为:
\[ u_t+cu_x =\frac{c(\Delta x)^2}{6}(\nu^2-1)u_{xxx} +\cdots \]
Lax-Wendroff 的主导误差是三阶导数项,因此更容易表现为数值色散。
Lax-Wendroff 的典型表现:不太粘,但容易“振”。
在 FTCS 基础上加入人工粘性项:
\[ u_i^{n+1}=u_i^n -\frac{\nu}{2}\left(u_{i+1}^n-u_{i-1}^n\right) +\mu_{av}\left(u_{i+1}^n-2u_i^n+u_{i-1}^n\right) \]
其中:
\[ \mu_{av} \]
为无量纲人工粘性强度。
对应原始方程可理解为:
\[ u_t+cu_x=\epsilon_{num}u_{xx}+\cdots \]
其中:
\[ \epsilon_{num}=\mu_{av}\frac{(\Delta x)^2}{\Delta t} \]
人工粘性不是“误差消失”,而是用可控的耗散压制不可控的振荡。
| 格式 | 稳定性 | 主导误差 | 典型表现 |
|---|---|---|---|
| FTCS | 不稳定 | 缺少有效耗散 | 误差放大、最终发散 |
| Upwind | 条件稳定 | 数值耗散 | 波峰降低、波形变宽 |
| Lax | 条件稳定 | 强数值耗散 | 平滑更强、分辨率更低 |
| Lax-Wendroff | 条件稳定 | 数值色散 | 分辨率高,但有振荡 |
| FTCS+人工粘性 | 取决于 \(\mu_{av}\) | 人工耗散 | 抑制振荡,但抹平波形 |
稳定性、耗散、色散、分辨率之间存在不可避免的权衡。
从本算例的波形和振幅曲线看,哪种格式通常表现出最强的数值耗散?
A. FTCS
B. Upwind
C. Lax
D. Lax-Wendroff
参考判断:C
Lax 格式通过邻点平均替代中心点:
\[ u_i^n\rightarrow\frac{1}{2}\left(u_{i+1}^n+u_{i-1}^n\right) \]
因此会引入明显的平滑作用。
对于方波或陡峭梯度,哪种格式更容易在间断附近产生前后振荡?
A. Upwind
B. Lax
C. Lax-Wendroff
D. 人工粘性格式
参考判断:C
Lax-Wendroff 格式耗散较小,主导误差包含三阶导数项:
\[ u_{xxx} \]
因此更容易表现为相速度误差和色散振荡。
同一个对流方程,
不同差分格式实际上对应不同的修正方程。
数值耗散让波形变矮、变宽;
数值色散让不同波长跑得快慢不同;
人工粘性则是人为加入耗散来换取稳定性。
CFD 格式设计的核心矛盾:
稳定性、精度、分辨率与鲁棒性之间的平衡。
对于非定常二维流动,守恒型控制方程可写为:
\[ \frac{\partial U}{\partial t}=-\frac{\partial F}{\partial x}-\frac{\partial G}{\partial y}+J \]
其中:
\[ U=\left[\rho,\rho u,\rho v,\rho\left(e+\frac{V^2}{2}\right)\right] \]
在时间推进过程中,如果流场存在激波、间断或强梯度,纯差分格式往往会产生非物理振荡。
人工粘性的基本思想是:在需要的地方人为加入少量耗散,使计算稳定下来。
在每一个时间步,可向控制方程右端加入人工粘性项:
\[ U_{i,j}^{n+1}=U_{i,j}^{n}+\left(\frac{\partial U}{\partial t}\right)_{i,j}^{n}\Delta t+S_{i,j}^{n} \]
其中 \(S_{i,j}^{n}\) 是人工粘性项。
人工粘性不是物理粘性本身,而是为了改善数值稳定性而引入的数值耗散项。
人工粘性通常不希望在全场均匀加入,而应集中作用于激波、间断和强梯度区域。
一种常用做法是利用压力的二阶差分构造传感器:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \phi_{i,j}^{x}= \frac{\left|p_{i+1,j}^{n}-2p_{i,j}^{n}+p_{i-1,j}^{n}\right|} {p_{i+1,j}^{n}+2p_{i,j}^{n}+p_{i-1,j}^{n}} } $} \]
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \phi_{i,j}^{y}= \frac{\left|p_{i,j+1}^{n}-2p_{i,j}^{n}+p_{i,j-1}^{n}\right|} {p_{i,j+1}^{n}+2p_{i,j}^{n}+p_{i,j-1}^{n}} } $} \]
压力越“弯折”,二阶差分越大,说明该处越可能存在激波或强压缩区,需要更强的人工耗散。
人工粘性项可写为:
\[ \colorbox{yellow}{$\displaystyle \color{black}{ \begin{aligned} S_{i,j}^{n}=&C_x\phi_{i,j}^{x}\left(U_{i+1,j}^{n}-2U_{i,j}^{n}+U_{i-1,j}^{n}\right)\\ &+C_y\phi_{i,j}^{y}\left(U_{i,j+1}^{n}-2U_{i,j}^{n}+U_{i,j-1}^{n}\right) \end{aligned} } $} \]
其中:
\[ \phi_{i,j}^{x}= \frac{\left|p_{i+1,j}^{n}-2p_{i,j}^{n}+p_{i-1,j}^{n}\right|} {p_{i+1,j}^{n}+2p_{i,j}^{n}+p_{i-1,j}^{n}}, \qquad \phi_{i,j}^{y}= \frac{\left|p_{i,j+1}^{n}-2p_{i,j}^{n}+p_{i,j-1}^{n}\right|} {p_{i,j+1}^{n}+2p_{i,j}^{n}+p_{i,j-1}^{n}} \]
人工粘性项中包含两个二阶差分结构:
压力传感器
\[ p_{i+1}-2p_i+p_{i-1} \]
近似反映:
\[ \frac{\partial^2p}{\partial x^2} \]
解变量二阶差分
\[ U_{i+1}-2U_i+U_{i-1} \]
近似反映:
\[ \frac{\partial^2U}{\partial x^2} \]
两个二阶差分相乘,其整体效果相当于在修正方程中加入一个四阶量级的耗散修正,因此常被称为四阶数值耗散表达式。
在预测步中,人工粘性根据已知时刻 \(t\) 的变量计算:
\[ \bar{U}_{i,j}^{n+1} =U_{i,j}^{n} +\left(\frac{\partial U}{\partial t}\right)_{i,j}^{n}\Delta t +S_{i,j}^{n} \]
在校正步中,人工粘性根据预测后的变量重新计算:
\[ U_{i,j}^{n+1} =U_{i,j}^{n} +\left(\frac{\partial U}{\partial t}\right)_{i,j}^{av}\Delta t +\bar{S}_{i,j}^{n+1} \]
人工粘性不是只加一次,而是与时间推进过程耦合:
预测步加一次,校正步再根据更新后的流场重新估计。
人工粘性中有两个可调参数:
\[ C_x,\qquad C_y \]
它们控制 \(x\) 方向和 \(y\) 方向人工耗散的强弱。
过小
振荡难以抑制,激波附近可能出现 wiggles,计算容易失稳。
适中
既能稳定计算,又能较好保持激波、剪切层和分离区结构。
过大
激波被抹宽,流场结构被过度平滑,等效雷诺数降低。
典型范围为(实际计算中通常需要通过数值试验来选择):
\[ 0.01\le C_x,C_y\le0.3 \]
从修正方程角度看,人工粘性相当于在原方程右端加入额外耗散项:
\[ u_t+cu_x=\epsilon_{\mathrm{num}}u_{xx}+\cdots \]
其中 \(\epsilon_{\mathrm{num}}\) 表示等效数值粘性。
人工粘性越大,计算越稳定,但解越容易被抹平;
人工粘性越小,解越锐利,但越容易出现非物理振荡。
因此,人工粘性不是“越大越好”,而是要在稳定性与分辨率之间取得平衡。
人工粘性的一个重要问题是:
它往往具有较强的经验性和人为调参色彩。
问题一:参数依赖
不同流动、不同网格、不同格式下,合适的 \(C_x\)、\(C_y\) 可能不同。
问题二:非局部影响
为了稳定激波附近的计算,可能同时抹平剪切层、分离区和涡结构。
现代高分辨率格式的发展方向是:
只在需要的地方自动加入适量耗散,例如 TVD、ENO/WENO、限制器方法等。
人工粘性通过引入额外数值耗散:
人工粘性是为了稳定计算而人为加入的耗散机制。
它牺牲一部分分辨率,换取更好的稳定性和更少的非物理振荡。
松弛方法是一种有限差分方法,特别适用于求解椭圆型偏微分方程。低速亚声速无粘流通常由椭圆型方程控制(见第3.3.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倍)
👉 本质问题:
👉 解决方案:
让我们回到隐式格式的讨论,以第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方程强制满足连续方程
方法本质
广泛应用于:
👉 压力修正方法 = 用压力调整速度,使流场满足连续方程