「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|}$$
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
)$
/* 弘大 JupyterHub では
set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig01d.svg")$
負の点電荷による電場
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
)$
/* 弘大 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}}}$$
/* 弘大 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])$ */
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)
)$
/* 弘大 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}
となり,面電荷に垂直で大きさは一定。
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
)$
/* 弘大 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 版
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
)$
/* 弘大 JupyterHub では
set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig07d.svg")$
draw3d 版
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)
)$
/* 弘大 JupyterHub では
set_draw_defaults(file_name="~/.maxplot",terminal='svg)$
されているので。*/
system("cp ~/.maxplot.svg ./maxvec-fig08d.svg")$