4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

リング状磁石の磁界分布

Last updated at Posted at 2020-12-03

#概要
リング状磁石の磁界分布を計算することが目標です.
リング中心の磁界は,理論的に積分すれば簡単に求まるのですが,任意位置(x,y,z)に対する磁気力の強さはきれいな関数で求まりません.

\int \frac{1}{\sqrt{ a - b cos(x) - c sin(x)}} dx
=-(2 sec(tan^(-1)(b/c) + x) sqrt(a - b cos(x) - c sin(x)) sqrt((-c sqrt(b^2/c^2 + 1) + b cos(x) + c sin(x))/(a - c sqrt(b^2/c^2 + 1))) sqrt((c (sqrt(b^2/c^2 + 1) + sin(x)) + b cos(x))/(a + c sqrt(b^2/c^2 + 1))) F_1(1/2;1/2, 1/2;3/2;(a - b cos(x) - c sin(x))/(a + sqrt(b^2/c^2 + 1) c), (a - b cos(x) - c sin(x))/(a - sqrt(b^2/c^2 + 1) c)))/(c sqrt(b^2/c^2 + 1))

WolframAlphaで計算した結果です.とてもめんどくさい関数になります.

今回は実際の磁石の寸法が決まっており,どんな感じになるかを知りたいので,数値シミュレーションで計算をしてみようと思います.

#計算方法
磁気力は

f=k\frac{q1q2}{|\vec r|^3} \vec r

に従うとします.今回は,$f/q2$を各座標(x,y,z)で計算します.

リング全体(半径r,中心座標(0,0,0),x-y平面に存在)で磁価q2を持つとすると線密度磁化mは

2 \pi r m = q2

になります.
$d\theta$による磁気力$\vec {df}$は

\vec {df} = k\frac{q1*mrd\theta}{|\vec r|^3} \vec r\\
\vec r = (x-rcos(\theta),y-rsin(\theta),z)

になるはずです.

$\vec f $は$\vec {df}$は$d\theta$で積分すれば計算できるはずです(ポテンシャル法もありますが,微分したくないのでベクトルでやってます).

#シミュレーション
結果はz軸に対し線対称になるはずです.よって,y座標は0とします(y=0).x-zでの結果のみで十分となります.
結果はベクトルで(x,y,z方向があるので),位置zを固定し,位置xに対するfx/q2,fy/q2,fz/q2の三つのグラフを計算します.

df_x = k\frac{q1*mr d\theta}{(x^2+z^2+r^2-2xr cos(\theta))^{3/2}} (x-rcos(\theta))\\
df_z = k\frac{q1*mr d\theta}{(x^2+z^2+r^2-2xr cos(\theta))^{3/2}} z

を$d\theta$で積分します.数値積分で,単純に長方形積分をします.

def func_fx(x,z):
    dtheta = 0.01
    theta = 0
    
    fx=0
    #fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    
    
    while True:
        if theta >= math.pi:
            break
        fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        #fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fx

def func_fz(x,z):
    dtheta = 0.01
    theta = 0
    
    #fx=0
    fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    
    
    while True:
        if theta >= math.pi:
            break
        #fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fz

こんな感じに関数化できました.

#シミュレーション結果
設定

r=1\\
kq1=1\\
m=1\\
z=1

fx.png
fz.png
fx-fz.png

直感的に考察しても,結果と一致します.
fx.png
一つ意外だったのは,fzはリング内ではほとんど変化がないことです.

fz.png

zの位置を変えてシミュレーションを回すと次のようになります.

z=3

fx-3.png
fz-3.png
fx-fz-3.png

性質はあまり変わりませんが,山の大きさが変わりました.

#シミュレーションコード

import math

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def func_fx(x,z):
    dtheta = 0.01
    theta = 0
    
    fx=0
    #fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    
    
    while True:
        if theta >= math.pi:
            break
        fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        #fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fx

def func_fz(x,z):
    dtheta = 0.01
    theta = 0
    
    #fx=0
    fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    
    
    while True:
        if theta >= math.pi:
            break
        #fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fz


