Maxima で簡単な電気力線・磁力線を描く

gnuplot で座標をファイルから読み込んで電気力線・磁力線を描く」の Maxima 版。

点電荷による電場 $\boldsymbol{E}$

正の点電荷による電場

位置 $\boldsymbol{r}_1$ に正の点電荷 $q_1$ がある場合の電場は

$$\boldsymbol{E} = \frac{q_1}{4\pi \varepsilon_0}
\frac{\boldsymbol{r} – \boldsymbol{r}_1}{|\boldsymbol{r} – \boldsymbol{r}_1|^3}$$

電場の向きを表す単位ベクトル $\hat{\boldsymbol{E}}$ は

$$\hat{\boldsymbol{E}}
\equiv \frac{\boldsymbol{E}}{\sqrt{\boldsymbol{E}\cdot\boldsymbol{E}}}
= \frac{\boldsymbol{r} – \boldsymbol{r}_1}{|\boldsymbol{r} – \boldsymbol{r}_1|}$$

In [1]:
kill(all)$
/* 正電荷の位置 */
[x1, y1]: [0, 1]$

/* 電気力線 */
the(j):= %pi/8 * j$
xy_line: 
  makelist(
    parametric(x1 + r*cos(the(j)), y1 + r*sin(the(j)), r, 0.2, 5), 
      j, 0, 15)$

/* 電場ベクトルの向き hat E */
Ex(x, y):= (x-x1)/sqrt((x-x1)**2 + (y-y1)**2)$
Ey(x, y):= (y-y1)/sqrt((x-x1)**2 + (y-y1)**2)$

/* 2次元ベクトルは vector([始点のx, 始点のy], [x成分, y成分]) */
vecE(x, y):= vector([x, y], scaling*[Ex(x, y), Ey(x, y)])$

/* ベクトルの始点用座標ファイル */
/* 矢印の混雑防止のため適宜間引く */
r(i):= i/2$
scaling: 0.2$

coordxy: makelist()$
for i:2 thru 8 step 3 do(
  for j:0 thru 16 do(
    coordxy: 
      append(coordxy,[[x1+r(i)*cos(the(j)), y1+r(i)*sin(the(j))]])
  )
)$

/* ベクトル場のデータ */
vecfE: makelist(vecE(k[1], k[2]), k, coordxy)$

draw2d(
  font = "Arial", font_size = 16,
  nticks = 100,
  xrange = [-3.5, 3.5], yrange = [-3.5, 3.5], 
  proportional_axes=xy,
  xaxis = true, yaxis = true,
  xtics = false, ytics = false,
  title = "正電荷による電場",
  
  /* 正電荷の位置 */
  color = black,
  point_size = 1.5, 
  point_type = 6, 
  points([[x1, y1]]),
  label(["+", x1, y1]),   

  /* 電気力線 */
  line_width = 1,
  color = blue,
  xy_line, 
  
  /* ベクトルの矢の設定 */
  head_length = 0.1,
  head_angle  = 20, 
  /* 電場ベクトルの向き */
  line_width = 4,
  vecfE
)$

In [2]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig01d.svg")$

負の点電荷による電場

In [3]:
kill(all)$
/* 負電荷の位置 */
[x2, y2]: [0, -1]$

/* 電気力線 */
the(i):= %pi/8 * j$
xy_line: 
  makelist(
    parametric(x2 + r*cos(the(i)), y2 + r*sin(the(i)), r, 0.2, 5), 
      j, 0, 15)$

/* 電場ベクトルの向き hat E */
Ex(x, y):= -(x-x2)/sqrt((x-x2)**2 + (y-y2)**2)$
Ey(x, y):= -(y-y2)/sqrt((x-x2)**2 + (y-y2)**2)$

/* 2次元ベクトルは vector([始点のx, 始点のy], [x成分, y成分]) */
vecE(x, y):= vector([x, y], scaling*[Ex(x, y), Ey(x, y)])$

