コイルの作る磁場シミュレーション

# はじめに
電流の作り出す磁場はビオザバールの法則で計算できる。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/de3fc544-c6aa-3df3-a276-46e492108137.png)

```math
H= \frac{\mu_0}{4 \pi} \frac{I dl \times \vec{r}}{| \vec{r}^3 |}
```

https://eleking.net/study/s-electromagnetism/se-biot-savart.html


円形コイルの中心磁場は以下のように計算できる

```math
H = \frac{I}{2r}
```

円中心以外はどうなっているんだろう？
これがテーマです。


# 円形コイル中心の磁場計算：シミュレーション法の検証
表題の内容を計算してみる。

```Python
import math

x  = 0
y = 0


def culc_H(s_x,s_y,e_x,e_y): #電流の向きでstart-endを決めている
    n = 100
    
    #print("("+str(s_x) +"," + str(s_y) + ")" +"->"+ "("+str(e_x) +"," + str(e_y) + ")")
    
    #------計算パート-------
    #l = math.sqrt((s_x - e_x )**2 + (s_y - e_y))
    #dl = l/n
    dl_x = (e_x - s_x)/n
    dl_y = (e_y - s_y)/n
    
    H = 0
    
    for i in range(n):
        r_x = (s_x + dl_x*i) - x
        r_y = (s_y + dl_y*i) - y
        r = math.sqrt(r_x**2 + r_y**2)
        
        if r == 0:
            H = 0
            break
        
        # dl×r/|r|^3  (rの取り方が電流素から計測点への距離だったため、符号を逆にする)
        H = H - (dl_x*r_y - dl_y*r_x)/(r**3)
        #print(r_y)
        
    H = H /4 /math.pi
    return H


# n角多角形

n = 100
r = 1

dtheta = 2*math.pi/n

theta = 0
s_x = r
s_y = 0

H = 0
for i in range(n):
    theta = theta + dtheta
    e_x = r* math.cos(theta)
    e_y = r* math.sin(theta)
    dH = culc_H(s_x,s_y,e_x,e_y)
    H = H + dH
    print(dH)
    
    s_x = e_x
    s_y = e_y


print(H)
```

結果

```math
\begin{eqnarray}
n = 100, r = 1 → H(0,0)/ \mu_0 = 0.500164\\
n = 100, r = 5 → H(0,0)/ \mu_0  = 0.100032\\
n = 10, r = 10 → H(0,0)/ \mu_0  = 0.517121\\
\end{eqnarray}
```

理論値と概ね一致している。

# 中心以外の磁場


```Python
import math
import numpy as np
import matplotlib.pyplot as plt

def culc_H(s_x,s_y,e_x,e_y,x,y): #電流の向きでstart-endを決めている
    n = 100
    
    #print("("+str(s_x) +"," + str(s_y) + ")" +"->"+ "("+str(e_x) +"," + str(e_y) + ")")
    
    #------計算パート-------
    #l = math.sqrt((s_x - e_x )**2 + (s_y - e_y))
    #dl = l/n
    dl_x = (e_x - s_x)/n
    dl_y = (e_y - s_y)/n
    
    H = 0
    
    for i in range(n):
        r_x = (s_x + dl_x*i) - x
        r_y = (s_y + dl_y*i) - y
        r = math.sqrt(r_x**2 + r_y**2)
        
        if abs(r) < 0.01:
            H = 0
            break
        
        # dl×r/|r|^3  (rの取り方が電流素から計測点への距離だったため、符号を逆にする)
        H = H - (dl_x*r_y - dl_y*r_x)/(r**3)
        #print(r_y)
        
    H = H /4 /math.pi
    return H

# n角多角形
def culc_H_xy(x,y):
    
    n = 20
    r = 1
    
    dtheta = 2*math.pi/n
    
    theta = 0
    s_x = r
    s_y = 0
    
    H = 0
    for i in range(n):
        theta = theta + dtheta
        e_x = r* math.cos(theta)
        e_y = r* math.sin(theta)
        dH = culc_H(s_x,s_y,e_x,e_y,x,y)
        H = H + dH
        #print(dH)
        
        s_x = e_x
        s_y = e_y
        
    return H

H = culc_H_xy(0,0)

# グラフ
n = 50
a = 1.2
x = np.linspace(-1*a, a, n)
y = np.linspace(-1*a, a, n)
z = np.zeros((n,n))

for x_i in range(n):
    for y_i in range(n):
        z[y_i,x_i] = culc_H_xy(x[x_i],y[y_i])


# プロットの作成
plt.figure(figsize=(8, 6))
x,y = np.meshgrid(x,y)

sc = plt.scatter(x, y, c=z, cmap='viridis',s=100)
plt.colorbar(sc)
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Z value color map on XY plane using scatter')
plt.show()



fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111,projection='3d')
#ax.set_aspect('equal')
ax.scatter(x,y,z)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

plt.show()
```

