Matplotlib を使った電気双極子の勾配可視化

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Matplotlib を使って電気双極子の勾配プロットを作成する方法を学びます。三角分割の作成方法、データの微調整方法、および電界の計算方法を学びます。最後に、三角分割、等電位線、およびベクトル場をプロットします。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習します。

時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

点の x 座標と y 座標を作成する

n_angles = 30
n_radii = 10
min_radius = 0.2
radii = np.linspace(min_radius, 0.95, n_radii)

angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi / n_angles

x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()

解説:

  • n_anglesは円の角度の数です。
  • n_radiiは円の数です。
  • min_radiusは円の最小半径です。
  • radiiは半径の配列です。
  • anglesは角度の配列です。
  • xは x 座標の配列です。
  • yは y 座標の配列です。

双極子の電位を計算する

def dipole_potential(x, y):
    """The electric dipole potential V, at position *x*, *y*."""
    r_sq = x**2 + y**2
    theta = np.arctan2(y, x)
    z = np.cos(theta)/r_sq
    return (np.max(z) - z) / (np.max(z) - np.min(z))

V = dipole_potential(x, y)

解説:

  • dipole_potentialは電気双極子の電位を計算する関数です。
  • Vは電気双極子の電位の配列です。

三角分割を作成する

triang = Triangulation(x, y)

triang.set_mask(np.hypot(x[triang.triangles].mean(axis=1),
                         y[triang.triangles].mean(axis=1))
                < min_radius)

解説:

  • Triangulationは一連の点からデロネ三角分割を作成するクラスです。
  • triangTriangulationクラスのインスタンスです。
  • triang.set_maskは不要な三角形をマスクします。

データを微調整する

refiner = UniformTriRefiner(triang)
tri_refi, z_test_refi = refiner.refine_field(V, subdiv=3)

解説:

  • UniformTriRefinerは、より正確なプロットを作成するために三角分割を微調整するクラスです。
  • refinerUniformTriRefinerクラスのインスタンスです。
  • tri_refiz_test_refiはそれぞれ、微調整された三角分割と電位値です。

電界を計算する

tci = CubicTriInterpolator(triang, -V)

(Ex, Ey) = tci.gradient(triang.x, triang.y)
E_norm = np.sqrt(Ex**2 + Ey**2)

解説:

  • CubicTriInterpolatorは 3 次多項式を使ってデータを補間するクラスです。
  • tciCubicTriInterpolatorクラスのインスタンスです。
  • (Ex, Ey)は電界です。
  • E_normは正規化された電界です。

三角分割、等電位線およびベクトル場を描画する

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.use_sticky_edges = False
ax.margins(0.07)

ax.triplot(triang, color='0.8')

levels = np.arange(0., 1., 0.01)
ax.tricontour(tri_refi, z_test_refi, levels=levels, cmap='hot',
              linewidths=[2.0, 1.0, 1.0, 1.0])

ax.quiver(triang.x, triang.y, Ex/E_norm, Ey/E_norm,
          units='xy', scale=10., zorder=3, color='blue',
          width=0.007, headwidth=3., headlength=4.)

ax.set_title('Gradient Plot: Electrical Dipole')
plt.show()

解説:

  • figaxはそれぞれグラフと軸のオブジェクトです。
  • ax.set_aspectは軸のアスペクト比を設定します。
  • ax.use_sticky_edgesax.marginsは軸の余白を設定します。
  • ax.triplotは三角分割を描画します。
  • ax.tricontourは等電位線を描画します。
  • ax.quiverはベクトル場を描画します。
  • ax.set_titleはグラフのタイトルを設定します。

まとめ

この実験では、Matplotlib を使って電気双極子の勾配プロットを作成する方法を学びました。三角分割を作成し、データを微調整し、電界を計算する方法を学びました。最後に、三角分割、等電位線およびベクトル場を描画しました。