palette でベクトルの色を変えて gnuplot で電場・磁場を描く

先日,「gnuplot でベクトル場(電場・磁場)を描く」で描いてみたが,いろいろ検索すると palette でベクトルの色を(ベクトルの大きさに合わせて)可変にできるようなので,備忘録として。

点電荷がつくる電場 $\boldsymbol{E}$

位置 $\boldsymbol{r}_1$ にある点電荷 $q_1$ がつくる電場ベクトル $\boldsymbol{E}$ は

\begin{eqnarray}
\boldsymbol{E}
&=& \frac{q_1}{4\pi \varepsilon_0} \frac{\boldsymbol{r} – \boldsymbol{r}_1}{|\boldsymbol{r} – \boldsymbol{r}_1|^3}\end{eqnarray}

$z=0$ の $xy$ 平面で2次元ベクトル場を描く。

$$\boldsymbol{r} = (x, y, 0), \quad \boldsymbol{r}_1 = (x_1, y_1, 0)$$$$E_x = s \frac{x-x_1}{\left((x-x_1)^2 + (y-y_1)^2\right)^{3/2}}$$$$E_y = s \frac{y-y_1}{\left((x-x_1)^2 + (y-y_1)^2\right)^{3/2}}$$

$s$ は $\mbox{scaling}$ 係数。実際の描画の際にベクトルの長さを微調整する係数。

正電荷がつくる電場

In [1]:
# 電場 E
Ex(x, y) = scaling * x/(sqrt(x**2 + y**2)**3)
Ey(x, y) = scaling * y/(sqrt(x**2 + y**2)**3)

# 電場 E の大きさは距離の2乗に反比例
E(x, y) = 1./(x**2 + y**2)

reset
unset xtics
unset ytics
unset border

# special filename "++" のときは
# urange, vrange で描画範囲の設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 13
# y 軸方向のサンプル数
set isosamples 13

# 矢印の長さ調整用
scaling = 0.2

# 正電荷の位置に青丸と +
x1 = 0
y1 = 1
set label 1 point pt 6 ps 1.5 lc "blue" at x1, y1
set label 2 center at first x1, y1 "+" tc "blue"

set title "正電荷がつくる電場"

# colorbox を非表示に
unset colorbox
# palette の cublehelix での設定例: 
# start 0: blue, 1: red, 2: green
# cycles 0 で同一色の濃淡のみに
# saturation 3 が好み
# negative で強いところが濃くなる
set palette cubehelix start 0 cycles 0 saturation 3 negative

# using 始点のx : 始点のy : ベクトルのx成分 : ベクトルのy成分 : variable color 情報
plot "++" u 1:2:(Ex($1-x1,$2-y1)):(Ey($1-x1,$2-y1)):(log(E($1-x1,$2-y1))) \
     w vec notitle lw 4 lc palette filled head

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

電場 $\boldsymbol{E}$ の大きさは電荷からの距離の2乗に反比例するので,上図のようにベクトルの長さが大きく変化する。これはこれで正しいのだが,見やすくするために,以下のように $\boldsymbol{E}$ の向きを表す単位ベクトル場(大きさが $1$)を定義して,ベクトルの向きのみを正しく描画する。

$$\hat{\boldsymbol{E}} \equiv \frac{\boldsymbol{E}}{\sqrt{\boldsymbol{E}\cdot\boldsymbol{E}}} =
\frac{\boldsymbol{r} – \boldsymbol{r}_1}{|\boldsymbol{r} – \boldsymbol{r}_1|}$$$$\hat{E}_x = s \frac{x-x_1}{\sqrt{(x-x_1)^2 + (y-y_1)^2}}$$$$\hat{E}_y = s \frac{y-y_1}{\sqrt{(x-x_1)^2 + (y-y_1)^2}}$$

$s$ は $\mbox{scaling}$ 係数。実際の描画の際にベクトルの長さを微調整する係数。

正電荷がつくる電場の向き

In [2]:
# 電場 E
Ex(x, y) = x/(sqrt(x**2 + y**2)**3)
Ey(x, y) = y/(sqrt(x**2 + y**2)**3)
# 電場 E の大きさ
E(x, y) = sqrt(Ex(x, y)**2 + Ey(x, y)**2)
# 規格化された hat E
hEx(x, y) = scaling * Ex(x, y)/E(x, y)
hEy(x, y) = scaling * Ey(x, y)/E(x, y)