r=1の円に対してシミュレーションを実施。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/a053d598-5429-579b-844c-efd76cb3e5bc.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d7c37644-8325-9906-a16e-6d389069984c.png)

ビオザバールの式で$1/r^3$があることから、$r=0$付近の計算は値が不安定になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/663a761b-ae41-6539-385e-40185bbea61b.png)

円環付近は値が大きくなるが、円環の外はほぼ$H=0$、円環内部は$H=0.5$と読める。
中心からの距離と、磁場$H$をグラフにすると以下になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/ca0e28a1-a140-b02a-4e62-0d3f83bd377c.png)


$r=0.5$で中心磁場$H=0.5$とほぼ同じ値になっている。

$r = 0 ～0.8$をグラフにすると以下になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/53934895-3fc2-f56e-9ebe-3466ec16a3d2.png)


# 四角形の磁場

```python
import math
import numpy as np
import matplotlib.pyplot as plt

def culc_H(s_x,s_y,e_x,e_y,x,y): #電流の向きでstart-endを決めている
    n = 100
    
    #print("("+str(s_x) +"," + str(s_y) + ")" +"->"+ "("+str(e_x) +"," + str(e_y) + ")")
    
    #------計算パート-------
    #l = math.sqrt((s_x - e_x )**2 + (s_y - e_y))
    #dl = l/n
    dl_x = (e_x - s_x)/n
    dl_y = (e_y - s_y)/n
    
    H = 0
    
    for i in range(n):
        r_x = (s_x + dl_x*i) - x
        r_y = (s_y + dl_y*i) - y
        r = math.sqrt(r_x**2 + r_y**2)
        
        if abs(r) < 0.001:
            H = 0
            break
        
        # dl×r/|r|^3  (rの取り方が電流素から計測点への距離だったため、符号を逆にする)
        H = H - (dl_x*r_y - dl_y*r_x)/(r**3)
        #print(r_y)
        
    H = H /4 /math.pi
    return H

# 四角形
def culc_H_xy(x,y):
    
    # 四角形　a*bの場合
    a = 1
    b = 1
    
    H = 0
    
    H = H + culc_H(-1*a/2,b/2,-1*a/2,-1*b/2,x,y)  # 左辺
    H = H + culc_H(-1*a/2,-1*b/2,a/2,-1*b/2,x,y)  # 下辺
    H = H + culc_H(a/2,-1*b/2,a/2,b/2,x,y)        # 右辺
    H = H + culc_H(a/2,b/2,-1*a/2,b/2,x,y)        # 上辺        
    
    return H


# グラフ
n = 50
a = 1
x = np.linspace(-1*a, a, n)
y = np.linspace(-1*a, a, n)
z = np.zeros((n,n))

for x_i in range(n):
    for y_i in range(n):
        z[y_i,x_i] = culc_H_xy(x[x_i],y[y_i])


# プロットの作成
plt.figure(figsize=(8, 6))
x,y = np.meshgrid(x,y)

sc = plt.scatter(x, y, c=z, cmap='viridis',s=100)
plt.colorbar(sc)
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Z value color map on XY plane using scatter')
plt.show()

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111,projection='3d')
#ax.set_aspect('equal')
ax.scatter(x,y,z)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/9b6badaf-e77b-df27-6f3c-7924f5275ac4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/dfd92ebb-e5ff-3c68-3388-8aecbaba62d6.png)

$1 \times 1$の長方形のコイルに対し実施した。相変わらず、コイル付近の値は値が大きく出てしまっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/2371accd-f51e-0d3f-d71c-37f7e925652b.png)

四角形の内部は約$H=1.0$に落ち着いている。

# 結論
コイル内部の磁界は思ったより平坦だった。コイル線付近のみ値が大きくなっている。