流線・流管・流跡線の定義と可視化

流体の運動を理解するうえで、「流れをどのように表現するか」は基本的かつ重要な問題です。流線(streamline)、流跡線(pathline)、脈線(streakline)は、流れを可視化・記述するための3つの基本的な線です。

本記事では、それぞれの定義と数学的表現を解説し、定常流では3つの線が一致することを示します。最後にPythonで流線と流跡線を可視化します。

本記事の内容

  • 流線の定義と微分方程式
  • 流管の概念
  • 流跡線の定義
  • 脈線の定義
  • 定常流における一致
  • Pythonでの可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

速度場の記述

オイラー的記述とラグランジュ的記述

流体の運動を記述するには2つの立場があります。

オイラー的記述(Eulerian description): 空間中の固定点 $\bm{x}$ における速度場 $\bm{v}(\bm{x}, t)$ として記述する方法です。

ラグランジュ的記述(Lagrangian description): 個々の流体粒子を追跡し、その位置 $\bm{X}(t)$ の時間変化として記述する方法です。

流線はオイラー的記述に基づく概念であり、流跡線はラグランジュ的記述に基づく概念です。


流線(Streamline)

定義

流線 とは、ある瞬間 $t$ において、各点での速度ベクトル $\bm{v}(\bm{x}, t)$ に接する曲線です。

イメージとしては、ある瞬間に流れの場全体を「写真」で切り取ったとき、各点での速度の向きを結んだ線が流線です。

微分方程式

2次元の流れ $\bm{v} = (u, v)$ を考えます。流線上の微小変位 $(dx, dy)$ は速度ベクトルに平行でなければなりません。

$$ \frac{dx}{u} = \frac{dy}{v} $$

3次元 $\bm{v} = (u, v, w)$ では、

$$ \boxed{\frac{dx}{u} = \frac{dy}{v} = \frac{dz}{w}} $$

あるいはベクトル表記で、流線のパラメータを $s$ として、

$$ \frac{d\bm{x}}{ds} \times \bm{v}(\bm{x}, t) = \bm{0} $$

流線の例: 一様流

速度場 $\bm{v} = (U, 0)$($U$ は定数)の場合を考えます。

$$ \frac{dx}{U} = \frac{dy}{0} $$

$dy = 0$ より $y = \text{const.}$ です。つまり流線は $x$ 軸に平行な直線群になります。

流線の例: 角部の流れ

速度場 $\bm{v} = (ax, -ay)$($a > 0$)の場合を考えます。

$$ \frac{dx}{ax} = \frac{dy}{-ay} $$

$$ \frac{dx}{x} = -\frac{dy}{y} $$

両辺を積分すると、

$$ \ln|x| = -\ln|y| + C $$

$$ xy = \text{const.} $$

流線は双曲線 $xy = C$ となります。これは直角の角を回る流れを表しています。


流管(Stream Tube)

流管とは、閉曲線上の各点を通る流線の集合で構成される管状の面です。定義上、流線は速度ベクトルに接しているため、流管の側面を通って流体が出入りすることはありません

この性質は連続の方程式(質量保存則)を適用する際に重要な役割を果たします。非圧縮性流体の定常流では、流管の断面積 $A$ と流速 $v$ の間に次の関係が成り立ちます。

$$ A_1 v_1 = A_2 v_2 $$

流管が細くなると流速が増加し、太くなると流速が減少します。


流跡線(Pathline)

定義

流跡線 とは、一つの流体粒子が時間とともに描く軌跡です。ラグランジュ的な見方に対応します。

イメージとしては、流体粒子に目印(トレーサー)を付けて時間を追って観察したときの軌跡です。

微分方程式

流体粒子の位置 $\bm{X}(t)$ は次の常微分方程式に従います。

$$ \boxed{\frac{d\bm{X}}{dt} = \bm{v}(\bm{X}(t), t)} $$

初期条件 $\bm{X}(t_0) = \bm{X}_0$ を指定すると、流跡線が一意に定まります。


脈線(Streakline)

定義

脈線 とは、過去のある期間に同一の空間点を通過したすべての流体粒子が、現在の時刻 $t$ に占める位置を結んだ線です。

イメージとしては、ある固定点からインクを連続的に注入したときに、流体中に描かれるインクの軌跡が脈線です。実験的に煙や染料で流れを可視化すると観測されるのは脈線です。


定常流における一致

定常流の定義

速度場が時間に依存しない、すなわち $\bm{v}(\bm{x}, t) = \bm{v}(\bm{x})$ であるとき、その流れを 定常流(steady flow) と呼びます。

一致の証明

定常流では、流線・流跡線・脈線の3つは すべて一致 します。

流線の微分方程式は、

$$ \frac{d\bm{x}}{ds} = \bm{v}(\bm{x}) $$

流跡線の微分方程式は、

