\usepackagecancel

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

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

点電荷による電場 E

正の点電荷による電場

位置 r1 に正の点電荷 q1 がある場合の電場は

E=q14πε0rr1|rr1|3

電場の向きを表す単位ベクトル E^

E^EEE=rr1|rr1|

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 軸上の一様な線電荷密度 λ(C/m) による電場は,r(x,y,0), r2rr としてまとめると

E=λ2πε0rr2

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

Exxx2+y2Exyx2+y2

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

E^=EEE

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=0yz 平面上の一様な電荷密度 σ による電場は

Ex=σ2ε0x|x|Ey=0Ez=0

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

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")$

直線電流による磁場 B

z 軸の電流 I による磁場は,I=(0,0,I)ρ=(x,y,0) として

B=12πε0c2I×ρρρ

B が常に z 軸からの位置ベクトル ρ に垂直であることから,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")$