工場の煙突から立ち上る煙の流れを想像してください。ある瞬間に煙全体を写真に収めると、煙は一本の滑らかな曲線を描いているように見えます。一方、煙の中の一つの粒子だけに注目してその動きを長時間追跡すると、また異なる軌跡が得られるでしょう。さらに、煙突の口を次々と通過する粒子を同時に観察すると、それらが描く曲線は先の2つとも異なるかもしれません。
この3つの「線」こそが、流体力学における流線(streamline)、流跡線(pathline)、流脈線(streakline) です。これらは流れを可視化し理解するための最も基本的な概念でありながら、混同されやすいテーマでもあります。
風が一定方向に吹いているような単純な状況(定常流)では、3つの線はすべて一致します。しかし、風向きが時間とともに変化するような状況(非定常流)では、3つの線はまったく異なる形状になります。この違いを正しく理解していないと、実験で得られた可視化画像の解釈を誤ったり、数値シミュレーション結果の読み取りを間違えたりする危険があります。
流線・流跡線・流脈線の理解は、以下のような場面で直接的に役立ちます。
- 風洞実験やCFD(数値流体力学) — 煙線法、トレーサー粒子法、PIV(粒子画像流速測定法)で得られる可視化データが、流線・流跡線・流脈線のいずれに対応するかを正しく判断する必要があります。
- 気象予測・海洋学 — 台風の進路予測や海流の解析では、非定常流れ場における粒子輸送の理解が不可欠であり、流跡線と流線の違いが予報精度に直結します。
- 航空機・ロケットの空力設計 — 翼まわりの流れを可視化して剥離点や遷移点を特定する際に、どの種類の「線」を見ているのかを意識する必要があります。
本記事の内容
- 流線・流跡線・流脈線の直感的な違い(煙・写真・動画の比喩)
- 流線の数学的定義(速度場との接線条件と微分方程式)
- 流跡線の定義(個々の流体粒子の軌跡)
- 流脈線の定義(同じ点を通過した粒子の集合が描く曲線)
- 定常流では3つの線が一致することの数学的証明
- 非定常流における3つの線の違いの具体例
- Pythonによる4種類の可視化(定常流の流線、非定常流での3線比較、渦流れの流線、時間発展する流れ場の可視化)
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 流体の性質(粘性・圧縮性・表面張力) — 流体の基本的な定義と性質
- ベクトル場 — 速度場をベクトル場として捉える考え方
- 微分方程式入門 — 流線の定義で常微分方程式を使います
- 連続の方程式(質量保存則) — 流れ場の基本法則
- 渦度と循環 — 渦流れの例で使います
速度場の復習 — 流れを記述する2つの方法
オイラー的記述とラグランジュ的記述
3つの線の違いを正確に理解するために、まず流体の運動を記述する2つの立場を押さえておきましょう。
オイラー的記述(Eulerian description) は、空間の各点に固定した観測者が、その点を通過する流体の速度を時刻ごとに記録する立場です。これは「川の岸辺に立って水の流れを観察する」イメージに対応します。速度場は位置 $\bm{x} = (x, y, z)$ と時刻 $t$ の関数として
$$ \bm{v} = \bm{v}(\bm{x}, t) = (u(x,y,z,t), \, v(x,y,z,t), \, w(x,y,z,t)) $$
のように表されます。ここで $u, v, w$ はそれぞれ $x, y, z$ 方向の速度成分です。
一方、ラグランジュ的記述(Lagrangian description) は、個々の流体粒子に名前(ラベル)を付けて、その粒子がどこに移動するかを追跡する立場です。これは「川に浮かべたボートに乗って流される」イメージです。初期位置 $\bm{x}_0$ の流体粒子の位置を時刻 $t$ の関数として $\bm{X}(\bm{x}_0, t)$ と書きます。
この2つの記述の違いこそが、流線(オイラー的)と流跡線(ラグランジュ的)の違いの根源です。ナビエ・ストークス方程式はオイラー的記述で書かれることが一般的ですが、物質微分(実質微分)を通じてラグランジュ的な見方とつながっています。
定常流と非定常流
速度場 $\bm{v}(\bm{x}, t)$ が時刻 $t$ に依存しないとき、すなわち $\partial \bm{v} / \partial t = \bm{0}$ が成り立つとき、その流れを定常流(steady flow) と呼びます。定常流では、空間の各点における流速の大きさと方向が時間によらず一定です。
一方、$\partial \bm{v} / \partial t \neq \bm{0}$ のとき、流れは非定常流(unsteady flow) と呼ばれます。風向きが変わるような流れや、心臓の拍動による血流、エンジン内部の燃焼ガスの流れなどが典型例です。
定常流か非定常流かによって、流線・流跡線・流脈線の相互関係が大きく変わります。この点が本記事の核心です。
まず最初に、3つの線の直感的なイメージを確認しましょう。
3つの線の直感的な理解 — 煙・写真・動画の比喩
数学的な定義に入る前に、日常的な比喩で3つの線のイメージをつかんでおきましょう。工場の煙突から流れる煙を例にとります。
流線 = 「ある瞬間のスナップショット写真」
流線(streamline) は、ある瞬間に流れ場全体を凍結させて撮影した写真に写る線です。各点で速度ベクトルに接線を持つ曲線であり、「今この瞬間、流体はどちらの方向に向かっているか」を空間全体で示します。
重要なのは、流線はあくまである一瞬の速度場の情報だけから決まるということです。過去に粒子がどう動いたか、未来にどう動くかは関係ありません。
流跡線 = 「一つの粒子を追いかける長時間露光写真」
流跡線(pathline) は、一つの特定の流体粒子がたどる実際の軌跡です。粒子に蛍光塗料を塗って暗闇の中で長時間露光撮影をすれば、粒子が通った経路が一本の光の線として写ります。これが流跡線です。
流跡線は時間の経過にわたる情報を含んでおり、粒子の位置の時間変化そのものです。ニュートン力学で質点の運動を追跡するのと同じ発想です。
流脈線 = 「煙突から連続的に出てくる煙の形」
流脈線(streakline) は、過去のある時点から現在までに同じ一点を通過したすべての流体粒子が、現在いる位置をつないだ曲線です。煙突の口を通過した煙の粒子が空気中でどのように分布しているかを見ると、それが流脈線になります。
これは風洞実験で煙線法(smoke wire法)を使って可視化した際に観察される線と同じです。実験で最も直接的に目に見える線であり、工学的に重要な概念です。
一言でまとめると
| 線の種類 | 日本語 | 英語 | 一言での説明 | 比喩 |
|---|---|---|---|---|
| 流線 | りゅうせん | streamline | ある瞬間、各点で速度に接する曲線 | スナップショット写真 |
| 流跡線 | りゅうせきせん | pathline | 一つの粒子が時間とともに描く軌跡 | 粒子の長時間露光写真 |
| 流脈線 | りゅうみゃくせん | streakline | 同じ点を通過した粒子の現在位置を結ぶ線 | 煙突から出る煙の形 |
定常流(風が一定の場合)では、写真を撮っても、粒子を追いかけても、煙突の煙を見ても、すべて同じ線が得られます。なぜなら、速度場が時間変化しないので、過去も現在も同じルールで流体が動いているからです。しかし、非定常流(風向きが変わる場合)では、これらは一般に異なります。
では、この直感を数学的に定式化していきましょう。
流線の数学的定義
速度場との接線条件
流線(streamline)とは、ある時刻 $t$ において、流れ場の各点で速度ベクトルに接する曲線です。この定義は、ベクトル場の積分曲線(integral curve)に他なりません。
2次元流れを考えます。速度場を $\bm{v} = (u(x,y,t), \, v(x,y,t))$ とし、流線上の微小な線素ベクトルを $d\bm{l} = (dx, dy)$ とします。「流線上の各点で速度ベクトルが接線方向を向く」という条件は、$d\bm{l}$ と $\bm{v}$ が平行であることを意味します。
2つのベクトルが平行であるための条件は、外積がゼロになることです。2次元では、これは次の式で表されます。
$$ u \, dy – v \, dx = 0 $$
これを書き直すと、流線の微分方程式が得られます。
$$ \boxed{\frac{dx}{u(x,y,t)} = \frac{dy}{v(x,y,t)}} $$
ここで極めて重要なのは、時刻 $t$ はパラメータとして固定されているということです。流線は「ある瞬間」の速度場から決まるものであり、時間とともに流線の形は変わり得ます。
3次元への拡張
3次元の速度場 $\bm{v} = (u, v, w)$ に対しては、接線条件は次のように拡張されます。
$$ \frac{dx}{u(x,y,z,t)} = \frac{dy}{v(x,y,z,t)} = \frac{dz}{w(x,y,z,t)} $$
これは、パラメータ $s$ を用いて次のようにも書けます。
$$ \frac{d\bm{x}}{ds} = \bm{v}(\bm{x}(s), t) \quad (t \text{ は固定}) $$
$s$ は流線に沿った媒介変数であり、時刻 $t$ とは独立であることに注意してください。
具体例: 2次元定常流の流線
流線の求め方を具体例で確認しましょう。速度場が
$$ u = x, \quad v = -y $$
で与えられる場合を考えます(時間依存性がないため定常流です)。この流れは原点を中心とした湧き出し的な流れで、$x$ 方向に伸び、$y$ 方向に縮む伸張流(extensional flow) と呼ばれるものです。
流線の微分方程式に代入すると、
$$ \frac{dx}{x} = \frac{dy}{-y} $$
両辺をそれぞれ積分します。
$$ \int \frac{dx}{x} = \int \frac{dy}{-y} $$
$$ \ln|x| = -\ln|y| + C_1 $$
両辺の指数をとると、次の流線の方程式が得られます。
$$ \boxed{xy = C} $$
ここで $C$ は各流線に固有の定数です。これは双曲線の族であり、$x$ 軸と $y$ 軸が漸近線となります。この結果は、ポテンシャル流れにおけるよどみ点流れの流線に対応しています。
流線の重要な性質
流線にはいくつかの重要な性質があります。
-
流線は交差しない(通常の点では)。もし2本の流線が一点で交わるとすると、その点で速度ベクトルが2つの異なる方向を同時に持つことになり、速度場の一価性に矛盾します。ただし、速度がゼロになるよどみ点(stagnation point) では、速度の方向が定義できないため、流線が交差(分岐・合流)することがあります。
-
流線を横切る流体の流れはない。流線は各点で速度に接しているので、速度の法線方向成分はゼロです。したがって、流体は流線に沿って流れ、流線を横切ることはありません。
-
非定常流では流線は時刻ごとに異なるパターンを描く。速度場が時間変化すれば、同じ空間の点でも瞬間ごとに流線の形が変わります。
ここまでで、流線が「ある瞬間の速度場の構造」を捉える概念であることがわかりました。次に、個々の流体粒子が実際にどのような軌跡をたどるかを記述する流跡線を見ていきましょう。
流跡線の数学的定義
粒子の運動方程式
流跡線(pathline)とは、個々の流体粒子が時間の経過とともにたどる実際の軌跡です。ラグランジュ的な記述に対応するこの概念は、質点力学で物体の運動を追跡するのと同じ発想です。
流体粒子の位置 $\bm{x}(t) = (x(t), y(t))$ は、その粒子がいる位置の速度に等しい速度で移動します。この条件を微分方程式として書くと、次のようになります。
$$ \boxed{\frac{d\bm{x}}{dt} = \bm{v}(\bm{x}(t), t)} $$
成分ごとに書くと、2次元の場合は
$$ \frac{dx}{dt} = u(x(t), y(t), t), \quad \frac{dy}{dt} = v(x(t), y(t), t) $$
となります。これは初期値問題であり、初期条件
$$ \bm{x}(t_0) = \bm{x}_0 $$
を指定すれば、粒子の軌跡 $\bm{x}(t)$ が一意に定まります。
流線との本質的な違い
流跡線の微分方程式と流線の微分方程式を並べて比較してみましょう。
流線:
$$ \frac{d\bm{x}}{ds} = \bm{v}(\bm{x}(s), t_{\text{fixed}}) $$
流跡線:
$$ \frac{d\bm{x}}{dt} = \bm{v}(\bm{x}(t), t) $$
両者の違いは明確です。
- 流線では、独立変数は媒介変数 $s$ であり、時刻 $t$ はパラメータとして固定されています。
- 流跡線では、独立変数は時刻 $t$ そのものであり、時間の進行とともに速度場自体も変化し得ます。
定常流($\bm{v}$ が $t$ に依存しない場合)では、両方の方程式が実質的に同じ形になります。しかし非定常流では、流跡線は「時間変化する速度場の中を粒子が追従する」ため、どの瞬間の流線とも一致しません。
具体例: 非定常流の流跡線
次の速度場を考えます。
$$ u = 1, \quad v = \cos(\pi t) $$
$x$ 方向には常に一定速度で流れますが、$y$ 方向の速度が時間とともに周期的に変化する非定常流です。
時刻 $t_0 = 0$ に原点 $(0, 0)$ を出発する粒子の流跡線を求めましょう。
$x$ 方向について
$$ \frac{dx}{dt} = 1, \quad x(0) = 0 $$
を積分すると $x(t) = t$ が得られます。
$y$ 方向について
$$ \frac{dy}{dt} = \cos(\pi t), \quad y(0) = 0 $$
を積分すると
$$ y(t) = \frac{1}{\pi}\sin(\pi t) $$
が得られます。$x = t$ を代入して $t$ を消去すると、流跡線の方程式は
$$ y = \frac{1}{\pi}\sin(\pi x) $$
となります。これは正弦曲線であり、粒子は蛇行しながら $x$ 方向に進んでいくことがわかります。
一方、同じ速度場の時刻 $t$ における流線は、$u = 1$、$v = \cos(\pi t)$($t$ 固定)から
$$ \frac{dy}{dx} = \frac{v}{u} = \cos(\pi t) $$
となり、これは傾き $\cos(\pi t)$ の直線群です。各瞬間の流線は直線ですが、流跡線は正弦曲線という、まったく異なる形状になります。この明快な例が、非定常流における流線と流跡線の違いを如実に示しています。
この違いを踏まえた上で、次は3つ目の概念である流脈線について定義しましょう。
流脈線の数学的定義
ある点を通過した粒子の集合
流脈線(streakline)は、3つの概念の中で最も直感的にはわかりやすいが、数学的には最も記述が複雑なものです。
流脈線とは、過去のすべての時刻 $\tau$($\tau \leq t$)において、ある固定点 $\bm{x}_0$ を通過した流体粒子が、現在の時刻 $t$ においてそれぞれ存在している位置をつないだ曲線です。
煙突の口を固定点 $\bm{x}_0$ とすると、時刻 $\tau$ に煙突の口を通過した煙の粒子は、時刻 $\tau$ から現在時刻 $t$ まで流れ場に従って移動してきたはずです。その移動先をすべての $\tau$ について集めると、それが煙の全体形状、すなわち流脈線になります。
数学的定式化
時刻 $\tau$ に固定点 $\bm{x}_0$ を通過した粒子の、時刻 $t$ における位置を $\bm{X}(\tau; t)$ と書きます。この粒子は流跡線の方程式
$$ \frac{d\bm{X}}{dt’} = \bm{v}(\bm{X}(t’), t’) $$
を初期条件
$$ \bm{X}(\tau; \tau) = \bm{x}_0 $$
のもとで解いた結果として得られます。ここで $t’$ は $\tau$ から $t$ まで走る時間変数です。
流脈線は、$\tau$ をパラメータとして
$$ \boxed{\text{流脈線} = \{ \bm{X}(\tau; t) \mid -\infty < \tau \leq t \}} $$
で定義されます。つまり、過去のさまざまな時刻に同じ点を通った流体粒子の、現在の位置の集合です。
3つの線の定義の比較
ここで、3つの線の数学的定義を並べて整理しておきましょう。
| 線の種類 | 微分方程式 | 独立変数 | 固定するもの | パラメータ |
|---|---|---|---|---|
| 流線 | $\frac{d\bm{x}}{ds} = \bm{v}(\bm{x}, t)$ | $s$(曲線パラメータ) | 時刻 $t$ | 初期点 |
| 流跡線 | $\frac{d\bm{x}}{dt} = \bm{v}(\bm{x}, t)$ | $t$(時刻) | 初期位置 $\bm{x}_0$ | 初期時刻 $t_0$ |
| 流脈線 | $\frac{d\bm{X}}{dt’} = \bm{v}(\bm{X}, t’)$ | $t’$(時刻) | 通過点 $\bm{x}_0$、観測時刻 $t$ | 通過時刻 $\tau$ |
流線はオイラー的な「瞬間の場の構造」、流跡線はラグランジュ的な「個々の粒子の履歴」、流脈線は「同じ放出点を共有する粒子群の現在分布」を表しています。
これらの定義が整ったところで、定常流においてこの3つの線がなぜ一致するのかを数学的に証明しましょう。
定常流では3つの線が一致する — 数学的証明
定常流の条件
定常流とは、速度場が時刻に依存しない流れです。
$$ \bm{v}(\bm{x}, t) = \bm{v}(\bm{x}) $$
すなわち $\partial \bm{v} / \partial t = \bm{0}$ が成り立ちます。この場合、ある瞬間に撮った速度場の「写真」はいつ撮っても同じです。
流線と流跡線の一致
定理: 定常流において、流線と流跡線は一致する。
証明: 定常流では、流線の方程式は
$$ \frac{d\bm{x}}{ds} = \bm{v}(\bm{x}(s)) $$
であり、流跡線の方程式は
$$ \frac{d\bm{x}}{dt} = \bm{v}(\bm{x}(t)) $$
です。速度場 $\bm{v}$ が $t$ に依存しないため、どちらも同じ形の自励系常微分方程式
$$ \frac{d\bm{x}}{d\alpha} = \bm{v}(\bm{x}(\alpha)) $$
になります($\alpha$ は $s$ でも $t$ でもよい)。同じ初期条件を与えれば、常微分方程式の解の一意性(微分方程式のピカール・リンデレフの定理)により、得られる曲線は同一です。
したがって、定常流においては流線上の点をたどることと、流体粒子の実際の運動をたどることは、パラメータの名前が異なるだけで数学的に同一の軌跡を描きます。$\square$
流跡線と流脈線の一致
定理: 定常流において、流跡線と流脈線は一致する。
証明: 固定点 $\bm{x}_0$ を通過する流脈線を考えます。時刻 $\tau$ に $\bm{x}_0$ を通過した粒子の、時刻 $t$ における位置 $\bm{X}(\tau; t)$ は
$$ \frac{d\bm{X}}{dt’} = \bm{v}(\bm{X}(t’)) $$
を初期条件 $\bm{X}(\tau; \tau) = \bm{x}_0$ のもとで解いた結果です。
定常流では $\bm{v}$ が $t’$ に陽に依存しないため、この解は初期時刻からの経過時間 $t’ – \tau$ のみに依存します。すなわち、
$$ \bm{X}(\tau; t) = \bm{\Phi}(t – \tau) $$
と書けます。ここで $\bm{\Phi}$ は
$$ \frac{d\bm{\Phi}}{d\sigma} = \bm{v}(\bm{\Phi}(\sigma)), \quad \bm{\Phi}(0) = \bm{x}_0 $$
の解であり、$\sigma = t – \tau$ です。
流脈線は $\tau$ を $-\infty$ から $t$ まで変化させたときの $\bm{X}(\tau; t)$ の集合ですが、$\sigma = t – \tau$ の変換により、これは $\sigma$ を $0$ から $+\infty$ まで変化させたときの $\bm{\Phi}(\sigma)$ の集合と一致します。
一方、$\bm{x}_0$ を初期位置とする流跡線もまったく同じ方程式 $\bm{\Phi}$ で記述されます。
したがって、流脈線が描く曲線と流跡線が描く曲線は、パラメータの取り方が異なるだけで同じ点集合になります。$\square$
定常流における一致のまとめ
以上により、定常流では
$$ \text{流線} = \text{流跡線} = \text{流脈線} $$
が成り立つことが示されました。この結果は非常に便利です。なぜなら、定常流れの実験で煙を使って可視化した画像(流脈線)をそのまま流線として解釈でき、さらに粒子の実際の運動経路(流跡線)としても使えるからです。
逆に言えば、非定常流ではこの一致が崩れるため、可視化画像の解釈には注意が必要です。具体的にどのように異なるのかを、次のセクションで見ていきましょう。
非定常流での3つの線の違い — 具体例
回転する一様流
非定常流における3つの線の違いを、シンプルかつ明快な例で確認しましょう。次の速度場を考えます。
$$ u(x, y, t) = \cos(\omega t), \quad v(x, y, t) = \sin(\omega t) $$
これは空間的には一様(場所によらない)ですが、速度ベクトルの方向が角速度 $\omega$ で回転する非定常流です。風向きが一定速度で変わっていく状況に相当します。
流線(時刻 $t$ を固定)
時刻 $t$ を固定すると、速度場は $(u, v) = (\cos\omega t, \sin\omega t)$ という定数ベクトルです。したがって、流線は
$$ \frac{dy}{dx} = \frac{\sin(\omega t)}{\cos(\omega t)} = \tan(\omega t) $$
となり、傾き $\tan(\omega t)$ の直線群です。時刻が変われば傾きが変わるので、流線のパターンは時間とともに回転します。
流跡線(粒子の軌跡)
時刻 $t_0 = 0$ に原点 $(0,0)$ を出発した粒子の運動方程式を解きます。
$$ \frac{dx}{dt} = \cos(\omega t) \implies x(t) = \frac{1}{\omega}\sin(\omega t) $$
$$ \frac{dy}{dt} = \sin(\omega t) \implies y(t) = -\frac{1}{\omega}\cos(\omega t) + \frac{1}{\omega} $$
$x^2 + (y – 1/\omega)^2 = 1/\omega^2$ となるので、流跡線は中心 $(0, 1/\omega)$、半径 $1/\omega$ の円です。直線である流線とは根本的に異なる形状であることがわかります。
流脈線(同じ点を通過した粒子の現在位置)
時刻 $\tau$ に原点を通過した粒子の、時刻 $t$ における位置は
$$ X(\tau; t) = \frac{1}{\omega}[\sin(\omega t) – \sin(\omega \tau)] $$
$$ Y(\tau; t) = -\frac{1}{\omega}[\cos(\omega t) – \cos(\omega \tau)] $$
$\tau$ を変化させるとこれらの点が描く曲線が流脈線です。三角関数の和積公式を適用すると、
$$ X = \frac{2}{\omega}\cos\left(\frac{\omega(t+\tau)}{2}\right)\sin\left(\frac{\omega(t-\tau)}{2}\right) $$
$$ Y = \frac{2}{\omega}\sin\left(\frac{\omega(t+\tau)}{2}\right)\sin\left(\frac{\omega(t-\tau)}{2}\right) $$
と変形でき、$X^2 + Y^2 = (2/\omega)^2 \sin^2(\omega(t-\tau)/2)$ となります。これは円とも直線とも異なる曲線であり、一般にアルキメデスの螺旋に似た巻き込み構造を持ちます。
3つの線の形状のまとめ
| 線の種類 | 形状 |
|---|---|
| 流線 | 直線(時刻ごとに回転する) |
| 流跡線 | 円 |
| 流脈線 | 螺旋状の曲線 |
同じ速度場であるにもかかわらず、3つの線がまったく異なる形状を持つことが確認できました。この結果は、流れの可視化実験においてどの種類の「線」を観察しているのかを意識することの重要性を物語っています。
それでは、ここまでの理論をPythonで可視化して、直感的な理解をさらに深めていきましょう。
Pythonによる可視化
可視化1: 2次元定常流れ場の流線描画
まず、定常流における流線をmatplotlibのstreamplot関数で描画します。先ほど手計算で求めた伸張流 $u = x$、$v = -y$ の流線を可視化してみましょう。連続の式を確認すると、$\partial u/\partial x + \partial v/\partial y = 1 + (-1) = 0$ となり、非圧縮性の条件を満たしていることがわかります。
import numpy as np
import matplotlib.pyplot as plt
# 格子点の生成
x = np.linspace(-3, 3, 300)
y = np.linspace(-3, 3, 300)
X, Y = np.meshgrid(x, y)
# 速度場: 伸張流 (extensional flow)
U = X # u = x
V = -Y # v = -y
# 速度の大きさ(色付け用)
speed = np.sqrt(U**2 + V**2)
# 流線の描画
fig, ax = plt.subplots(figsize=(8, 8))
strm = ax.streamplot(X, Y, U, V, color=speed, cmap='coolwarm',
density=1.5, linewidth=1.2, arrowsize=1.5)
fig.colorbar(strm.lines, ax=ax, label='Speed')
# 手計算の結果 xy = C の双曲線を重ね描き
for C in [-4, -2, -1, -0.5, 0.5, 1, 2, 4]:
x_hyp = np.linspace(0.15, 3, 200) if C > 0 else np.linspace(-3, -0.15, 200)
y_hyp = C / x_hyp
mask = np.abs(y_hyp) <= 3
ax.plot(x_hyp[mask], y_hyp[mask], 'k--', alpha=0.4, linewidth=0.8)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Streamlines of Extensional Flow: u=x, v=-y')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
上のグラフから、流線が双曲線 $xy = C$ のパターンを描いていることが確認できます。カラーマップは速度の大きさを示しており、原点から離れるほど速度が大きくなることが読み取れます。矢印の向きから、流体は $x$ 軸方向に引き伸ばされ、$y$ 軸方向に圧縮される伸張流であることが視覚的にわかります。黒い破線は手計算で求めた双曲線 $xy = C$ であり、streamplot が描画した流線と一致していることが確認できます。これは理論と数値計算の整合性を示す良い例です。
この定常流の場合、流線・流跡線・流脈線はすべて一致するため、この図はそのまま粒子の軌跡としても、煙線としても解釈できます。では次に、非定常流において3つの線がどのように異なるかをPythonで可視化してみましょう。
可視化2: 非定常流における流線・流跡線・流脈線の比較
先ほど理論的に解析した回転する一様流 $(u, v) = (\cos\omega t, \sin\omega t)$ について、3つの線を同時にプロットして比較します。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# パラメータ
omega = 1.0 # 角速度
t_obs = 3.0 # 観測時刻
# --- (1) 流線: 時刻 t_obs での速度場に接する直線 ---
def streamline_at_t(t):
"""時刻tでの流線(原点を通る直線)"""
angle = omega * t
s_vals = np.linspace(-3, 3, 200)
x_sl = s_vals * np.cos(angle)
y_sl = s_vals * np.sin(angle)
return x_sl, y_sl
# --- (2) 流跡線: t=0に原点を出発した粒子の軌跡 ---
def pathline(t0, x0, y0, t_end, n_points=500):
"""流跡線を数値的に計算"""
def rhs(t, state):
return [np.cos(omega * t), np.sin(omega * t)]
t_span = (t0, t_end)
t_eval = np.linspace(t0, t_end, n_points)
sol = solve_ivp(rhs, t_span, [x0, y0], t_eval=t_eval,
method='RK45', rtol=1e-10)
return sol.y[0], sol.y[1]
# --- (3) 流脈線: 過去に原点を通った粒子の現在位置 ---
def streakline(x0, y0, t_obs, n_particles=500):
"""流脈線を数値的に計算"""
tau_vals = np.linspace(0, t_obs, n_particles)
x_streak = np.zeros(n_particles)
y_streak = np.zeros(n_particles)
for i, tau in enumerate(tau_vals):
# 時刻tauに(x0,y0)を出発し、t_obsまで積分
if tau < t_obs:
xp, yp = pathline(tau, x0, y0, t_obs, n_points=100)
x_streak[i] = xp[-1]
y_streak[i] = yp[-1]
else:
x_streak[i] = x0
y_streak[i] = y0
return x_streak, y_streak
# 解析解も計算
t_path = np.linspace(0, t_obs, 500)
x_path_exact = (1.0 / omega) * np.sin(omega * t_path)
y_path_exact = -(1.0 / omega) * np.cos(omega * t_path) + 1.0 / omega
# 流脈線の解析解
tau_vals = np.linspace(0, t_obs, 500)
x_streak_exact = (1.0 / omega) * (np.sin(omega * t_obs) - np.sin(omega * tau_vals))
y_streak_exact = -(1.0 / omega) * (np.cos(omega * t_obs) - np.cos(omega * tau_vals))
# 描画
fig, ax = plt.subplots(figsize=(9, 9))
# 流線(時刻t_obsでの直線)
x_sl, y_sl = streamline_at_t(t_obs)
ax.plot(x_sl, y_sl, 'b-', linewidth=2.5, label=f'Streamline (t={t_obs:.1f})')
# 流跡線(解析解)
ax.plot(x_path_exact, y_path_exact, 'r-', linewidth=2.5, label='Pathline (from origin at t=0)')
# 流脈線(解析解)
ax.plot(x_streak_exact, y_streak_exact, 'g-', linewidth=2.5,
label=f'Streakline (through origin, at t={t_obs:.1f})')
# 原点の表示
ax.plot(0, 0, 'ko', markersize=8, zorder=5)
ax.annotate('Release point', xy=(0, 0), xytext=(0.3, -0.5),
fontsize=11, arrowprops=dict(arrowstyle='->', color='black'))
# 現在の速度ベクトルの方向を矢印で表示
arrow_len = 1.5
ax.annotate('', xy=(arrow_len*np.cos(omega*t_obs), arrow_len*np.sin(omega*t_obs)),
xytext=(0, 0),
arrowprops=dict(arrowstyle='->', color='blue', lw=2))
ax.set_xlim(-3, 3)
ax.set_ylim(-1.5, 3.5)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_title(f'Streamline vs Pathline vs Streakline\n'
f'(Rotating uniform flow, ω={omega}, t={t_obs})', fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=11, loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このグラフから、非定常流における3つの線の違いが一目瞭然です。
- 流線(青線) は時刻 $t = 3.0$ における速度ベクトルの方向に沿った直線です。「今この瞬間、流体はこの方向に動いている」という情報だけを表しています。
- 流跡線(赤線) は、時刻 $t = 0$ に原点を出発した粒子が $t = 3.0$ までにたどった円弧の軌跡です。速度方向が回転するにつれて粒子も円を描いて移動した履歴がそのまま表れています。
- 流脈線(緑線) は、原点から次々と放出された粒子が $t = 3.0$ の時点でどこにいるかを示す曲線です。最近放出された粒子は原点の近くにいますが、早い時刻に放出された粒子は遠くまで移動しており、全体として螺旋状の構造を描いています。
3つの線がまったく異なる形状を持つことが視覚的に確認でき、先ほどの理論的考察と完全に一致しています。
可視化3: 渦流れの流線
次に、渦度と循環で学ぶ渦流れの流線を描画してみましょう。ここでは、自由渦(irrotational vortex)とランキン渦(Rankine vortex)の2種類を可視化します。
自由渦はポテンシャル流れの基本解の一つであり、速度ポテンシャルを持つ非回転流れです。一方、ランキン渦は中心付近を剛体回転、外側を自由渦とする複合モデルであり、竜巻や台風の風速分布の簡易モデルとして使われます。
import numpy as np
import matplotlib.pyplot as plt
# 格子点の生成
x = np.linspace(-3, 3, 400)
y = np.linspace(-3, 3, 400)
X, Y = np.meshgrid(x, y)
# 極座標に変換
R = np.sqrt(X**2 + Y**2)
R = np.where(R < 1e-10, 1e-10, R) # ゼロ除算を回避
# ランキン渦のパラメータ
Gamma = 2 * np.pi # 循環
r_c = 1.0 # コア半径
fig, axes = plt.subplots(1, 2, figsize=(16, 7))
# --- 自由渦 (Free vortex / Irrotational vortex) ---
# v_theta = Gamma / (2*pi*r), v_r = 0
V_theta_free = Gamma / (2 * np.pi * R)
U_free = -V_theta_free * Y / R # u = -v_theta * sin(theta)
V_free = V_theta_free * X / R # v = v_theta * cos(theta)
speed_free = np.sqrt(U_free**2 + V_free**2)
speed_free = np.clip(speed_free, 0, 10)
ax = axes[0]
strm = ax.streamplot(X, Y, U_free, V_free, color=speed_free,
cmap='inferno', density=1.8, linewidth=1.0,
arrowsize=1.2, broken_streamlines=False)
fig.colorbar(strm.lines, ax=ax, label='Speed', shrink=0.8)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Free Vortex (Irrotational)')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
# --- ランキン渦 (Rankine vortex) ---
# r < r_c: 剛体回転 v_theta = (Gamma / (2*pi*r_c^2)) * r
# r >= r_c: 自由渦 v_theta = Gamma / (2*pi*r)
V_theta_rankine = np.where(
R < r_c,
(Gamma / (2 * np.pi * r_c**2)) * R, # 剛体回転
Gamma / (2 * np.pi * R) # 自由渦
)
U_rankine = -V_theta_rankine * Y / R
V_rankine = V_theta_rankine * X / R
speed_rankine = np.sqrt(U_rankine**2 + V_rankine**2)
speed_rankine = np.clip(speed_rankine, 0, 5)
ax = axes[1]
strm = ax.streamplot(X, Y, U_rankine, V_rankine, color=speed_rankine,
cmap='inferno', density=1.8, linewidth=1.0,
arrowsize=1.2, broken_streamlines=False)
fig.colorbar(strm.lines, ax=ax, label='Speed', shrink=0.8)
circle = plt.Circle((0, 0), r_c, fill=False, color='cyan',
linewidth=2, linestyle='--', label=f'Core radius r_c={r_c}')
ax.add_patch(circle)
ax.legend(fontsize=10)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Rankine Vortex')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
左右のグラフを比較すると、いくつかの重要な違いが読み取れます。
- 流線の形状: 両方とも流線は同心円状ですが、これは原点まわりの軸対称な流れであることの反映です。流体粒子は原点のまわりを周回するように運動します。
- 速度分布の違い: 自由渦(左)では中心に近づくほど速度が急激に増大し($v_\theta \propto 1/r$)、理論上は中心で無限大に発散します。一方、ランキン渦(右)では、コア半径 $r_c$(シアンの破線円)の内部では速度が中心に向かってゼロに近づきます($v_\theta \propto r$)。この剛体回転領域の存在が、ランキン渦を竜巻のより現実的なモデルにしています。
- 渦度の分布: 自由渦は中心(特異点)を除いて至る所で渦度がゼロであり、非回転流です。ランキン渦はコア内部で一定の渦度を持ち、コア外部で渦度ゼロとなります。
これらの渦流れは定常流であるため、流線・流跡線・流脈線はすべて一致します。もし中心がゆっくり移動する非定常な渦であれば、3つの線は異なるパターンを示すでしょう。
可視化4: 時間発展する流れ場 — 複数時刻の流線と粒子追跡
最後に、より複雑な非定常流れ場を設定し、時間発展の様子をフレームごとに並べて可視化します。背景流に一様流 $U_\infty$ があり、それに振動する横風が加わる場合を考えます。
$$ u = U_\infty + A\sin(ky)\cos(\omega t), \quad v = A\cos(ky)\sin(\omega t) $$
この速度場は空間的な波状構造と時間的な振動を同時に持ち、現実の大気や海洋で見られる波状擾乱の簡易モデルとして捉えることができます。レイノルズ数が大きい流れでは、こうした擾乱が層流から乱流への遷移を引き起こす要因にもなります。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# パラメータ
U_inf = 1.0 # 背景一様流
A = 0.6 # 振動振幅
k = 1.0 # 波数
omega = 1.5 # 角振動数
def velocity_field(x, y, t):
"""非定常速度場"""
u = U_inf + A * np.sin(k * y) * np.cos(omega * t)
v = A * np.cos(k * y) * np.sin(omega * t)
return u, v
# 複数時刻の流線を並べて描画
times = [0.0, 1.0, 2.0, 3.0]
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 格子点
x_grid = np.linspace(-1, 8, 300)
y_grid = np.linspace(-4, 4, 300)
XG, YG = np.meshgrid(x_grid, y_grid)
for idx, t_now in enumerate(times):
ax = axes[idx // 2][idx % 2]
# 時刻t_nowにおける速度場
U_now, V_now = velocity_field(XG, YG, t_now)
speed = np.sqrt(U_now**2 + V_now**2)
# 流線の描画
strm = ax.streamplot(XG, YG, U_now, V_now, color=speed,
cmap='viridis', density=1.5, linewidth=1.0,
arrowsize=1.0)
# 粒子追跡: t=0に等間隔で配置した粒子の現在位置
if t_now > 0:
n_particles = 15
y_init = np.linspace(-3, 3, n_particles)
x_init = np.zeros(n_particles)
for j in range(n_particles):
def rhs(t, state):
ux, vy = velocity_field(state[0], state[1], t)
return [ux, vy]
sol = solve_ivp(rhs, [0, t_now], [x_init[j], y_init[j]],
method='RK45', rtol=1e-8, max_step=0.05)
# 粒子の軌跡を灰色で描画
ax.plot(sol.y[0], sol.y[1], '-', color='gray',
alpha=0.4, linewidth=0.8)
# 現在位置を赤点で表示
ax.plot(sol.y[0][-1], sol.y[1][-1], 'ro', markersize=5)
else:
# t=0では初期位置を表示
n_particles = 15
y_init = np.linspace(-3, 3, n_particles)
ax.plot(np.zeros(n_particles), y_init, 'ro', markersize=5)
ax.set_xlim(-1, 8)
ax.set_ylim(-4, 4)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title(f't = {t_now:.1f}', fontsize=13)
ax.set_aspect('equal')
plt.suptitle('Time Evolution of Streamlines (colored) and Particle Paths (gray/red)\n'
f'u = {U_inf} + {A}sin({k}y)cos({omega}t), '
f'v = {A}cos({k}y)sin({omega}t)',
fontsize=13, y=1.02)
plt.tight_layout()
plt.show()
この4パネルの図から、非定常流の時間発展について多くの洞察が得られます。
- 流線の時間変化: $t = 0$ では $\sin(\omega t) = 0$ なので $v = 0$ となり、流線は水平な直線になります。時間が進むにつれて波状の擾乱が発達し、流線が蛇行する様子が見て取れます。$t = 2.0$ 付近では再び振動が弱まり、$t = 3.0$ で逆向きの波状パターンが現れます。これは $\cos(\omega t)$ と $\sin(\omega t)$ の位相関係によるものです。
- 粒子の軌跡と流線の不一致: 灰色の線(流跡線 = 粒子の実際の軌跡)は、その時刻の流線(カラーの曲線)とは一般に一致していません。粒子は過去の速度場の記憶を持って移動しているため、現在の瞬間的な流線パターンだけからは粒子の位置を予測できません。
- 粒子の分散: $t = 0$ に $x = 0$ の直線上に等間隔で並べた粒子(赤点)が、時間とともにばらけていく様子がわかります。これは非定常流れ場における物質混合のメカニズムに関連しており、化学工学や環境工学で重要な現象です。
可視化5: 一様流中の渦対の流線
定常の渦流れをもう一つ可視化しましょう。ポテンシャル流れの重ね合わせにより、一様流に2つの逆向きの渦(渦対)を置いた流れ場を描画します。この流れは翼の後方に形成される渦対の簡易モデルであり、航空機の揚力と渦の関係を理解する上で重要です。
import numpy as np
import matplotlib.pyplot as plt
# 格子点
x = np.linspace(-4, 6, 500)
y = np.linspace(-4, 4, 500)
X, Y = np.meshgrid(x, y)
# パラメータ
U_inf = 1.0 # 一様流速度
Gamma = 5.0 # 循環の強さ
y_v = 1.0 # 渦の配置位置 (0, +y_v) と (0, -y_v)
# 一様流
U_uniform = U_inf * np.ones_like(X)
V_uniform = np.zeros_like(Y)
# 上側の渦 (反時計回り, +Gamma)
R1_sq = X**2 + (Y - y_v)**2
R1_sq = np.where(R1_sq < 1e-6, 1e-6, R1_sq)
U_vortex1 = -Gamma / (2 * np.pi) * (Y - y_v) / R1_sq
V_vortex1 = Gamma / (2 * np.pi) * X / R1_sq
# 下側の渦 (時計回り, -Gamma)
R2_sq = X**2 + (Y + y_v)**2
R2_sq = np.where(R2_sq < 1e-6, 1e-6, R2_sq)
U_vortex2 = Gamma / (2 * np.pi) * (Y + y_v) / R2_sq
V_vortex2 = -Gamma / (2 * np.pi) * X / R2_sq
# 重ね合わせ
U_total = U_uniform + U_vortex1 + U_vortex2
V_total = V_uniform + V_vortex1 + V_vortex2
# 速度の大きさ(クリップして特異点の影響を抑える)
speed = np.sqrt(U_total**2 + V_total**2)
speed = np.clip(speed, 0, 5)
# 描画
fig, ax = plt.subplots(figsize=(12, 7))
strm = ax.streamplot(X, Y, U_total, V_total, color=speed, cmap='plasma',
density=2.0, linewidth=1.0, arrowsize=1.2,
broken_streamlines=False)
fig.colorbar(strm.lines, ax=ax, label='Speed', shrink=0.8)
# 渦の中心を表示
ax.plot(0, y_v, 'c^', markersize=12, markeredgecolor='white',
markeredgewidth=1.5, label=f'Vortex (+Γ), y={y_v}')
ax.plot(0, -y_v, 'cv', markersize=12, markeredgecolor='white',
markeredgewidth=1.5, label=f'Vortex (-Γ), y={-y_v}')
ax.set_xlim(-4, 6)
ax.set_ylim(-4, 4)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_title(f'Streamlines: Uniform Flow + Vortex Pair\n'
f'(U∞={U_inf}, Γ={Gamma}, vortex at y=±{y_v})',
fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このグラフから、一様流中の渦対が作り出す流れ場の構造が見て取れます。
- 流線の変形: 一様流だけであれば水平な直線になるはずの流線が、渦対の影響で上下方向に大きく変形しています。特に2つの渦の間の領域では、流体が強く下方に引き寄せられる(渦対による誘導速度)様子がわかります。これは航空機の翼が揚力を生む際に後方に形成される吹き下ろし(downwash)に対応する現象です。
- 速度分布: 渦の中心付近(シアンのマーカー)で速度が急増しています。2つの渦の間の領域では、両方の渦からの誘導速度が同じ方向に重なるため、特に速度が大きくなります。
- ベルヌーイの定理との関連: 定常非粘性流では、速度が大きい領域で圧力が低くなります。渦の中心付近の低圧領域が、渦を維持する求心力の役割を果たしています。
可視化6: 非定常流における3つの線の同時追跡
最後に、より教育的な可視化として、具体的な非定常流れ場で流線・流跡線・流脈線を高精度に計算し、一つのグラフ上に重ねて表示します。ここでは減衰振動する流れ場を扱います。
$$ u = 1 + 0.5 e^{-0.3t}\sin(y), \quad v = 0.5 e^{-0.3t}\cos(y)\cos(0.8t) $$
この速度場は、時間とともに振動が減衰して最終的には一様流 $u = 1, v = 0$ に収束します。初期の非定常な過渡期において3つの線の違いが顕著に現れることが期待されます。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# パラメータ
def velocity(x, y, t):
"""減衰振動する非定常流れ場"""
decay = np.exp(-0.3 * t)
u = 1.0 + 0.5 * decay * np.sin(y)
v = 0.5 * decay * np.cos(y) * np.cos(0.8 * t)
return u, v
# 観測時刻
t_obs = 6.0
release_point = (0.0, 0.5) # 放出点
# --- 流線(時刻t_obsで凍結した速度場の積分曲線)---
def compute_streamline(x0, y0, t_fixed, s_max=10.0, n_points=1000):
"""時刻t_fixedにおける流線をパラメータsで積分"""
def rhs(s, state):
ux, vy = velocity(state[0], state[1], t_fixed)
return [ux, vy]
sol = solve_ivp(rhs, [0, s_max], [x0, y0],
method='RK45', rtol=1e-10, max_step=0.02,
t_eval=np.linspace(0, s_max, n_points))
return sol.y[0], sol.y[1]
# --- 流跡線(t=0に放出点を出発した粒子の軌跡)---
def compute_pathline(x0, y0, t0, t_end, n_points=1000):
"""粒子の軌跡"""
def rhs(t, state):
ux, vy = velocity(state[0], state[1], t)
return [ux, vy]
sol = solve_ivp(rhs, [t0, t_end], [x0, y0],
method='RK45', rtol=1e-10, max_step=0.02,
t_eval=np.linspace(t0, t_end, n_points))
return sol.y[0], sol.y[1]
# --- 流脈線(過去に放出点を通った粒子の現在位置)---
def compute_streakline(x0, y0, t_obs, n_particles=300):
"""流脈線"""
tau_vals = np.linspace(0, t_obs, n_particles)
x_streak = np.zeros(n_particles)
y_streak = np.zeros(n_particles)
for i, tau in enumerate(tau_vals):
if tau < t_obs - 1e-10:
def rhs(t, state):
ux, vy = velocity(state[0], state[1], t)
return [ux, vy]
sol = solve_ivp(rhs, [tau, t_obs], [x0, y0],
method='RK45', rtol=1e-10, max_step=0.02)
x_streak[i] = sol.y[0][-1]
y_streak[i] = sol.y[1][-1]
else:
x_streak[i] = x0
y_streak[i] = y0
return x_streak, y_streak
# 計算実行
x_sl, y_sl = compute_streamline(*release_point, t_obs)
x_pl, y_pl = compute_pathline(*release_point, 0.0, t_obs)
x_stk, y_stk = compute_streakline(*release_point, t_obs)
# 描画
fig, ax = plt.subplots(figsize=(12, 6))
# 背景の速度場(矢印)
x_bg = np.linspace(-1, 12, 20)
y_bg = np.linspace(-2, 3, 10)
XB, YB = np.meshgrid(x_bg, y_bg)
UB, VB = velocity(XB, YB, t_obs)
ax.quiver(XB, YB, UB, VB, alpha=0.15, color='gray', scale=25)
# 3つの線をプロット
ax.plot(x_sl, y_sl, 'b-', linewidth=2.5, label=f'Streamline at t={t_obs:.1f}')
ax.plot(x_pl, y_pl, 'r-', linewidth=2.5, label='Pathline (released at t=0)')
ax.plot(x_stk, y_stk, 'g-', linewidth=2.5,
label=f'Streakline at t={t_obs:.1f}')
# 放出点
ax.plot(*release_point, 'ko', markersize=10, zorder=5)
ax.annotate(f'Release point {release_point}',
xy=release_point, xytext=(0.5, -1.0),
fontsize=11, arrowprops=dict(arrowstyle='->', color='black'))
# 粒子の現在位置(流跡線上)
ax.plot(x_pl[-1], y_pl[-1], 'r*', markersize=15, zorder=5,
label='Particle position at t=6')
ax.set_xlim(-1, 12)
ax.set_ylim(-2, 3)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_title('Comparison of Streamline, Pathline, and Streakline\n'
'in a Decaying Oscillatory Flow', fontsize=13)
ax.legend(fontsize=10, loc='upper left')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
この最終的な可視化から、非定常流における3つの線の性質が明確に読み取れます。
- 流線(青) は、$t = 6.0$ における速度場に沿った滑らかな曲線です。この時点では減衰が進んでいるため、ほぼ水平に近い緩やかなうねりを持つ曲線になっています。
- 流跡線(赤) は、$t = 0$ に放出された粒子が過去6秒間にたどった実際の経路です。初期には振動が大きかったため大きく蛇行しており、時間が進むにつれて振動が収まって直線的になっていく様子が見て取れます。流跡線は粒子が経験した速度場の時間履歴を反映しています。
- 流脈線(緑) は、放出点を過去に通ったすべての粒子の現在位置を結んだ曲線です。最近放出された粒子は放出点の近くにいますが、早い時刻に放出された粒子は遠くまで移動しており、かつ当時の強い振動の影響を受けているため、流脈線全体としては流跡線とも流線とも異なる独特の形状を描いています。
- 減衰の効果: 十分に時間が経過すると速度場が定常($u = 1, v = 0$)に近づくため、3つの線の違いは小さくなっていきます。これは先ほど証明した「定常流では3つの線が一致する」という定理の遷移的な現れです。
背景の灰色の矢印は、$t = 6.0$ における速度場の分布を示しており、流線がこの速度場に沿っていることが視覚的に確認できます。
流れの可視化実験との対応
実験手法と3つの線の対応
実際の流体実験では、さまざまな可視化手法が用いられますが、それぞれの手法が流線・流跡線・流脈線のどれに対応するかを正しく認識することが重要です。
| 実験手法 | 対応する線 | 原理 |
|---|---|---|
| 煙線法(smoke wire) | 流脈線 | ワイヤーから連続的に放出される煙が描く形状 |
| 染料注入法 | 流脈線 | 注入点から連続的に流される染料の筋 |
| 水素気泡法 | 流脈線 / タイムライン | 電極で発生させた気泡列の形状 |
| PIV(粒子画像流速測定法) | 速度場 → 流線計算可 | 粒子の微小変位から速度場を復元 |
| PTV(粒子追跡流速測定法) | 流跡線 | 個々の粒子を長時間追跡 |
| 瞬間写真(短時間露光) | 流線に近い | 極短時間の粒子移動方向を記録 |
| 長時間露光写真 | 流跡線 | 粒子の軌跡全体を記録 |
定常流の実験では、どの手法を使っても同じパターンが得られるため区別する必要はありません。しかし、非定常流の実験、たとえば渦の発生・消滅が起こるカルマン渦列の観察や、翼の迎角を急変させた場合の非定常空力などでは、観察している「線」の種類を意識しないと、流れ場の解釈を誤る可能性があります。
CFDにおける3つの線
CFD(数値流体力学)では、ナビエ・ストークス方程式を数値的に解いて得られた速度場データからこれらの線を後処理として計算します。
- 流線: 特定の時刻の速度場に対して常微分方程式を数値積分します。計算コストが比較的小さく、定常CFDの結果表示で最も一般的に使われます。
- 流跡線: 時間発展する速度場の中で粒子を追跡するため、各時間ステップの速度場データを保存しておく必要があり、メモリと計算コストが大きくなります。
- 流脈線: 多数の粒子を異なる時刻に放出して追跡する必要があるため、計算コストが最も大きいですが、実験との比較には不可欠です。
これらの後処理は、先ほどのPythonコードで行ったような常微分方程式の数値積分がそのまま適用できます。実際の産業用CFDソフトウェア(Fluent、OpenFOAM、Star-CCM+など)にも、これらの可視化機能が組み込まれています。
ここまでで、3つの線の理論的定義、数学的性質、実験やCFDとの対応関係をすべてカバーしました。最後に、本記事の内容を振り返りましょう。
補足: 流管と流面
流線に関連する概念として、流管(stream tube) と流面(stream surface) にも触れておきます。
流面
流れ場の中に閉曲線を描き、その曲線上の各点を通る流線を集めると、一つの面が形成されます。この面を流面と呼びます。流線の定義より、流体は流線を横切らないため、流体は流面も横切りません。
流管
特に閉曲線として閉じた曲線(円など)を選んだとき、流面は管のような形状になります。これが流管です。流管の側面を横切る流れがないため、流管は仮想的なパイプのように振る舞います。
連続の式を流管に適用すると、流管の断面が狭くなるところでは流速が大きくなり、広くなるところでは流速が小さくなることが導かれます。これは ベルヌーイの定理と組み合わせることで、ベンチュリ管やピトー管の原理の理解にもつながります。
まとめ
本記事では、流線・流跡線・流脈線の定義、数学的定式化、およびそれらの相互関係について体系的に解説しました。
- 流線は、ある瞬間の速度場の各点で速度ベクトルに接する曲線であり、オイラー的な「場の構造」を表す。微分方程式 $dx/u = dy/v$ で記述される。
- 流跡線は、個々の流体粒子が時間とともにたどる実際の軌跡であり、ラグランジュ的な「粒子の運動」を表す。微分方程式 $d\bm{x}/dt = \bm{v}(\bm{x}, t)$ で記述される。
- 流脈線は、ある固定点を過去に通過したすべての流体粒子の現在位置を結んだ曲線であり、実験における煙線法で観察される「煙の形」に対応する。
- 定常流では3つの線が一致することを、常微分方程式の自励系としての性質から数学的に証明した。
- 非定常流では3つの線は一般に異なることを、回転する一様流の具体例で示し、流線が直線、流跡線が円、流脈線が螺旋になることを解析的に導出した。
- Pythonを用いて、定常流の流線描画、非定常流での3線比較、渦流れの流線、時間発展する流れ場の可視化を行い、理論的結果を数値的に確認した。
これらの概念は、流体力学のあらゆる場面で登場する基礎的な道具です。流れの可視化実験やCFD解析の結果を正しく解釈するためには、自分が見ている「線」がどの種類であるかを常に意識することが不可欠です。
次のステップとして、以下の記事も参考にしてください。
- ポテンシャル流れ(非粘性非回転流) — 流線と流れ関数の関係をさらに深く学べます
- ナビエ・ストークス方程式 — 速度場を支配する基本方程式です
- 渦度と循環 — 渦流れの理論的背景を学べます
- 層流と乱流 — 流れの遷移と乱流での可視化について理解が深まります
- レイノルズ数 — 流れの状態を特徴づける無次元数です