循環をもつ一様流が円柱を過ぎる2次元ポテンシャル流れに対して Blasius の第一公式を使って円柱に働く力を計算してみます。
複素速度ポテンシャルで流れを表す
複素変数を 、一様流速 、円柱半径 、循環 、迎角 とおくと、 完全流体中で循環をもつ一様流が円柱にあたるときの流れを表す複素速度ポテンシャルは以下の式で表される。
複素速度は複素速度ポテンシャルを微分することにより
で与えられる。
Blasiusの第一公式で力を計算する
を流体密度、複素速度を 、積分路 を反時計回りとすると、Blasius の第一公式は以下の式で定義される。
計算の際には以下のパラメータを設定した。
- 一様流速
- 円柱半径
- 循環 ( のとき円柱まわりの流れは時計回りで揚力は正の 方向に働く)
- 迎角
- 密度
計算結果は以下のようになった。
なお、ここでの は固定座標系での力の成分である。抗力・揚力を一様流方向に対して定義すると、抗力は常に 0 (ダランベールのパラドックス)、揚力の大きさは (Kutta–Joukowskiの定理) になる。
数値的には、円柱表面または円柱を囲む任意の円周を離散化し、 を台形公式などで近似できる。被積分関数は円柱外部で解析的なので、円柱境界を横切らず、かつ円柱を一回囲むという条件を保つ限り、積分路を変形しても周回積分の値は変わらない。 例えば、円柱表面ではなく、より大きな半径を持つ円周上で積分しても同じ結果が得られる。(円柱内部にある特異点の留数により積分結果が決まる。)
一方、今回のように 複素速度 が明示的に分かっている場合は、 の Laurent 展開から の係数を特定することで解析的に計算できる。
とおくと、
留数は なのでBlasiusの公式に代入すると
迎角 の場合は , となり、働く力を解析的に計算することができた。
また、循環の量を変えながら流線と速度場を描いてみた。






迎角45°の場合。






まとめ
-
実際に計算してみて初めてその式を自分が自由に扱える感覚が身につくような気がする。
-
“Allez en avant, et la foi vous viendra” (前進すれば信仰が訪れる) はダランベールの言葉らしい。
-
圧力分布も計算したので時間があれば今後追記します。
今回のコード
今回の記事で使用したコードを載せておきます。
# -*- coding: utf-8 -*-
import numpy as npimport matplotlib.pyplot as pltfrom scipy.integrate import trapezoid
# フォント指定(文字化け対策)plt.rcParams['font.family'] = 'Meiryo'
# パラメータ設定U = 1.0 # 一様流速a = 1.0 # 円柱の半径Gamma = 4*np.pi*U*a # 循環alpha = np.radians(0) # 迎角#alpha = np.radians(45) # 迎角rho = 1.0 # 密度N = 100 # 格子数
# 複素速度ポテンシャル関数def complex_potential(z, U, a, Gamma, alpha): f = U * (z * np.exp(-1j * alpha) + a**2 * np.exp(1j * alpha) / z) + (1j * Gamma / (2 * np.pi)) * np.log(z / a) return f
# 複素速度関数 (df/dz)def complex_velocity(z, U, a, Gamma, alpha): df_dz = U * (np.exp(-1j * alpha) - a**2 * np.exp(1j * alpha) / z**2) + (1j * Gamma / (2 * np.pi * z)) return df_dz
x = np.linspace(-4, 4, N)y = np.linspace(-4, 4, N)X, Y = np.meshgrid(x, y)Z = X + 1j * Y
# 円柱内部へのマスク処理mask = np.abs(Z) > aZ_mask = np.where(mask, Z, np.nan)
# 複素速度ポテンシャル関数f = complex_potential(Z_mask, U, a, Gamma, alpha)phi = np.real(f) # 速度ポテンシャルpsi = np.imag(f) # 流れ関数
plt.figure(figsize=(8, 8))plt.contour(X, Y, psi, levels=50, cmap='viridis')circle = plt.Circle((0, 0), a, color='black', fill=False)plt.gca().add_artist(circle)plt.xlim(-4, 4)plt.ylim(-4, 4)plt.gca().set_aspect('equal')plt.title(f'循環のある円柱を過ぎる流れ(alpha=0, $\Gamma$=4$\pi$Ua)')plt.xlabel('x')plt.ylabel('y')
plt.show()
# ブラジウスの第一公式の適用theta = np.linspace(0, 2 * np.pi, 1000)z_surf = a * np.exp(1j * theta)df_dz = complex_velocity(z_surf, U, a, Gamma, alpha)force_complex = (1j * rho / 2) * trapezoid((df_dz**2), z_surf)
Fx = force_complex.realFy = -force_complex.imag
print(f"Fx: {Fx:.4f}")print(f"Fy: {Fy:.4f}")