#グラフ化
x = np.arange(0, 5.0, 0.01)
fx=[]
fz=[]
z_fix = 3
for i in x:
    hoge = func_fx(i,z_fix)
    fx= np.append(fx,hoge)
  
for i in x:
    hoge = func_fz(i,z_fix)
    fz= np.append(fz,hoge)
    
plt.plot(x,fx)
plt.plot(x,fz)


#3次元グラフ
#fx
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)

X, Y = np.meshgrid(x, y)
#z_fix = 1
fx= func_fx(X**2+Y**2, z_fix)

fig = plt.figure()
ax = Axes3D(fig)

ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("fx(x, y)")

ax.plot_wireframe(X, Y, fx)
plt.show()


#fz
#z_fix = 1
fz= func_fz(X**2+Y**2, z_fix)

fig2 = plt.figure()
ax2 = Axes3D(fig2)

ax2.set_xlabel("x")
ax2.set_ylabel("y")
ax2.set_zlabel("fz(x, y)")

ax2.plot_wireframe(X, Y, fz)
plt.show()

#追記:NS
よく考えたら,NSの2極があるので,そこも考慮しなければいけなかったですね.
磁石長さhを設定して再度シミュレーションします.

\vec {df} = k\frac{q1*mrd\theta}{|\vec r|^3} \vec r  - k\frac{q1*mrd\theta}{|\vec r2|^3} \vec r2\\
\vec r = (x-rcos(\theta),y-rsin(\theta),z)
\vec r2 = (x-rcos(\theta),y-rsin(\theta),z+h)

となります.

h=0.5\\
r=1\\
kq1=1\\
m=1\\
z=3

fx.png

fz.png
x-z.png

形状はあまり変わりませんでしたが,高さは大きく小さくなりました.


import math

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def func_fx(x,z):
    dtheta = 0.01
    theta = 0
    
    fx=0
    #fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    h=0.5
    
    
    while True:
        if theta >= math.pi:
            break
        fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        fx = fx - kq*m*r*dtheta/((x**2+(z+h)**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        #fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fx

def func_fz(x,z):
    dtheta = 0.01
    theta = 0
    
    #fx=0
    fz=0
    
    #パラメータ
    r=1
    kq=1
    m=1 #線密度
    h=0.5
    
    while True:
        if theta >= math.pi:
            break
        #fx = fx + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(x-r*math.cos(theta))
        fz = fz + kq*m*r*dtheta/((x**2+z**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z)
        fz = fz - kq*m*r*dtheta/((x**2+(z+h)**2+r**2-2*x*r*math.cos(theta))**(3/2)) *(z+h)
        
        theta = theta + dtheta
        
    # print(fx)
    # print(fz)
    return fz


#グラフ化
x = np.arange(0, 5.0, 0.01)
fx=[]
fz=[]
z_fix = 3
for i in x:
    hoge = func_fx(i,z_fix)
    fx= np.append(fx,hoge)
  
for i in x:
    hoge = func_fz(i,z_fix)
    fz= np.append(fz,hoge)
    
figxz = plt.figure()
plt.plot(x,fx)
plt.plot(x,fz)
figxz.savefig("x-z.png")

#3次元グラフ
#fx
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)

X, Y = np.meshgrid(x, y)
#z_fix = 1
fx= func_fx(X**2+Y**2, z_fix)

fig = plt.figure()
ax = Axes3D(fig)

ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("fx(x, y)")

ax.plot_wireframe(X, Y, fx)
plt.show()
fig.savefig("fx.png")

#fz
#z_fix = 1
fz= func_fz(X**2+Y**2, z_fix)

fig2 = plt.figure()
ax2 = Axes3D(fig2)

ax2.set_xlabel("x")
ax2.set_ylabel("y")
ax2.set_zlabel("fz(x, y)")

ax2.plot_wireframe(X, Y, fz)
plt.show()
fig2.savefig("fz.png")

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?