3. 瞬态热传导显式与隐式时间推进对比

问题设定与离散框架

取一根长度 L = 0.1 m 的均质导热棒,热扩散率 α = 1.0×10⁻⁵ m²/s,初始温度均匀为 T₀ = 20 °C,两端固定为 T_L = T_R = 100 °C。控制方程为:

∂T/∂t = α ∂²T/∂x²

空间采用二阶中心差分,节点数 N = 21(含两端),Δx = L/(N−1) = 5 mm。时间推进分别使用显式欧拉与隐式欧拉,二者共享同一空间离散矩阵,仅时间项处理不同:

  • 显式欧拉:Tⁿ⁺¹ = Tⁿ + Δt·α·(A·Tⁿ + b),无需解线性方程组,但受稳定性约束。
  • 隐式欧拉:(I − Δt·α·A)·Tⁿ⁺¹ = Tⁿ + Δt·α·b,每步需解三对角系统,但无条件稳定。

其中 A 为内部节点的二阶差分算子(除以 Δx²),b 承载边界温度贡献。显式格式的稳定性条件为 Δt ≤ Δx²/(2α) = 1.25 s,这是本节对比的核心参数。

显式与隐式推进的完整实现

下面给出可直接运行的 Python 实现,使用 NumPy 构建三对角矩阵并用 scipy.linalg.solve_banded 求解隐式步。代码同时输出两种格式在相同物理时间下的温度场与耗时,便于对比。

import numpy as np
from scipy.linalg import solve_banded
import time

# ---- 物理与网格参数 ----
L, alpha = 0.1, 1.0e-5
N = 21
dx = L / (N - 1)
T0, TL, TR = 20.0, 100.0, 100.0
t_end = 600.0            # 物理模拟总时长 (s)

# ---- 空间离散:内部节点 i=1..N-2 ----
n = N - 2
r = alpha / dx**2
main = -2.0 * r * np.ones(n)
off  = r * np.ones(n - 1)
A = np.diag(main) + np.diag(off, 1) + np.diag(off, -1)
b = np.zeros(n)
b[0]  += r * TL          # 左边界贡献
b[-1] += r * TR          # 右边界贡献

def init_field():
    T = np.full(N, T0)
    T[0], T[-1] = TL, TR
    return T

def explicit(dt):
    T = init_field()
    steps = int(round(t_end / dt))
    t0 = time.perf_counter()
    for _ in range(steps):
        Ti = T[1:-1]
        T[1:-1] = Ti + dt * (A @ Ti + b)
    return T, time.perf_counter() - t0, steps

def implicit(dt):
    T = init_field()
    steps = int(round(t_end / dt))
    # 构造带状矩阵 (I - dt*A),上/下带宽各 1
    ab = np.zeros((3, n))
    ab[0, 1:]  = -dt * off      # 上对角线
    ab[1, :]   = 1.0 - dt * main
    ab[2, :-1] = -dt * off      # 下对角线
    t0 = time.perf_counter()
    for _ in range(steps):
        rhs = T[1:-1] + dt * b
        T[1:-1] = solve_banded((1, 1), ab, rhs)
    return T, time.perf_counter() - t0, steps

# ---- 对比运行 ----
dt_exp = 1.0                 # 满足 1.25 s 稳定上限
dt_imp = 10.0                # 隐式可取更大步长
Te, te, se = explicit(dt_exp)
Ti, ti, si = implicit(dt_imp)
print(f"显式: dt={dt_exp}s, 步数={se}, 耗时={te:.4f}s, 中点温度={Te[N//2]:.3f}°C")
print(f"隐式: dt={dt_imp}s, 步数={si}, 耗时={ti:.4f}s, 中点温度={Ti[N//2]:.3f}°C")

运行后应观察到:显式在 dt = 1.0 s 时稳定收敛,中点温度接近稳态值约 60 °C;若把 dt_exp 改为 1.5 s(超过 1.25 s 上限),温度会迅速振荡发散。隐式在 dt = 10 s 时仍稳定,但单步计算量更大。这正是两种格式在稳定性与效率上的本质差异。

稳定性、效率与精度的对比判读

下图把两种格式的关键差异组织为参数关系与结果判读视图:左侧是稳定性约束的来源,右侧是相同物理时长下的步数与耗时对比,底部给出精度判读依据。

一维瞬态热传导:显式 vs 隐式时间推进 稳定性约束(显式) Δt ≤ Δx² / (2α) Δx = 5 mm, α = 1.0×10⁻⁵ m²/s → Δt_max = 1.25 s Δt = 1.0 s:稳定,温度单调趋稳 Δt = 1.5 s:振荡发散,数值失效 隐式格式:无此约束,任意 Δt 稳定 相同物理时长 t_end = 600 s 显式 Δt=1.0 s 600 步 隐式 Δt=10 s 60 步 显式单步廉价,隐式单步需解三对角系统 步数比 10:1,但隐式每步成本更高 精度与结果判读 稳态一致性 t → ∞ 时两者均收敛到 线性温度分布 中点 ≈ 60 °C ✓ 稳态精度一致 瞬态精度 显式:一阶时间精度 隐式:一阶时间精度 大 Δt 时隐式瞬态偏慢 ⚠ 大 Δt 引入时间误差 选型建议 短时/精细瞬态:显式 长时/刚性:隐式 验证:与解析级数解比对 → 按 Δt 上限与精度需求取舍

判读要点:两种格式在稳态极限下给出相同温度场,差异集中在瞬态阶段与稳定性边界。显式格式的 Δt_max = 1.25 s 由网格与材料参数直接决定,网格加密时该上限按 Δx² 缩小,成本急剧上升;隐式格式虽无条件稳定,但 Δt 过大时一阶时间离散会引入明显的时间滞后误差,需通过步长收敛性检查确认精度可接受。

验证建议:将数值解与一维瞬态热传导的解析级数解在若干时刻比对,分别记录显式 Δt = 0.5/1.0 s 与隐式 Δt = 2/10 s 下的中点温度误差,可直观看到显式受稳定性限制、隐式受时间精度限制的不同误差来源。
显式格式中若误用 Δt > Δx²/(2α),温度会以交替符号振荡并快速溢出,这不是物理现象而是数值不稳定;隐式格式不会发散,但过大步长可能掩盖快速瞬态过程,导致结果“稳定却不准”。