接地球形導体と点電荷¶
半径$a$の接地導体球の中心を座標原点におき,点電荷$Q$ [C]を$x=f$ [m]($y=z=0$)におく. 導体球を取り除き,影像電荷$Q'$ [C]をおく.導体球の電位がゼロ,導体球表面の接線電界がゼロより,影像電荷の位置$x'$($y=z=0$),電荷量$Q'$は,次のようになる. \begin{gather} x' = \frac{a^2}{f}\\ Q' = -\frac{a}{f} Q \end{gather}
from json.encoder import INFINITY
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import numpy as np
from scipy.integrate import solve_ivp
from scipy.integrate import odeint
from scipy import optimize
import scienceplots
plt.style.use(['science', 'notebook'])
#plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
plt.rcParams['font.family'] = 'serif' # font familyの設定
plt.rcParams['mathtext.fontset'] = 'cm' # math fontの設定
$N$個の点電荷$Q_i$ [C]が位置ベクトル$\boldsymbol{r}_i$ [m]($i=1,2, \cdots, N$)にあるとき,観測点$\boldsymbol{r}$ [m]の静電界$\boldsymbol{E}_i$ [N/C]は,クーロンの法則より次式で与えられる. \begin{gather} \boldsymbol{E} = \sum_{i=1}^N \boldsymbol{E}_i\\ \boldsymbol{E}_i = \frac{1}{4 \pi \epsilon_0} \frac{Q_i(\boldsymbol{r}-\boldsymbol{r}_i)}{|\boldsymbol{r}-\boldsymbol{r}_i|^3} \end{gather} ここで,$\epsilon_0= 8.842 \times 10^{-12}$ [F/m]は真空中の誘電率を示し, \begin{gather} \frac{1}{4 \pi \epsilon_0} = 9 \times 10^9 \end{gather} また,電位$V$は, \begin{gather} V = \frac{1}{4 \pi \epsilon_0} \sum_{i=1}^N \frac{Q_i}{R_i}\\ R_i = |\boldsymbol{r}-\boldsymbol{r}_i| \end{gather}
def p1charge3(r, rd, q):
qk = q/4.0/np.pi
rr = r-rd
norm = np.linalg.norm(rr, axis=2, keepdims=True)
v = qk / norm
with np.errstate(divide="ignore", invalid="ignore"):
e = qk*rr/norm**3
return e, v
a = 0.7 # 同耐久の半径
f = 3.0 # 点電荷の位置 x=f
q = np.array([1.0, -a/f])# 電荷量
nq = len(q)# 点電荷の数
rdi = np.array([[f, 0.0, 0.0],[a**2/f,0.0,0.0]])# 点電荷の位置ベクトル
#a**2/f
# 直角座標系(x,y)で表した観測点
x_min, x_max, n_x = -5.0, 5.0, 100
y_min, y_max, n_y = -5.0, 5.0, 100
x = np.linspace(x_min, x_max, n_x)
y = np.linspace(y_min, y_max, n_y)
xx, yy = np.meshgrid(x,y, indexing='xy')# xy座標の並び (デフォルト)
zz = np.ones(xx.shape)*1.0e-10
r = np.stack([xx,yy,zz], axis=-1)
e = np.zeros(r.shape)
vv = np.zeros([n_x,n_y,1])
vv.shape
for i in range(len(q)):
rd = rdi[i].reshape(1, 1, -1)
ei, vi = p1charge3(r, rd, q[i])
e = e + ei
vv = vv + vi
vvv = vv.reshape(xx.shape)
e_x = e[:,:,0]
e_y = e[:,:,1]
e_z = e[:,:,2]
vvv = vv.reshape(xx.shape)
#vvv.min(), vvv.max()
emax = np.array([e_x.max(), e_y.max()])
emaxx = emax.max()
e_x = e_x/emaxx
e_y = e_y/emaxx
#emaxx
phi_min, phi_max, n_phi = 0.0, 2.0*np.pi, 181
phi = np.linspace(phi_min, phi_max, n_phi)
sp = a*np.sin(phi)
cp = a*np.cos(phi)
x_1, y_1 = cp, sp
# --- 導体球内の点をマスク ---
R = a # 導体の半径
center = np.array([0.0, 0.0])
distance = np.sqrt((xx - center[0])**2 + (yy - center[1])**2)
mask = distance < R
e_x_masked = np.copy(e_x)
e_y_masked = np.copy(e_y)
e_x_masked[mask] = np.nan
e_y_masked[mask] = np.nan
fig = plt.figure(figsize=(8, 8)) # グラフ領域の作成
v = np.linspace(-0.3, 0.3, 11)
e_amp = np.sqrt(e_x**2+e_y**2)
# --- 導体球内の点をマスク ---
R = a # 導体の半径
center = np.array([0.0, 0.0])
distance = np.sqrt((xx - center[0])**2 + (yy - center[1])**2)
mask = distance < R
# 電位のマスク(導体内部を一定値にする)
vvv_masked = np.copy(vvv)
vvv_masked[mask] = np.nan # または一定値に設定
# 電場ベクトルのマスク
e_x_masked = np.copy(e_x)
e_y_masked = np.copy(e_y)
e_x_masked[mask] = np.nan
e_y_masked[mask] = np.nan
# 電気力線を描画(マスクされた電場ベクトルを使用)
plt.streamplot(xx, yy, e_x_masked, e_y_masked, color='orange', density=1.0, linewidth=1.5)
# 等電位線を描画(マスクされた電位を使用)
ax = plt.contour(x, y, vvv_masked, levels=v, linewidths=0.8)
ax.clabel(fmt='%1.1f', inline=1, fontsize=7)
plt.contourf(x, y, vvv_masked, levels=v, cmap="bwr")
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.axis('scaled')
# カラーバーの目盛りを区切りのいい数値に設定
cbar = plt.colorbar(pad=0.1, shrink=0.77, orientation="vertical")
cbar.set_ticks(np.linspace(-0.3, 0.3, 7)) # -0.3から0.3まで7段階
plt.plot(f, 0.0, 'o', color='green')
plt.plot(a**2/f, 0.0, 'o', color='red')
plt.plot(x_1, y_1, color='white')
# 導体球を描画
circle = Circle((0.0, 0.0), a, color='gray', alpha=0.3, zorder=10)
plt.gca().add_patch(circle)
fig.savefig('v_e1_b.pdf')
plt.show()