/* ベクトルの始点用座標ファイル */
/* 矢印の混雑防止のため適宜間引く */
r(i):= i/2$
scaling: 0.2$

coordxy: makelist()$
for i:2 thru 8 step 3 do(
  for j:0 thru 16 do(
    coordxy: 
      append(coordxy,[[x2+r(i)*cos(the(i)), y2+r(i)*sin(the(i))]])
  )
)$

/* ベクトル場のデータ */
vecfE: makelist(vecE(k[1], k[2]), k, coordxy)$

draw2d(
  font = "Arial", font_size = 16,
  nticks = 100,
  xrange = [-3.5, 3.5], yrange = [-3.5, 3.5], 
  proportional_axes=xy,
  xaxis = true, yaxis = true,
  xtics = false, ytics = false,
  title = "負電荷による電場",
  
  /* 負電荷の位置 */
  color = black,
  point_size = 1.5, 
  point_type = 6, 
  points([[x2, y2]]),
  label(["ー", x2, y2]),   

  /* 電気力線 */
  line_width = 1,
  color = blue,
  xy_line, 
  
  /* ベクトルの矢の設定 */
  head_length = 0.1,
  head_angle  = 20, 
  /* 電場ベクトルの向き */
  line_width = 4,
  vecfE
)$

In [4]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig02d.svg")$

一様な線電荷による電場

$z$ 軸上の一様な線電荷密度 $\lambda (\mbox{C}/\mbox{m})$ による電場は,$\boldsymbol{r} \equiv (x, y, 0), \ r^2 \equiv \boldsymbol{r} \cdot\boldsymbol{r} $ としてまとめると

$$\boldsymbol{E} = \frac{\lambda}{2\pi\varepsilon_0} \frac{\boldsymbol{r}}{r^2}$$

定数部分を適宜規格化して

\begin{eqnarray}
E_x &\Rightarrow& \frac{x}{x^2 + y^2} \\
E_x &\Rightarrow& \frac{y}{x^2 + y^2} \\
\end{eqnarray}

規格化して,電場の向きを表す単位ベクトルは

$$\hat{\boldsymbol{E}} = \frac{\boldsymbol{E}}{\sqrt{\boldsymbol{E}\cdot\boldsymbol{E}}}$$

In [5]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されている。*/
/* 設定を追加する場合の例。追加する項目だけでなく,全部書く必要あり。
   fig のサイズを 640x640 に変更。 default では [600,500] */
/* set_draw_defaults(file_name="~/.maxplot", terminal='svg, 
                     dimensions=[640,640])$ */
In [6]:
kill(all)$
/* 電場ベクトル E */
Ex(x, y):= x/(x**2 + y**2)$
Ey(x, y):= y/(x**2 + y**2)$

/* 規格化された電場ベクトル hat E*/
E(x, y):= sqrt(Ex(x, y)**2 + Ey(x, y)**2)$
hEx(x, y):= Ex(x, y)/E(x, y)$
hEy(x, y):= Ey(x, y)/E(x, y)$

/* 電気力線 */
/* parametric() で描く動径方向の直線のリストとする */
the(j):= %pi/6 * j$
E_line(z):=  
  makelist(
    parametric(r*cos(the(j)), r*sin(the(j)), z, r, 0.2, 3), 
      j, 0, 11)$

/* 電場ベクトルの始点 */
coordxyz: makelist()$
for z:0 thru 2 step 2 do(
  for i: 0 thru 11 do(
    th: 2*%pi/12 * i,
    for j: 3 thru 3 step 1 do(
      coordxyz: append(coordxyz, [[0.5*j*cos(th), 0.5*j*sin(th), z]])
    )
  )
)$

/* 3次元ベクトルは */
/* vector([始点のx, 始点のy, 始点のz], [x成分, y成分, z成分]) */
scaling: 0.4$
vechE(x, y, z):= vector([x, y, z], scaling*[hEx(x, y), hEy(x, y), 0])$

