流体力学 scipy

流体力学

Scipyを使用して、流体力学の一部として非圧縮のStokes方程式を数値的に解決し、結果をグラフ化する方法を示します。

問題:非圧縮のStokes方程式の解析と結果の可視化

非圧縮のStokes方程式は、流体の静止または低速な流れを記述するために使用されます。

以下は、この方程式を解いて、流体内の速度分布をプロットするPythonコードの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import numpy as np
import matplotlib.pyplot as plt
from scipy.sparse import lil_matrix
from scipy.sparse.linalg import spsolve

# グリッドの設定
L = 1.0 # 正方形領域の一辺の長さ
Nx = Ny = 50 # グリッドの分割数
dx = dy = L / (Nx - 1) # グリッドステップ
x = np.linspace(0, L, Nx)
y = np.linspace(0, L, Ny)
X, Y = np.meshgrid(x, y)

# 境界条件
u_top = np.ones(Nx)
u_bottom = np.zeros(Nx)
u_left = np.zeros(Ny)
u_right = np.zeros(Ny)

# Stokes方程式の数値解法
N = Nx * Ny
A = lil_matrix((N, N))
B = np.zeros(N)

for i in range(1, Nx - 1):
for j in range(1, Ny - 1):
row = i * Ny + j
A[row, row] = -4 / (dx * dy)
A[row, row - 1] = 1 / (dy ** 2)
A[row, row + 1] = 1 / (dy ** 2)
A[row, row - Ny] = 1 / (dx ** 2)
A[row, row + Ny] = 1 / (dx ** 2)
B[row] = 0 # 初期化

# 境界条件を適用
A = A.tocsr()
for i in range(Nx):
row = i * Ny
A[row, row] = 1
B[row] = u_top[i]
A[row + Ny - 1, row + Ny - 1] = 1
B[row + Ny - 1] = u_bottom[i]

for j in range(Ny):
row = j
A[row, row] = 1
B[row] = u_left[j]
A[row + (Nx - 1) * Ny, row + (Nx - 1) * Ny] = 1
B[row + (Nx - 1) * Ny] = u_right[j]

# 方程式を解く
u = spsolve(A, B)
u = u.reshape((Nx, Ny))

# 結果をプロット
plt.figure(figsize=(8, 6))
plt.contourf(X, Y, u, cmap='viridis')
plt.colorbar()
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Velocity Distribution of the Incompressible Stokes Equation')
plt.show()

このコードは、非圧縮のStokes方程式を解いて、正方形領域内の速度分布を可視化します。

Stokes方程式は流体力学の基本的な方程式の1つであり、この例は数値シミュレーションによって流体の挙動を理解するための高度な問題を示しています。

ソースコード解説

以下にソースコードの詳細な説明を提供します。

1. ライブラリのインポート:

  • まず、必要なライブラリをインポートしています。
    • numpynpとしてエイリアス): 数値計算ライブラリ
    • matplotlib.pyplotpltとしてエイリアス): グラフ描画ライブラリ
    • scipy.sparse.lil_matrix: 疎行列(Sparse Matrix)を表現するためのライブラリの一部
    • scipy.sparse.linalg.spsolve: 疎行列を用いた線形方程式の数値解法を提供するライブラリの一部

2. グリッドの設定:

  • 解析領域のサイズ L と、グリッドの分割数 Nx および Ny を設定しています。
  • グリッドステップ dx および dy は領域サイズを分割数で割ったものです。
  • np.linspace を使用して、xy の値を生成し、np.meshgrid を使用して2次元座標格子 XY を作成します。

3. 境界条件の設定:

  • u_topu_bottomu_left、および u_right という配列を用意して、境界条件を設定します。
    これらの配列は、領域の上端、下端、左端、右端の速度を表しています。

4. Stokes方程式の数値解法:

  • 非圧縮のStokes方程式の数値解法を開始します。
  • 疎行列 A とベクトル B を初期化します。
    これらは線形方程式 Ax = B の係数行列と右辺ベクトルです。
  • ネストされたループを使用して、各グリッドポイントに対して差分方程式を適用し、A 行列と B ベクトルを構築します。
  • このステップでは、有限差分法を使用して方程式を離散化しています。

5. 境界条件の適用:

  • A 行列と B ベクトルに境界条件を適用します。
    これにより、領域の境界上の速度制約が反映されます。

6. 方程式の解法:

  • A 行列と B ベクトルから線形方程式 Ax = B を解くために spsolve 関数を使用します。
    これにより、速度フィールド u が計算されます。

7. 結果のプロット:

  • 最後に、計算された速度フィールド u を可視化します。
  • plt.contourf を使用して、速度の分布をカラーマップとしてプロットします。
    速度が色の濃さで表現されています。
  • カラーバー、軸ラベル、タイトルなどのプロットの詳細も設定されています。

このコードは、非圧縮のStokes方程式を数値的に解く方法を示し、その解を視覚的に理解するのに役立ちます。
速度場の分布が非圧縮の流体の挙動を示しており、科学や工学の多くの応用分野で使用されています。

グラフ解説

非圧縮のStokes方程式の数値解を示すグラフについて詳しく説明します。

このグラフは、正方形領域内の非圧縮流体の速度分布を表しています。

非圧縮Stokes方程式は、流体の静止または低速な流れを記述するために使用されます。以下はグラフの詳細です:

1. カラーマップ:

  • グラフはカラーマップで表示されており、色が速度の大きさを示しています。
    色の濃さが速度の大きさを表しており、濃い色ほど速度が大きいことを示します。

2. X軸とY軸:

  • X軸とY軸は正方形領域内の座標を表しており、グラフの広がりを示しています。
    グリッドの分割数がNx=Ny=50であるため、50x50の領域を表示しています。

3. カラーバー:

  • グラフの右側にカラーバーが表示されており、色と速度の対応を示しています。
    カラーバーの値が大きいほど速度が高いことを示しています。

4. タイトル:

  • グラフのタイトルは「Velocity Distribution of the Incompressible Stokes Equation」となっており、グラフの内容を要約しています。

このグラフは、流体内の速度が非圧縮のStokes方程式に従ってどのように分布するかを示しています。
特に、このグラフは境界条件(境界上の速度制約)に基づいて計算された速度分布を表しています。

カラーマップの色が一様でないことに注目してください。
これは速度が領域内で異なることを示しており、流体の速度勾配を反映しています。

非圧縮Stokes方程式は、静止した流体または低速流れを扱う際に非常に重要であり、このようなシミュレーションは工学物理学流体力学などの分野で使用されます。