多数の直線電荷による電位,電界
モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])
ユーザ関数
1つの直線電荷による電界,電位は,
def p1charge_line(r, rd, q):
qk = q/2.0/np.pi
rr = r-rd
norm = np.linalg.norm(rr, axis=2, keepdims=True)
v = -qk * np.log(norm)
with np.errstate(divide="ignore", invalid="ignore"):
e = qk*rr/norm**2
return e, v
これより,複数の平行な直線電荷による電界,電位は,
def pncharge_line(r, rdn, q):
rd = rdn[0].reshape(1, 1, -1)
e, v = p1charge_line(r, rd, q[0])
if len(q)>=2:
for i in range(len(q)-1):
rd = rdn[i+1].reshape(1, 1, -1)
ei, vi = p1charge_line(r, rd, q[i+1])
e = e + ei
v = v + vi
return e,v
2次元分布の値をフォーマット付きで出力するため,
def table(sh,sv,h,v,f): # 数表の作成(フォーマットで整頓した出力)
print(f"{sh:>6s}",end=' ')
nh = len(h)
nv = len(v)
[print(f"{h[j]:6.3f}",end=' ') for j in range(nh)]
print('')
print(f"{sv:>6s}",end=' ')
print('')
for i in range(nv):
print(f'{v[i]:6.3f}',end=' ')
[print(f"{f[i][j]:6.3f}",end=' ') for j in range(nh)]
print('')
return
テキストの図1.3(b)の点電荷を直線電荷に置き換えて,
# Fig.1.3(b) に対応:2本の直線状電荷(符号は逆)
q1 = np.array([1.0, -1.0]) # 点電荷の電荷量
rd1_p = np.array([[0.0, 1.0]]) # 正の点電荷の位置ベクトル
rd1_m = np.array([[0.0, -1.0]]) # 負の点電荷の位置ベクトル
rd1 = np.concatenate([rd1_p, rd1_m])
q1, rd1
(array([ 1., -1.]),
array([[ 0., 1.],
[ 0., -1.]]))
2次元分布を求めるため,メッシュグリッドのデータを求めておくと,
# 直角座標系(x,y)で表した観測点
x = np.linspace(-3, 3, 13)
y = np.linspace(-3, 3, 13)
xx, yy = np.meshgrid(x,y, indexing='xy') # xy座標の並び (デフォルト)
r = np.stack([xx,yy], axis=-1)
これより,電界および電位を求めると,
r00 = np.array([0.0, 0.0])
e00, vv00 = pncharge_line(r00, rd1, q1)
r0 = np.array([0.0, 0.9])
e0, vv0 = pncharge_line(r0, rd1, q1)
e1, vv1 = pncharge_line(r, rd1, q1)
e_x = e1[:,:,0]/e00[0,0,1]
e_y = e1[:,:,1]/e00[0,0,1]
vvv = vv1[:,:,0]/vv0[0:,0:,0]
ただし,電位は電荷の周辺のある点で規格化している.また,電界は原点の電界の振幅で値で規格化している.
これより,電界の$x$成分$e_x$は,
table('x','y',x,y,e_x)
x -3.000 -2.500 -2.000 -1.500 -1.000 -0.500 0.000 0.500 1.000 1.500 2.000 2.500 3.000
y
-3.000 -0.055 -0.066 -0.075 -0.079 -0.071 -0.043 -0.000 0.043 0.071 0.079 0.075 0.066 0.055
-2.500 -0.063 -0.079 -0.098 -0.115 -0.116 -0.080 -0.000 0.080 0.116 0.115 0.098 0.079 0.063
-2.000 -0.067 -0.090 -0.123 -0.164 -0.200 -0.173 -0.000 0.173 0.200 0.164 0.123 0.090 0.067
-1.500 -0.064 -0.092 -0.138 -0.212 -0.331 -0.462 -0.000 0.462 0.331 0.212 0.138 0.092 0.064
-1.000 -0.051 -0.078 -0.125 -0.213 -0.400 -0.941 nan 0.941 0.400 0.213 0.125 0.078 0.051
-0.500 -0.029 -0.045 -0.075 -0.133 -0.246 -0.400 -0.000 0.400 0.246 0.133 0.075 0.045 0.029
0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000
0.500 0.029 0.045 0.075 0.133 0.246 0.400 -0.000 -0.400 -0.246 -0.133 -0.075 -0.045 -0.029
1.000 0.051 0.078 0.125 0.213 0.400 0.941 nan -0.941 -0.400 -0.213 -0.125 -0.078 -0.051
1.500 0.064 0.092 0.138 0.212 0.331 0.462 -0.000 -0.462 -0.331 -0.212 -0.138 -0.092 -0.064
2.000 0.067 0.090 0.123 0.164 0.200 0.173 -0.000 -0.173 -0.200 -0.164 -0.123 -0.090 -0.067
2.500 0.063 0.079 0.098 0.115 0.116 0.080 -0.000 -0.080 -0.116 -0.115 -0.098 -0.079 -0.063
3.000 0.055 0.066 0.075 0.079 0.071 0.043 -0.000 -0.043 -0.071 -0.079 -0.075 -0.066 -0.055
同様にして,電界の$y$成分$E_y$は,
table('x','y',x,y,e_y)
x -3.000 -2.500 -2.000 -1.500 -1.000 -0.500 0.000 0.500 1.000 1.500 2.000 2.500 3.000
y
-3.000 0.003 -0.008 -0.025 -0.050 -0.082 -0.112 -0.125 -0.112 -0.082 -0.050 -0.025 -0.008 0.003
-2.500 0.016 0.006 -0.012 -0.046 -0.099 -0.160 -0.190 -0.160 -0.099 -0.046 -0.012 0.006 0.016
-2.000 0.033 0.029 0.015 -0.021 -0.100 -0.238 -0.333 -0.238 -0.100 -0.021 0.015 0.029 0.033
-1.500 0.055 0.062 0.063 0.047 -0.028 -0.308 -0.800 -0.308 -0.028 0.047 0.063 0.062 0.055
-1.000 0.077 0.098 0.125 0.160 0.200 0.235 nan 0.235 0.200 0.160 0.125 0.098 0.077
-0.500 0.094 0.127 0.179 0.267 0.431 0.800 1.333 0.800 0.431 0.267 0.179 0.127 0.094
0.000 0.100 0.138 0.200 0.308 0.500 0.800 1.000 0.800 0.500 0.308 0.200 0.138 0.100
0.500 0.094 0.127 0.179 0.267 0.431 0.800 1.333 0.800 0.431 0.267 0.179 0.127 0.094
1.000 0.077 0.098 0.125 0.160 0.200 0.235 nan 0.235 0.200 0.160 0.125 0.098 0.077
1.500 0.055 0.062 0.063 0.047 -0.028 -0.308 -0.800 -0.308 -0.028 0.047 0.063 0.062 0.055
2.000 0.033 0.029 0.015 -0.021 -0.100 -0.238 -0.333 -0.238 -0.100 -0.021 0.015 0.029 0.033
2.500 0.016 0.006 -0.012 -0.046 -0.099 -0.160 -0.190 -0.160 -0.099 -0.046 -0.012 0.006 0.016
3.000 0.003 -0.008 -0.025 -0.050 -0.082 -0.112 -0.125 -0.112 -0.082 -0.050 -0.025 -0.008 0.003
また,電位は,
table('x','y',x,y,vvv)
x -3.000 -2.500 -2.000 -1.500 -1.000 -0.500 0.000 0.500 1.000 1.500 2.000 2.500 3.000
y
-3.000 -0.111 -0.132 -0.156 -0.182 -0.208 -0.228 -0.235 -0.228 -0.208 -0.182 -0.156 -0.132 -0.111
-2.500 -0.108 -0.132 -0.162 -0.199 -0.239 -0.273 -0.288 -0.273 -0.239 -0.199 -0.162 -0.132 -0.108
-2.000 -0.100 -0.126 -0.162 -0.211 -0.273 -0.340 -0.373 -0.340 -0.273 -0.211 -0.162 -0.126 -0.100
-1.500 -0.085 -0.111 -0.149 -0.208 -0.299 -0.436 -0.547 -0.436 -0.299 -0.208 -0.149 -0.111 -0.085
-1.000 -0.062 -0.084 -0.118 -0.173 -0.273 -0.481 -inf -0.481 -0.273 -0.173 -0.118 -0.084 -0.062
-0.500 -0.033 -0.046 -0.065 -0.100 -0.162 -0.273 -0.373 -0.273 -0.162 -0.100 -0.065 -0.046 -0.033
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.500 0.033 0.046 0.065 0.100 0.162 0.273 0.373 0.273 0.162 0.100 0.065 0.046 0.033
1.000 0.062 0.084 0.118 0.173 0.273 0.481 inf 0.481 0.273 0.173 0.118 0.084 0.062
1.500 0.085 0.111 0.149 0.208 0.299 0.436 0.547 0.436 0.299 0.208 0.149 0.111 0.085
2.000 0.100 0.126 0.162 0.211 0.273 0.340 0.373 0.340 0.273 0.211 0.162 0.126 0.100
2.500 0.108 0.132 0.162 0.199 0.239 0.273 0.288 0.273 0.239 0.199 0.162 0.132 0.108
3.000 0.111 0.132 0.156 0.182 0.208 0.228 0.235 0.228 0.208 0.182 0.156 0.132 0.111
次に,電位の等高線図を描くために,サンプル点数を増やして,
# 直角座標系(x,y)で表した観測点
nxy = 201
x = np.linspace(-3, 3, nxy)
y = np.linspace(-3, 3, nxy)
xx, yy = np.meshgrid(x,y, indexing='xy') # xy座標の並び (デフォルト)
r = np.stack([xx,yy], axis=-1)
電位,電界を求めると,
r0 = np.array([0.0, 0.9])
e0, vv0 = pncharge_line(r0, rd1, q1)
e1, vv1 = pncharge_line(r, rd1, q1)
e_x = e1[:,:,0]
e_y = e1[:,:,1]
vvv = vv1[:,:,0]/vv0[0:,0:,0]
これより,プロットして,
fig = plt.figure(figsize=(8, 8)) # グラフ領域の作成
v = np.linspace(-1.0, 1.0, 21)
plt.streamplot(xx, yy, e_x, e_y, color='orange', density=1.0, linewidth=1.5)
ax = plt.contour(x, y, vvv, levels=v, linewidths=0.8) # 等高線表示
ax.clabel(fmt='%1.1f', inline=1, fontsize=7) # 等高線の値を表示
plt.contourf(x, y, vvv, levels=v, cmap="bwr") # twilight_shifted, bwr
plt.axis('scaled')
plt.colorbar(pad=0.1, shrink=0.77, orientation="vertical")
plt.plot(rd1_m[:,0], rd1_m[:,1],'o', color = 'green')
plt.plot(rd1_p[:,0], rd1_p[:,1],'o', color = 'red')
fig.savefig('e_v_by_line-charges_1_3_b.pdf')
カット面の電位をプロットすると,
fig = plt.figure() # グラフ領域の作成
plt.xlabel("$x, y$") # x軸のラベル設定
plt.ylabel("V") # y軸のラベル設定
plt.ylim(-1.5, 1.5) # y軸範囲の設定
plt.plot(r[:,nxy//2,1], vvv[:,nxy//2], label='$x=0$')
plt.plot(r[nxy//2,:,0], vvv[nxy//2,:], label='$y=0$')
plt.legend(ncol=1, loc='lower right', fancybox=False, frameon=True)
fig.savefig('e_v_by_line-charges_1_3_b_xy.pdf')
テキストの図1.4(a)の点電荷を直線電荷に置き換えて,
# Fig.1.4(a) に対応
q1 = np.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0])
rd1_p = np.array([[-1.0, 1.0],[0.0, 1.0],[1.0, 1.0]]) # 正の点電荷の位置ベクトル
rd1_m = np.array([[-1.0, -1.0],[0.0, -1.0],[1.0, -1.0]]) # 負の点電荷の位置ベクトル
rd1 = np.concatenate([rd1_p, rd1_m])
rd1
array([[-1., 1.],
[ 0., 1.],
[ 1., 1.],
[-1., -1.],
[ 0., -1.],
[ 1., -1.]])
電位,電界を求めると,
r0 = np.array([0.0, 0.9])
e0, vv0 = pncharge_line(r0, rd1, q1)
e1, vv1 = pncharge_line(r, rd1, q1)
e_x = e1[:,:,0]
e_y = e1[:,:,1]
vvv = vv1[:,:,0]/vv0[0:,0:,0]
プロットして,
fig = plt.figure(figsize=(8, 8)) # グラフ領域の作成
v = np.linspace(-1.0, 1.0, 21)
plt.streamplot(xx, yy, e_x, e_y, color='orange', density=1.0, linewidth=1.5)
ax = plt.contour(x, y, vvv, levels=v, linewidths=0.8)# 等高線表示
ax.clabel(fmt='%1.1f', inline=1, fontsize=7)# 等高線の値を表示
plt.contourf(x, y, vvv, levels=v, cmap="bwr")# twilight_shifted, bwr
plt.axis('scaled')
plt.colorbar(pad=0.1, shrink=0.77, orientation="vertical")
plt.plot(rd1_m[:,0], rd1_m[:,1],'o', color = 'green')
plt.plot(rd1_p[:,0], rd1_p[:,1],'o', color = 'red')
fig.savefig('e_v_by_line-charges_1_4_a.pdf')
同様にして,テキストの図1.4(b)の点電荷を直線電荷に置き換えて,
# Fig.1.4(b) に対応
q1 = np.array([1.0, 1.0, -1.0, -1.0])
rd1_p = np.array([[2.0, 0.0],[1.0, 0.0]])
rd1_m = np.array([[-1.0, 0.0],[-2.0, 0.0]])
rd1 = np.concatenate([rd1_p, rd1_m])
rd1
array([[ 2., 0.],
[ 1., 0.],
[-1., 0.],
[-2., 0.]])
電位,電界は,
r0 = np.array([-1.9, 0.0])
e0, vv0 = pncharge_line(r0, rd1, q1)
e1, vv1 = pncharge_line(r, rd1, q1)
e_x = e1[:,:,0]
e_y = e1[:,:,1]
vvv = vv1[:,:,0]/vv0[0:,0:,0]
プロットして,
fig = plt.figure(figsize=(8, 8)) # グラフ領域の作成
v = np.linspace(-1.0, 1.0, 21)
plt.streamplot(xx, yy, e_x, e_y, color='orange', density=1.0, linewidth=1.5)
ax = plt.contour(x, y, vvv, levels=v, linewidths=0.8)# 等高線表示
ax.clabel(fmt='%1.1f', inline=1, fontsize=7)# 等高線の値を表示
plt.contourf(x, y, vvv, levels=v, cmap="bwr")# twilight_shifted, bwr
plt.axis('scaled')
plt.colorbar(pad=0.1, shrink=0.77, orientation="vertical")
plt.plot(rd1_m[:,0], rd1_m[:,1],'o', color = 'green')
plt.plot(rd1_p[:,0], rd1_p[:,1],'o', color = 'red')
fig.savefig('e_v_by_line-charges_1_4_b.pdf')
前のページに戻る
「目次」のページに戻る