一维输运方程:显式与隐式迎风格式实验
状态:由《数值解.pdf》9 页及对应 MATLAB 源码整理。公式、表格和边界方向已复核;本轮没有 MATLAB/Octave 环境,迎风迭代与误差由独立数值复算核对。
1. 迎风方向由传播速度决定
考虑常系数输运方程
\[
u_t+a u_x=0.
\]
特征线满足 \(x-at=\text{常数}\),所以信息沿速度 \(a\) 传播:
- \(a>0\) 时,从左向右传播,入流边界在左端,空间差分取左侧点;
- \(a<0\) 时,从右向左传播,入流边界在右端,空间差分取右侧点。
显式迎风格式可统一写成
\[
u_j^{k+1}=
\begin{cases}
u_j^k-\nu(u_j^k-u_{j-1}^k), & a>0,\\
u_j^k-\nu(u_{j+1}^k-u_j^k), & a<0,
\end{cases}
\qquad
\nu=\frac{a\tau}{h}.
\]
稳定性要求 CFL 数满足 \(|\nu|\le1\)。隐式迎风格式在新时间层使用空间差分,需要解一个三角线性系统;它允许更大的时间步,但通常带来更强的数值耗散。
2. 实验一:速度 \(a=-2\)
问题为
\[
u_t-2u_x=0,
\quad 0< x<1,
\qquad
u(x,0)=1+\sin(2\pi x),
\qquad
u(1,t)=1.
\]
波从右向左传播,因此使用右侧网格点。取
\[
h=0.1,
\qquad
\tau=0.02,
\qquad
|\nu|=\frac{2\tau}{h}=0.4.
\]
显式格式为
\[
u_j^{k+1}=u_j^k+0.4(u_{j+1}^k-u_j^k),
\]
隐式格式为
\[
(1+0.4)u_j^k-0.4u_{j+1}^k=u_j^{k-1}.
\]
精确解沿特征线回溯:当 \(x+2t\le1\) 时来自初值,否则来自右端入流边界,
\[
u(x,t)=
\begin{cases}
1+\sin(2\pi(x+2t)), & x+2t\le1,\\
1, & x+2t>1.
\end{cases}
\]
独立复算得到网格点最大绝对误差:
| 时刻 | 显式迎风 | 隐式迎风 |
|---|---|---|
| \(t=0.1\) | \(0.2263\) | \(0.4095\) |
| \(t=0.5\) | \(0.2986\) | \(0.2524\) |
这个粗网格实验更适合观察传播方向和耗散,不足以单独估计收敛阶。显式和隐式格式都会把正弦波峰逐渐抹平,边界影响则从右端向左推进。
3. 实验二:速度 \(a=1\)
问题为
\[
u_t+u_x=0,
\quad x>0,
\qquad
u(x,0)=|x-1|,
\qquad
u(0,t)=1.
\]
波从左向右传播,取左侧迎风点。显式实验使用 \(h=\tau=0.5\),因此 \(\nu=1\):
\[
u_j^{k+1}=u_{j-1}^k.
\]
每一步恰好把离散数据平移一个网格,所以在给定网格和整数输出时刻上,显式结果与精确特征线解一致,独立复算的网格点误差为零。这是 \(\nu=1\) 的特殊现象,不代表一般迎风格式没有截断误差。
隐式实验使用 \(h=0.5,\tau=1\),即 \(\nu=2\):
\[
(1+\nu)u_j^{k+1}-\nu u_{j-1}^{k+1}=u_j^k.
\]
它仍能稳定推进,但折点被明显平滑。这展示了“稳定”与“精确”是不同概念:隐式格式不发散,不等于它不会产生较大的相位误差或数值耗散。
4. 可运行源码
两个脚本都会输出数值解、精确解,并绘制指定时间层的比较图。运行时需要支持脚本内局部函数和 table 的 MATLAB 版本。
5. 从实验回到理论
这个实验把数值 PDE 的几条主线放在一起:
- 特征线决定信息从哪里来,因此决定迎风方向与入流边界;
- CFL 条件比较真实依赖域和数值依赖域;
- 显式格式的步长受到稳定性限制;
- 隐式格式通过解线性系统换取稳定性,但可能更耗散;
- 与精确解比较只能说明当前网格误差,要判断阶数还需要系统加密网格。