reset
unset xtics
unset ytics
unset border

# special filename "++" のときは
# urange, vrange で描画範囲の設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 19
# y 軸方向のサンプル数
set isosamples 19

# 矢印の長さ調整用
scaling = 0.2

# 正電荷の位置に青丸と +
x1 = 0
y1 = 1
set label 1 point pt 6 ps 1.5 lc "blue" at x1, y1
set label 2 center at first x1, y1 "+" tc "blue"

set title "正電荷がつくる電場の向き"
unset colorbox
set palette cubehelix start 0 cycles 0 saturation 3 negative

plot "++" u 1:2:(hEx($1-x1,$2-y1)):(hEy($1-x1,$2-y1)):(log(E($1-x1,$2-y1))) \
     w vec notitle  lw 4 lc palette filled head

負電荷がつくる電場の向き

In [3]:
# 電場 E
Ex(x, y) = -(x-x2)/(sqrt((x-x2)**2 + (y-y2)**2)**3)
Ey(x, y) = -(y-y2)/(sqrt((x-x2)**2 + (y-y2)**2)**3)
# 電場 E の大きさ
E(x, y) = sqrt(Ex(x, y)**2 + Ey(x, y)**2)
# 規格化された hat E
hEx(x, y) = scaling * Ex(x, y)/E(x, y)
hEy(x, y) = scaling * Ey(x, y)/E(x, y)

reset
unset xtics
unset ytics
unset border

# special filename "++" のときは
# urange, vrange で描画範囲の設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 19
# y 軸方向のサンプル数
set isosamples 19

# 矢印の長さ調整用
scaling = 0.2

# 負電荷の位置に赤丸と -
x2 = 0
y2 = -1
set label 3 point pt 6 ps 1.5 lc "red" at x2, y2
set label 4 center at first x2, y2 "-" tc "red"

set title "負電荷がつくる電場の向き"
unset colorbox
set palette cubehelix start 1 cycles 0 saturation 3 negative

plot "++" u 1:2:(hEx($1,$2)):(hEy($1,$2)):(log(E($1,$2))) \
     w vec notitle lc palette lw 4 filled head

正電荷と負電荷がつくる電場の向き

In [4]:
# 電場 E
Ex(x, y) = x/sqrt(x**2 + y**2)**3
Ey(x, y) = y/sqrt(x**2 + y**2)**3

# 正電荷と負電荷がつくる電場
E2x(x, y) = Ex(x-x1, y-y1) - Ex(x-x2, y-y2)
E2y(x, y) = Ey(x-x1, y-y1) - Ey(x-x2, y-y2)
# 電場の大きさ
E(x, y) = sqrt(E2x(x, y)**2 + E2y(x, y)**2)
# 規格化された hat E
hE2x(x, y) = scaling * E2x(x, y)/E(x, y)
hE2y(x, y) = scaling * E2y(x, y)/E(x, y)

reset
unset xtics
unset ytics
unset border

# special filename "++" のときは
# urange, vrange で描画範囲の設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 19
# y 軸方向のサンプル数
set isosamples 19

# 矢印の長さ調整用
scaling = 0.2

# 正電荷の位置に青丸と +
x1 = 0
y1 = 1
set label 1 point pt 6 ps 1.5 lc "blue" at x1, y1
set label 2 center at first x1, y1 "+" tc "blue"

# 負電荷の位置に赤丸と -
x2 = 0
y2 = -1
set label 3 point pt 6 ps 1.5 lc "red" at x2, y2
set label 4 center at first x2, y2 "-" tc "red"

set title "正電荷と負電荷がつくる電場の向き"
unset colorbox
set palette cubehelix start 2 cycles 0 saturation 3 negative
plot "++" u 1:2:(hE2x($1,$2)):(hE2y($1,$2)):(log(E($1,$2))) \
     w vec notitle lc palette lw 4 filled head

電気双極子がつくる電場

$$\boldsymbol{E} = 3 \frac{\boldsymbol{r}\cdot\boldsymbol{p}}{r^5} \boldsymbol{r}
– \frac{\boldsymbol{p}}{r^3}$$

$\boldsymbol{p} = (0, 1, 0), \quad z = 0$ として

