はじめに
ビオザバールの法則は、電流が流れている微小区間の線分の周りの磁場を算出することができる。ただ、微小区間の線分の周りであるため、実際には線分の全区間で微小磁場を積分する必要性がある。
ビオザバールの法則は、積分および外積を用いるため、抽象度が高く電磁気学を学ぶ大学初年度の学生にとっては難解である。
そこで、今回はPythonを用いた数値計算を行うことで、実際に磁場の様子をベクトルとして3次元に表現する。
具体的には、以下のような直線のワイヤー、円形のワイヤー、ソレノイドコイルワイヤーに電流を流したときの磁場を3次元のグラフ上に図示する。
直線ワイヤー
円形ワイヤー
ソレノイドコイルワイヤー
ビオザバールの法則
ビオザバールの法則の法則は、以下のように与えられる。
表現の仕方はいろいろあるが、今回はベクトルの外積を用いた表現とする。
ただし、真空の空間とする。
\Delta\textbf{ B}=\frac{\mu_0}{4\pi} \frac{I\Delta \textbf{s}\times \textbf{r}}{r^3}
したがって、求める磁場全体は以下のようになる。
\textbf{B}=\int_{\textbf{C}}\frac{\mu_0}{4\pi} \frac{I\textbf{ds}\times \textbf{r}}{r^3}
ただし、ワイヤーの形状を$C$とする。また、$d\textbf{s}$はワイヤーの微小線要素である。
プログラム
ただし、以下のことに注意してプログラムを作成した。
・ビオザバールの法則の$r^3$はスカラーであるため、ベクトルである$\textbf{r}$のノルムを計算に用いた。
・外積はnumpyのcross関数を用いた。
・r=0の場合の例外処理も行なった。
・x_ary,y_ary,z_aryがワイヤーの曲線プロットである。(直線および円形がある)
・電流Iは直流で一様であるとする。
・各ワイヤーの形状はコメントの切り替えを行うことで変更する。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
from mpl_toolkits.mplot3d.axes3d import Axes3D
fig = plt.figure(figsize=(9, 7))
ax = fig.add_subplot(111, projection='3d')
n = 100 # ワイヤー分割数
L = 1
n_grid = 10 # 観測点グリッド数
mu_0 = 4 * math.pi * 1e-7
I = 1
# 円形ワイヤーの座標
theta=np.linspace(0, 2 * math.pi, n)
x_ary = L * np.cos(theta)
y_ary = L * np.sin(theta)
z_ary = x_ary*0
# 直線ワイヤーの座標
# x_ary = np.linspace(-L, L, n)
# y_ary = x_ary
# z_ary = x_ary
# ソレノイドコイルの座標(n=1000程度にする)
# N=10
# theta=np.linspace(0, 2 * math.pi*N, n)
# x_ary = L * np.cos(theta)
# y_ary = L * np.sin(theta)
# z_ary = np.linspace(-L/2, L/2, n)
def dB(x, y, z, i):
r = np.array([x, y, z]) - np.array([x_ary[i], y_ary[i], z_ary[i]])
r_norm = np.linalg.norm(r)
if r_norm == 0:
return np.array([0.0, 0.0, 0.0])
ds = np.array([x_ary[i] - x_ary[i-1], y_ary[i] - y_ary[i-1], z_ary[i] - z_ary[i-1]])
return mu_0 * I * np.cross(ds, r) / (4 * math.pi * r_norm**3)
def B(x, y, z):
B_total = np.array([0.0, 0.0, 0.0])
for i in range(1, n):
B_total += dB(x, y, z, i)
return B_total
xx, yy, zz = np.meshgrid(
np.linspace(-L, L, n_grid),
np.linspace(-L, L, n_grid),
np.linspace(-L, L, n_grid),
)
B_x = np.zeros((n_grid, n_grid, n_grid))
B_y = np.zeros((n_grid, n_grid, n_grid))
B_z = np.zeros((n_grid, n_grid, n_grid))
for i in range(n_grid):
for j in range(n_grid):
for k in range(n_grid):
Bv = B(xx[i, j, k], yy[i, j, k], zz[i, j, k])
B_x[i, j, k] = Bv[0]
B_y[i, j, k] = Bv[1]
B_z[i, j, k] = Bv[2]
# 矢印の長さを対数スケールで正規化(強弱を色で表現)
magnitude = np.sqrt(B_x**2 + B_y**2 + B_z**2)
magnitude[magnitude == 0] = 1e-30
norm = magnitude / magnitude.max()
B_xn = B_x / magnitude
B_yn = B_y / magnitude
B_zn = B_z / magnitude
# カラーマップで磁場強度を表現
colors = plt.cm.plasma(norm.ravel())
ax.quiver(
xx, yy, zz,
B_xn, B_yn, B_zn,
length=0.25,
colors=colors,
normalize=False,
arrow_length_ratio=0.3,
)
# 電流ワイヤーを描画
ax.plot(x_ary, y_ary, z_ary, color='red', linewidth=3, label='電流ワイヤー')
ax.scatter(x_ary[0], y_ary[0], z_ary[0], color='green', s=80, zorder=5)
ax.scatter(x_ary[-1], y_ary[-1], z_ary[-1], color='orange', s=80, zorder=5)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('ビオ・サバールの法則による磁場ベクトル場(3D)')
ax.legend()
# カラーバー(磁場強度)
sm = plt.cm.ScalarMappable(cmap='plasma', norm=plt.Normalize(0, magnitude.max()))
sm.set_array([])
plt.colorbar(sm, ax=ax, shrink=0.5, label='磁場強度 [T]')
plt.tight_layout()
plt.savefig("ビオ・サバールの法則による磁場のベクトル場表示_円形.png", dpi=150)
plt.show()
結果
以下に、直線、円形ワイヤーそれぞれの場合の結果を示す。
直線ワイヤー
直線ワイヤの周りに磁場ベクトルが円を描きながら存在している。
円形ワイヤー
円形ワイヤーの中心に行くほど大きな磁場が生じている。
また、ワイヤーの近くでは、流れが対流している。
ソレノイドコイルワイヤー
ソレノイドコイルワイヤーでは中心付近で、鉛直方向に強い磁場が生じる。
まとめ
今回は、抽象度が高く難解とされるビオザバールの法則について扱った。
ビオザバールの法則は抽象度が高いため、どのような形状のワイヤーにも応用することが可能である。
そこで、今回は感覚的な理解をするため、ビオザバールの法則によって計算される磁場のベクトルを図示した。
Pythonはこのような抽象度の高い数式を上手く図示するのに役立つ。しかし、計算量が多くなりがちなので、そこには注意するべきだろう。
参考文献
ビオザバールの法則について
Pythonを用いたベクトル場の図示について