/* ベクトル場のデータ */
vecfhE: makelist(vechE(k[1], k[2], k[3]), k, coordxyz)$

draw3d(
  /* title のフォントサイズの変更例。gnuplot の流儀。 */
  title = "{/=16 一様な線電荷による電場}", 

  xrange = [-3, 3], yrange = [-3, 3], zrange = [0, 3], 
  xtics = false, ytics = false, ztics = false,
  xaxis=true, yaxis=true, zaxis=true,
  xyplane = 0, 
  view = [60, 15],
  
  /* 線電荷 */
  color = black, 
  line_width = 4, key = "線電荷",
  parametric(0,0,v, v, 0, 2.5), 
  key="",
  /* ベクトルの矢の設定 */
  head_length = 0.1,
  head_angle  = 20, 
  line_width = 3,
  color = "#C6DBEF", 
  vecfhE, 

  /* 電気力線 */
  colorbox = false,
  /* blues.pal 改 */
  palette = ["#DEEBF7", 
             "#C6DBEF", 
             "#9ECAE1", 
             "#6BAED6", 
             "#4292C6", 
             "#2171B5", 
             "#084594", 
             "#000040"], 
  /* 電場 E の大きさで色の濃淡をつける */
  enhanced3d = E(r,0), 
  E_line(0), E_line(2)
)$

In [7]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig-sen.svg")$

一様な面電荷による電場

$x = 0$ の $yz$ 平面上の一様な電荷密度 $\sigma$ による電場は

\begin{eqnarray}
E_x &=& \frac{\sigma}{2 \varepsilon_0} \frac{x}{|x|} \\
E_y &=& 0 \\
E_z &=& 0
\end{eqnarray}

となり,面電荷に垂直で大きさは一定。

In [8]:
kill(all)$

/* 電磁場ベクトルをリストにする */
/* x > 0 側 */
vechE1: makelist(vector([0.5, 0, zi], [3, 0, 0]), zi, -2, 2)$
/* x < 0 側 */
vechE2: makelist(vector([-1.2, 0, zi], [-3, 0, 0]), zi, -2, 2)$

draw3d(
  /* title のフォントサイズの変更例。gnuplot の流儀。 */
  title = "{/=16 一様な面電荷による電場}", 

  xrange = [-3, 3], yrange = [-3, 3], zrange = [-3, 3], 
  xaxis = true, 
  xtics = false, ytics = false, ztics = false,
  axis_3d = false, xyplane=-3,
  view = [60, 20],
  
  /* x=0 (yz 平面) */
  color = gray30,
  /* 刻みを細かくして塗りつぶし感を出す */
  xu_grid = 240,
  yv_grid = 240,
  parametric_surface(0, u, v, u, -5, 5, v, -5, 5), 
  
  /* 電磁場ベクトル */
  color = blue,
  line_width = 4,
  head_length = 0.2,
  head_angle  = 20, 
  vechE1, vechE2
)$

In [9]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig-men.svg")$

直線電流による磁場 $\boldsymbol{B}$

$z$ 軸の電流 $I$ による磁場は,$\boldsymbol{I} = (0, 0, I)$, $\boldsymbol{\rho} = (x, y, 0)$ として

$$\boldsymbol{B} = \frac{1}{2\pi \varepsilon_0 c^2}
\frac{\boldsymbol{I}\times\boldsymbol{\rho}}{\boldsymbol{\rho}\cdot\boldsymbol{\rho}} $$

$\boldsymbol{B}$ が常に $z$ 軸からの位置ベクトル $\boldsymbol{\rho}$ に垂直であることから,$\boldsymbol{B}$ を接ベクトルとする磁力線は $z$ 軸を中心とした円であることがわかる。

draw2d 版

In [10]:
kill(all)$

/* 磁力線 */
/* 電線に近い方が密で太くなるようにしてみる */
B_lines: 
  makelist(
    [line_width = i+1, 
     polar(3*(2./3)**i, theta, 0, 2*%pi)], i, 0, 5)$

