跳转至

一维输运方程:显式与隐式迎风格式实验

状态:由《数值解.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 的几条主线放在一起:

  1. 特征线决定信息从哪里来,因此决定迎风方向与入流边界;
  2. CFL 条件比较真实依赖域和数值依赖域;
  3. 显式格式的步长受到稳定性限制;
  4. 隐式格式通过解线性系统换取稳定性,但可能更耗散;
  5. 与精确解比较只能说明当前网格误差,要判断阶数还需要系统加密网格。