多数の直線電荷による電位,電界

モジュールのインポート

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')