$$ \frac{d\bm{X}}{dt} = \bm{v}(\bm{X}) $$

定常流では $\bm{v}$ が時間に陽に依存しないため、パラメータ $s$ を $t$ と同一視すれば、両者は同一の微分方程式になります。したがって、同じ初期点を通る流線と流跡線は一致します。

脈線についても、定常流ではどの時刻に放出された粒子も同じ速度場のもとで運動するため、同一の流線上に乗り続けます。

非定常流 では、これらの3つの線は一般に異なります。


Pythonでの可視化

定常流の流線

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# --- (1) 一様流 + 湧き出しの流線 ---
x = np.linspace(-3, 3, 400)
y = np.linspace(-3, 3, 400)
X, Y = np.meshgrid(x, y)

U_inf = 1.0  # 一様流速
m = 2.0      # 湧き出しの強さ
r2 = X**2 + Y**2 + 1e-10

u = U_inf + m * X / (2 * np.pi * r2)
v = m * Y / (2 * np.pi * r2)

axes[0].streamplot(X, Y, u, v, density=1.5, color='b', linewidth=0.8)
axes[0].set_xlabel('$x$', fontsize=12)
axes[0].set_ylabel('$y$', fontsize=12)
axes[0].set_title('Streamlines: Uniform flow + Source', fontsize=13)
axes[0].set_xlim(-3, 3)
axes[0].set_ylim(-3, 3)
axes[0].set_aspect('equal')
axes[0].grid(True, alpha=0.3)

# --- (2) 角部の流れ (xy = const.) ---
u2 = X
v2 = -Y

axes[1].streamplot(X, Y, u2, v2, density=1.5, color='r', linewidth=0.8)
axes[1].set_xlabel('$x$', fontsize=12)
axes[1].set_ylabel('$y$', fontsize=12)
axes[1].set_title('Streamlines: Corner flow ($u=x, v=-y$)', fontsize=13)
axes[1].set_xlim(-3, 3)
axes[1].set_ylim(-3, 3)
axes[1].set_aspect('equal')
axes[1].grid(True, alpha=0.3)

# --- (3) 非定常流での流線 vs 流跡線 ---
# 非定常速度場: u = cos(t), v = sin(t)(回転する一様流)
from scipy.integrate import solve_ivp

# ある時刻 t0 での流線
t0 = 0.0
u_t0 = np.cos(t0) * np.ones_like(X)
v_t0 = np.sin(t0) * np.ones_like(Y)

axes[2].streamplot(X, Y, u_t0, v_t0, density=1.0, color='blue',
                   linewidth=0.8, label='Streamline at $t=0$')

# 流跡線: t=0 から t=2π まで粒子を追跡
def velocity(t, pos):
    return [np.cos(t), np.sin(t)]

t_span = (0, 2 * np.pi)
t_eval = np.linspace(0, 2 * np.pi, 500)

# 複数の初期位置から流跡線を計算
for x0 in [-2, -1, 0, 1, 2]:
    sol = solve_ivp(velocity, t_span, [x0, 0], t_eval=t_eval)
    axes[2].plot(sol.y[0], sol.y[1], 'r-', lw=1.5)

axes[2].plot([], [], 'r-', lw=1.5, label='Pathlines ($0 \\leq t \\leq 2\\pi$)')
axes[2].set_xlabel('$x$', fontsize=12)
axes[2].set_ylabel('$y$', fontsize=12)
axes[2].set_title('Unsteady: Streamline vs Pathline', fontsize=13)
axes[2].set_xlim(-4, 4)
axes[2].set_ylim(-3, 3)
axes[2].set_aspect('equal')
axes[2].legend(fontsize=9)
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

左のグラフでは、一様流と湧き出しを重ね合わせた流線を示しています。原点付近で流れが分岐する様子が確認できます。

中央のグラフでは、角部の流れ($u = x, v = -y$)の流線を示しています。流線は双曲線 $xy = \text{const.}$ になり、直角の角を回る流れを表現しています。

右のグラフでは、非定常流($u = \cos t, v = \sin t$)における流線と流跡線の違いを示しています。$t = 0$ の流線(青)は水平の直線ですが、流跡線(赤)は時間とともに速度の向きが変わるため曲線を描き、両者は一致しません。


まとめ

本記事では、流体の流れを記述する基本的な線について解説しました。

  • 流線: ある瞬間の速度場に接する曲線。$dx/u = dy/v = dz/w$
  • 流管: 閉曲線上の流線の集合。側面を通る流出入はない
  • 流跡線: 個々の流体粒子が描く軌跡。$d\bm{X}/dt = \bm{v}(\bm{X}, t)$
  • 脈線: 同一点を通過した粒子の現在位置を結んだ線
  • 定常流では3つの線は一致するが、非定常流では一般に異なる

次のステップとして、以下の記事も参考にしてください。