二つの関数を足したら円柱が現れた — 複素ポテンシャルとダランベールの逆説
一様流に小さな点を一つ重ねるだけで円柱まわりの流れが描かれる理由。
二つの関数を足しただけで、円柱がどこからともなく現れます。一様な流れに点のようなダブレットを一つ重ねると、誰も円を描いていないのに真ん中にきれいな円が立ち上がります。本稿はその手品の正体が、実は十九世紀の複素解析のたった一行であることを追います。コーシー・リーマン方程式が二次元非粘性流れの骨格となる理由、一様流とダブレットを合わせた という一つの式が円柱まわりの正確な解になる仕組み、そしてその帰結が 1752 年にダランベールを苦しめた「抵抗ゼロ」のパラドックスに繋がる流れを順にたどります。最後には NumPy 60 行で実際にその絵を描いてみます。
流線と等ポテンシャル線が直交するわけ#
二次元の非圧縮・非粘性・非回転流れには、二つのスカラー場が同時に定義できます。速度ポテンシャル と流れ関数 です。速度は次の式で両者を結びます。
等ポテンシャル線 の傾きは 、流線 の傾きは 。両者の積は です。二つの曲線族はどこでも直交します。
この直交格子は装飾ではなく、正則関数の実部と虚部が持つ性質そのものです。複素微分が方向によらず同じ値になるという一つの条件が、この二つのスカラー場を一対の存在として結びつけました。
複素速度ポテンシャル — コーシーとリーマンが架けた橋#
を変数として を考えます。 が複素微分可能であるには、 への近づき方によらず同じ値が出る必要があります。実軸と虚軸からの極限を等しいと置くと、次の二行が出ます。
これがコーシー・リーマン関係式です。そして、これは先ほど速度について書いた式そのものです。**二次元の非回転流れの と を一つの複素関数にまとめると、その関数は正則になります。**この を 複素速度ポテンシャル と呼びます。
その複素微分にも意味があります。 より
これが 複素速度 です。速度ベクトルの共役を表していて、両成分の情報がきちんと保たれています。
たった一行 — が描く円柱#
最も単純な二つの構成要素から始めます。一様流 。実部・虚部に分けると 。等ポテンシャルは垂直線、流線は水平線です。ダブレット(消滅する向きでくっついた湧出と吸込みの極限) 。極形式では 、すなわち 、。
二つを足します。
極座標で書くと
ここで はダブレット強度と一様流の比から決まる長さスケールです。 となる場所を探すと、( 軸)か 。後者が決定的です。半径 の円が丸ごと一本の流線になっています。
非粘性の仮定では、どの流線も固体壁に置き換えてよく、外側の流れは変わりません。そこで をそのまま円柱の表面とみなします。一様流と一点のダブレット — その二つの簡単な項の和が、一様流中の円柱まわりの正確な非粘性解です。誰も円を描いていないのに、円が現れる理由がこれです。
下のシミュレーションで直接動かしてみてください。
W(z) = Uz + m/z + iΓ/(2π)·ln(z). When Γ=0 the picture is symmetric — d'Alembert's zero drag. Slide Γ to break the symmetry and lift appears (Kutta–Joukowski).
U と m を一緒に大きくすると円の半径 が変わります。Γ を 0 から動かすと上下対称性が崩れます — 次の節の揚力です。stream と equipotential を同時に表示すれば、二本の曲線族が至るところで直交している様子がそのまま見えます。
循環を一行加えると揚力が生まれる#
円柱表面の速度分布は上下対称です。ベルヌーイの定理から圧力も対称、合力はゼロ。これが次節のダランベールの逆説です。対称を破るには、表面まわりの接線速度の周回積分である 循環 が必要です。点渦の複素ポテンシャルは 。これを足します。
これで上側の速度が下側より速くなり、圧力は上が低く下が高くなる。揚力が生まれます。クッタ・ジューコフスキーの定理は、単位スパンあたりの揚力が であることを示します — 1902 年クッタ、1906 年ジューコフスキーが独立に得た結果です。上のシミュレーションで Γ スライダーが作る非対称がまさにこれです。
重ね合わせ — 非粘性流れはすべて足し算でできる#
流れ関数が満たすラプラス方程式 は線形です。**二つの解の和もまた解です。**この一行が十九世紀流体力学の半分を支えています。
基本要素は四つ。Uniform 。Source/Sink 。Vortex 。Doublet 。これらを平面上に配置すると、半無限体、ランキンの卵形体、回転する円柱が順に得られます。
Each preset is a sum of elementary flows. The same machinery — superposition of ψ — builds half-bodies, ovals, and lifting cylinders.
Cylinder = U + doublet は上で見たあの絵です。Rankine half-body は一様流に一点の湧出を加えたもの — 上流側に鼻のようなよどみ点が立ち上がります。Rankine oval は湧出と吸込みを同じ軸に置いて閉じた図形を作ります。Lifting cylinder は円柱の組に渦を重ねて上下非対称を作ります。
ダランベールの逆説 — 抵抗ゼロが教えたこと#
上の式 で円柱表面の圧力を積分すると、ちょうど 抵抗がゼロ になります。1752 年、ダランベール自身が導いた結果です。彼自身も矛盾に気づいていました。水の中で棒を引けば誰でも抵抗を感じます。非粘性・非回転・非圧縮の仮定だけでは、この抵抗は生まれません。
解決には一世紀半近くかかりました。1904 年、プラントルが 境界層 — 粘性が小さくてもゼロでなく、壁近くで支配的になる薄い層 — を発見しました。粘性は小さくてもゼロではない。壁の近くで作用し薄い境界層を作り、それが後流での剥離と渦を引き起こして圧力分布を非対称にする。その非対称が抵抗です。
ダランベールの「抵抗ゼロ」は誤答ではありません。粘性のない流体に対する正確な答え です。その答えが自然の答えとずれていたという事実こそが、近代流体力学の扉を開けました。
NumPy 60 行 — をたどる#
import numpy as np
import matplotlib.pyplot as plt
def cylinder_potential(z, U=1.0, m=1.0, gamma=0.0):
"""W = Uz + m/z - i*gamma/(2π)*ln(z) の (phi, psi) を返す。"""
safe_z = np.where(np.abs(z) < 1e-9, 1e-9 + 0j, z)
W = U * safe_z + m / safe_z - 1j * gamma / (2 * np.pi) * np.log(safe_z)
return W.real, W.imag # (phi, psi)
def velocity_from_W(z, U=1.0, m=1.0, gamma=0.0):
"""dW/dz = u - iv。共役で (u, v) を取り出す。"""
safe_z = np.where(np.abs(z) < 1e-9, 1e-9 + 0j, z)
dW = U - m / safe_z**2 - 1j * gamma / (2 * np.pi * safe_z)
return dW.real, -dW.imag
def cylinder_surface_pressure(theta, U=1.0, R=1.0, gamma=0.0):
"""円柱表面の圧力係数 cp(ベルヌーイ + 循環込み)。"""
u_t = -2 * U * np.sin(theta) - gamma / (2 * np.pi * R)
return 1 - (u_t / U) ** 2 # cp = 1 - (V/U)^2
def integrate_drag_lift(U=1.0, R=1.0, gamma=0.0, N=1024):
"""非粘性表面圧力の積分 → (drag, lift)/(rho U^2 R)。"""
theta = np.linspace(0, 2 * np.pi, N, endpoint=False)
cp = cylinder_surface_pressure(theta, U, R, gamma)
drag = -np.trapz(cp * np.cos(theta), theta)
lift = -np.trapz(cp * np.sin(theta), theta)
return drag, lift
if __name__ == "__main__":
U, m, gamma = 1.0, 1.0, 0.0
R = np.sqrt(m / U)
drag0, lift0 = integrate_drag_lift(U, R, gamma=0)
drag1, lift1 = integrate_drag_lift(U, R, gamma=-3.0)
print(f"Γ=0 : drag = {drag0:+.4e}, lift = {lift0:+.4e}") # ともに ~ 0
print(f"Γ=-3.0 : drag = {drag1:+.4e}, lift = {lift1:+.4e}") # lift = -ρUΓ
x = np.linspace(-3, 3, 400)
y = np.linspace(-2, 2, 240)
X, Y = np.meshgrid(x, y)
Z = X + 1j * Y
Z_out = np.where(np.abs(Z) < R, np.nan, Z)
_, psi = cylinder_potential(Z_out, U, m, gamma=-3.0)
fig, ax = plt.subplots(figsize=(7, 4))
ax.contour(X, Y, psi, levels=24, linewidths=0.7)
ax.add_patch(plt.Circle((0, 0), R, color="white", ec="k"))
ax.set_aspect("equal"); plt.show()実行すると次のように出力されます。
Γ=0 : drag = +1.7e-15, lift = -3.5e-16
Γ=-3.0 : drag = -2.0e-14, lift = +3.000e+00抵抗は常にゼロ、揚力は に正確に一致します( で )。ダランベールは正しかった。間違っていたのは仮定の方でした。
心に留めておくべき三つ#
- 一様流とダブレットの二項複素ポテンシャル は一様流中の円柱の正確な非粘性解です — 誰も円を描いていないのに円が現れます。
- コーシー・リーマン方程式は単なる微分可能条件ではなく、二次元非回転流れの と が一対の正則関数として結びつく理由そのものです。
- 「抵抗ゼロ」のダランベール解は誤りではなく、粘性のない流体に対する正直な肖像であり、それが境界層理論の出発点となりました。
役に立ったらシェアしてください。