\begin{eqnarray}
E_x &=& \frac{3}{\left( x^2 + y^2 \right)^{5/2}} x y \\
E_y &=& \frac{3}{\left( x^2 + y^2 \right)^{5/2}} y^2 – \frac{1}{\left( x^2 + y^2 \right)^{3/2}} \\
\end{eqnarray}

電気双極子がつくる電場の向き

In [5]:
# 電場 E
Ex(x, y) = 3.* x*y/sqrt(x**2 + y**2)**5 
Ey(x, y) = 3.* y*y/sqrt(x**2 + y**2)**5 - 1./sqrt(x**2 + y**2)**3

# 規格化された hat E
E(x, y) = sqrt(Ex(x, y)**2 + Ey(x, y)**2)
hEx(x,y) = scaling * Ex(x, y)/E(x, y)
hEy(x,y) = scaling * Ey(x, y)/E(x, y)

reset
unset xtics
unset ytics
unset border
set zeroaxis

# special filename "++" のときは
# urange, vrange で設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 19
# y 軸方向のサンプル数
set isosamples 19

scaling = 0.15

# 電気双極子 p
set arrow 1 from 0, -0.2 to 0, 0.2 filled head lw 5 lc "red" lt 1

set title "電気双極子がつくる電場の向き"
unset colorbox
set palette cubehelix start 0 cycles 0 saturation 3 negative

plot "++" u 1:2:(hEx($1,$2)):(hEy($1,$2)):(log(E($1,$2)))\
     w vec notitle lc palette lw 4 filled head

直線電流がつくる磁場 $\boldsymbol{B}$

$$\boldsymbol{B} = \frac{\boldsymbol{I}\times\boldsymbol{\rho}}{\rho^2}$$$$ \boldsymbol{I} = (0, 0, I), \quad \boldsymbol{\rho} = (x, y, 0)$$\begin{eqnarray}
B_x &=& – \frac{ I y}{x^2 + y^2} \\
B_y &=& \frac{ I x}{x^2 + y^2}
\end{eqnarray}

直線電流がつくる磁場

In [6]:
# 磁場 B
Bx(x, y) = - scaling * y/(x**2 + y**2)
By(x, y) =   scaling * x/(x**2 + y**2)
# 磁場 B の大きさ
B(x, y) = 1./sqrt(x**2 + y**2)

reset
unset xtics
unset ytics
unset border
set zeroaxis

# special filename "++" のときは
# urange, vrange で設定
set urange [-3:3]
set vrange [-3:3]
set size ratio 1

# x 軸方向のサンプル数
set samples 19
# y 軸方向のサンプル数
set isosamples 19

scaling = 0.25

# 電線の位置
set label 1 point pt 6 ps 1.5 lc "blue" at 0, 0
set label 2 center at first 0,0 "+" tc "blue"

set title "直線電流がつくる磁場"
unset colorbox
set palette cubehelix start 1 cycles 0 saturation 3 negative

plot "++" u 1:2:(Bx($1,$2)):(By($1,$2)):(log(B($1,$2)))\
     w vec notitle lw 4 lc palette filled head

直線電流がつくる磁場の向き

In [7]:
# 磁場 B
Bx(x, y) = - y/(x**2 + y**2)
By(x, y) =   x/(x**2 + y**2)
# 磁場 B の大きさ
B(x, y) = sqrt(Bx(x, y)**2 + By(x, y)**2)
# 規格化された hat B
hBx(x, y) = scaling * Bx(x, y)/B(x, y)
hBy(x, y) = scaling * By(x, y)/B(x, y)

reset
unset xtics
unset ytics
unset border
set zeroaxis
# 表示範囲の設定
set size ratio 1

# special filename "++" のときは
# urange, vrange で設定
set urange [-3:3]
set vrange [-3:3]

set samples 19
set isosamples 19

scaling = 0.2

# 電線の位置
set label 1 point pt 6 ps 1.5 lc "blue" at 0, 0
set label 2 center at first 0,0 "+" tc "blue"

set title "直線電流がつくる磁場の向き"
unset colorbox
set palette cubehelix start 1 cycles 0 saturation 3 negative

plot "++" u 1:2:(hBx($1,$2)):(hBy($1,$2)):(log(B($1,$2))) \
     w vec notitle lw 4 lc palette filled head