柯朗—弗里德里希斯—列维条件
柯朗—弗里德里希斯—列维条件(Courant–Friedrichs–Lewy condition,简称CFL条件)比较微分方程的信息传播速度与离散格式在网格上传递信息的速度。对显式双曲问题格式,要在网格细化时得到正确解,数值依赖域必须能够覆盖相应的物理依赖域。由此导出的时间步长限制是必要条件;它是否也足以保证稳定,还取决于具体方程和格式。
考虑一维线性输运方程 ,速度 为常数。解沿特征线平移,即 。设空间步长为 、时间步长为 ,无量纲Courant数为 。它表示一步内物理信号跨过多少个网格间距。
迎风格式的信息来源
在网格 上,以 近似真解。对正速度使用左侧差分,得到显式迎风格式 一步只读取当前位置和左邻居;两步至多读取 ,归纳可知,经过 步只可能使用初始网格点 的数据。数值信息最远每步向右传播一个网格间距。
真解在 却读取初始位置 。要让它位于数值依赖范围 内,必须有 对这里的正速度,左侧非负自动成立,所以常写为 。[1]
这个必要性的含义可用两组初值说明。若在细化过程中物理脚点始终位于数值依赖域之外,就可选两组初值,使它们在数值依赖区间上完全相同,在物理脚点附近却不同。格式因读取相同数据给出相同输出,两个真解在目标点却不同,因此不可能对两组初值都收敛到正确解。这是依赖域条件的理由,不是把某张图上看见的一个脚点当作全体格式的稳定性证明。
对迎风格式成立的稳定性证明
当 时,更新是两个旧值的凸组合,所以 对两个数值解之差 使用同一更新式,三角不等式给出 对 取最大值,再逐步迭代,得到 。这证明在无限网格或周期边界下,初始扰动的最大幅度不增长;一般边界还要正确控制边界输入。
取傅里叶模式 ,可求得放大因子 所以在本格式中, 也恰好保证所有模式不放大。若 ,交替正负模式 每步乘 ,幅度逐步乘 ,直接显示失稳。 时更新为 ,恰好每步平移一格。
六个网格值的手算与程序
在周期网格上取初值 ,末端左邻居按周期回到数组末项。取 ,第一步为 第二步为 。每步数值和仍为四,最大值未超过初始的二。和守恒来自将更新式对全部周期索引求和:两个旧值之和都等于同一个旧数组总和。
下面输入周期网格值、Courant数和步数,返回新的数组;不改写输入,只接受有限实数值以及稳定范围内的 。它求解的是已说明的正速度迎风更新,不是通用偏微分方程求解器。
from math import isfinite
def periodic_upwind(values, nu, steps):
state = [float(x) for x in values]
nu = float(nu)
if len(state) < 2 or not all(isfinite(x) for x in state):
raise ValueError("need at least two finite grid values")
if not isfinite(nu) or not 0 <= nu <= 1:
raise ValueError("Courant number outside [0,1]")
if type(steps) is not int or steps < 0:
raise ValueError("steps must be a nonnegative integer")
for _ in range(steps):
old = state
state = [(1 - nu) * old[j] + nu * old[j - 1]
for j in range(len(old))]
return state
initial = [0, 1, 2, 1, 0, 0]
assert periodic_upwind(initial, 0.5, 1) == [0, 0.5, 1.5, 1.5, 0.5, 0]
assert periodic_upwind(initial, 0.5, 2) == [0, 0.25, 1, 1.5, 1, 0.25]
assert periodic_upwind(initial, 1, 1) == [0, 0, 1, 2, 1, 0]
assert periodic_upwind(initial, 0, 3) == initial
assert initial == [0, 1, 2, 1, 0, 0]
print(periodic_upwind(initial, 0.5, 2))
每步对 个网格值各计算一次凸组合, 步时间为 ,仅保存新旧数组,空间为 。若 ,应改用右侧邻居;只把负速度代进上述左迎风式会使权重超出凸组合范围。
CFL条件不等于通用稳定性条件
变式。 将空间差分改为中心差分,得到前向时间中心空间格式 它的数值依赖范围每步向两侧各扩一格,因此同样可以满足 的几何条件。取保持固定非零 的双曲细化路径,其放大因子为 ;选择 的网格模式,单步幅度乘 。在固定正时间 内,步数 随细化趋于无穷,累计放大 无界,所以沿这条满足几何CFL的细化路径仍不稳定。必要的依赖域覆盖没有保证该格式控制扰动。这里用到了固定非零Courant数;仅有某一步的放大大于一并不足以排除所有细化路径,例如让 有界时,累计放大可有固定时间上的有界增长。
扩散方程也有显式时间步限制,典型尺度为 ,其传播机制和放大因子与输运不同;不能只把波速公式机械换一个符号就涵盖全部方程。
参考文献
- ↑ Tobin A. Driscoll、Richard J. Braun:Fundamentals of Numerical Computation: Upwinding and stability,数值与精确依赖域、CFL条件及迎风方向。访问日期:2026-10-22。