/* 磁場ベクトルの矢印リストを作成 */
scaling: 0.5$
vecs1: 
  makelist(
    [line_width = i+1,
     vector([3*(2./3)**i, 0],
     scaling*[0, 1])], i, 0, 5, 2)$
vecs2: 
  makelist(
    [line_width = i+1,
     vector([-3*(2./3)**i, 0],
     scaling*[0, -1])], i, 0, 5, 2)$

vecs3: 
  makelist(
    [line_width = i+1,
     vector([0, 3*(2./3)**i],
     scaling*[-1, 0])], i, 1, 5, 2)$

vecs4: 
  makelist(
    [line_width = i+1,
     vector([0, -3*(2./3)**i],
     scaling*[1, 0])], i, 1, 5, 2)$

/* draw2d でグラフにする */
draw2d(
  /* 全体的なフォントの設定例 */
  font = "Arial", font_size = 16, 
  title = "直線電流による磁場",
  nticks = 100,
  
  xrange = [-3.5, 3.5], yrange = [-3.5, 3.5], 
  proportional_axes=xy,
  xaxis = true, yaxis = true,
  xtics = false, ytics = false,

  /* 電線の位置 */
  color = red,
  point_size = 2, 
  point_type = 6, 
  points([[0, 0]]), 
  label(["・", 0, 0]),   

  /* 磁力線 */
  color = forest_green,   
  B_lines,
  
  /* 磁場ベクトル */
  head_length = 0.1,
  head_angle  = 20, 
  vecs1, vecs2, vecs3, vecs4
)$

In [11]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig07d.svg")$

draw3d 版

In [12]:
kill(all)$

/* 磁力線 */
/* 電線に近い方が密で太くなるようにしてみる */
r(i):= 3*(2./3)**i$

/* 奥の磁力線 */
B_linesp(z):= 
  makelist(
    [line_width = i+1, 
     parametric(r(i)*cos(th), r(i)*sin(th), z, th, 0, %pi)], i, 0, 5)$

/* 手前の磁力線 */
B_linesm(z):= 
  makelist(
    [line_width = i+1, 
     parametric(r(i)*cos(th), r(i)*sin(th), z, th, %pi, 2*%pi)], i, 0, 5)$

/* 磁場ベクトルの矢印リストを作成 */
scaling: 0.6$

vecs1(z):= 
  makelist(
    [line_width = i+1,
     vector([3*(2./3)**i, 0, z],
     scaling*[0, 1, 0])], i, 0, 4, 2)$

vecs2(z):= 
  makelist(
    [line_width = i+1,
     vector([-3*(2./3)**i, 0, z],
     scaling*[0, -1, 0])], i, 0, 4, 2)$

/* draw3d でグラフにする */
draw3d(
  /* 全体的なフォントの設定例 */
  font = "Arial", font_size = 16, 
  title = "直線電流による磁場",
  nticks = 100,
  
  xrange = [-3.5, 3.5], yrange = [-3.5, 3.5], 
  xaxis = true, yaxis = true,
  xtics = false, ytics = false, ztics = false,
  zrange = [0, 3], 
  xyplane = 0,
  view = [50,30],
  
  /* 奥の磁力線 */
  color = forest_green,   
  B_linesp(0), B_linesp(2.5),
  
  /* 電流 */
  head_length = 0.3,
  head_angle  = 20,
  line_width = 4,
  color = red,
  vector([0,0,0], [0, 0, 3]),
  
  /* 手前の磁力線 */
  color = forest_green,   
  B_linesm(0), B_linesm(2.5),

  /* 磁場ベクトル */
  head_length = 0.2,
  head_angle  = 10, 
  vecs1(0), vecs1(2.5), vecs2(0), vecs2(2.5)
)$

In [13]:
/* 弘大 JupyterHub では 
   set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
   されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig08d.svg")$