← コード一覧に戻る

輸送方程式_風上差分1次精度近似.py

1次元移流方程式の風上差分法(空間1次精度)— クーラン数による安定性の比較  |  偏微分方程式 移流方程式 風上差分 クーラン数 subplots

概要

1次元移流方程式(線形移流方程式)を風上差分法(Upwind scheme)で解くコード。 空間差分は1次精度の風上差分、時間差分は前進オイラー法(陽的1次精度)を用いる。 Δt を 0.05 / 0.1 / 0.2 の3種類に変えてクーラン数(Courant数)が解の安定性に与える影響を横並びグラフで比較する。

使用ライブラリ

ライブラリ用途
numpy配列演算・初期条件の構築
matplotlib.pyplotグラフ描画(subplots による横並び比較)

物理背景

対象方程式は1次元線形移流方程式(スカラー輸送方程式):

∂q/∂t + c · ∂q/∂x = 0 (c = 1 : 移流速度)

この方程式は流体中のスカラー量(温度・濃度・放射性核種等)が速度 c で上流から下流へ流れる現象を表す。 解析解は初期波形が形を変えずに x 方向へ速度 c で平行移動するものとなる。

クーラン数(Courant–Friedrichs–Lewy 数)

風上差分法の安定条件は CFL 条件で与えられる:

CFL = c · Δt / Δx ≤ 1

計算手法

項目内容
空間差分1次精度風上差分(後退差分):(q[j] − q[j-1]) / Δx
時間積分前進オイラー法(陽的1次精度)
空間格子Δx = 0.1、格子点数 jmax = 21
初期条件ステップ関数(x < 1.0 で q=1、x ≥ 1.0 で q=0)
境界条件両端固定(ループ外で更新なし)
比較ケースΔt = 0.05(CFL=0.5)、0.1(CFL=1.0)、0.2(CFL=2.0)

差分式

q[j]n+1 = q[j]n − c · Δt/Δx · (q[j]n − q[j-1]n)

コードの流れ

  1. パラメータ設定:c=1、Δx=0.1、jmax=21、nmax=600
  2. 座標配列 x の生成(0 〜 2.0)
  3. ステップ関数の初期条件 q_init を設定
  4. subplots でΔt=0.05 / 0.1 / 0.2 の3パネルを並べて描画
  5. 各パネルで nmax ステップ分時間発展し、t=0.2 / 0.4 / 0.6 時点をプロット
  6. タイトルにΔtとCFL数を表示し、グリッド・凡例を付与して出力

精度・安定性

コード全文

import numpy as np
import matplotlib.pyplot as plt

c=1
#dt=0.05
dx=0.1

jmax=21
nmax=600

x=np.linspace(0,dx*(jmax-1),jmax)

q_init=np.zeros(jmax)
for j in range(jmax):
   if(j<jmax/2):
       q_init[j]=1
   else:
       q_init[j]=0

fig, axes = plt.subplots(1, 3, figsize=(21, 7), dpi=100)
plt.rcParams["font.size"]=25

plot_times = [0.2, 0.4, 0.6]

for ax, dt in zip(axes, [0.05, 0.1, 0.2]):
    q=q_init.copy()
    ax.plot(x,q,marker='o',lw=2,label='t=0.0')
    for n in range(1,1+nmax):
        qold=q.copy()
        for j in range(1,jmax-1):
            q[j]=qold[j]-dt*c*(qold[j]-qold[j-1])/(dx)
        if any(np.isclose(n*dt, pt) for pt in plot_times):
            ax.plot(x,q,marker='o',lw=2,label=f't={n*dt:.2g}')

    ax.grid(color='black',linestyle='dashed',linewidth=0.5)
    ax.set_xlabel('x')
    ax.set_ylabel('q')
    ax.set_ylim([0,1.5])
    ax.set_title(f'dt = {dt},Courant={dt*c/dx:.2g}')
    ax.legend()
plt.tight_layout()
plt.show()

グラフ結果

風上差分法による移流方程式の数値解(CFL数比較)

左:CFL=0.5(Δt=0.05)安定・数値拡散あり / 中:CFL=1.0(Δt=0.1)安定・数値拡散最小 / 右:CFL=2.0(Δt=0.2)不安定・発散

キーワード

移流方程式 風上差分法 Upwind Scheme クーラン数(CFL数) 数値拡散 数値粘性 前進オイラー法 安定条件 偏微分方程式 ステップ関数