gnuplot でソレノイドを螺旋状にそれらしく描く:アップデート版

ソレノイドを螺旋状にそれらしく描く

円電流回路の重ね合わせとして(手を抜いて)描くのではなく,1本の電線を螺旋状に密に巻いたものとしてソレノイドをそれらしく描く。

すでに「gnuplot でソレノイドを螺旋状にそれらしく描く」でまとめているが,今見ると何をやっているのかわからないので,今回は special file name '++' を活用して,なるべくデータファイルを作らずに描いてみる。

全て special file name '++' で描こうと思ったが,なぜかベクトルを描くと SVG ファイルが巨大になってしまう。対策として,SVG ではなく PNG にする,という手もあるが,今回はベクトルを描く際は,テキストファイルにベクトルの始点と成分を書いておいてそれを読み込むことにした。

Jupyter Notebook でのグラフサイズ設定

svg で inline 表示。

In [1]:
%gnuplot inline svg size 640,640 fixed enhanced font ',14'

関数の定義

螺旋軌道をあらわす $x, y, z$ は

\begin{eqnarray}
x(u) &=& \cos 2\pi u \\
y(u) &=& \sin 2\pi u \\
z(u) &=& \mbox{pitch} \times u
\end{eqnarray}

In [2]:
x(u) = cos(2*pi*u)
y(u) = sin(2*pi*u)

# ソレノイドの「奥」と「手前」を描き分ける際に使う
# 1/0 は数値ではないので,そこは描かない!
yp(u)=(y(u)>=-0.1) ? y(u):1/0
ym(u)=(y(u)<=0.1) ? y(u):1/0

z(u) = pitch * u

splot() で螺旋を描く

In [3]:
reset
# 座標軸の目盛を非表示
unset xtics
unset ytics
unset ztics
unset border
# xy 平面の位置
set xyplane 0
# xyz軸の表示
set zeroaxis
# x y の表示範囲
set xrange [-2:2]
set yrange [-2:2]
# 曲線を滑らかに
set samples 1000

set title "ソレノイド" 

pitch = 0.01
u0 = -0.25
u1 = 20.25

set parametric
splot [u0:u1] x(u), y(u), z(u) lw 3 lc "red" notitle

Out[3]:
	dummy variable is t for curves, u/v for surfaces

'++' を使って螺旋を描く

special file name '++' を使い,using (x(u)):(y(u)):(z(u)) とすることで,あらかじめ設定した urange で parametric plot する。

In [4]:
reset
# 座標軸の目盛を非表示
unset xtics
unset ytics
unset ztics
unset border
# xy 平面の位置
set xyplane 0
# xyz軸の表示
set zeroaxis
# x y の表示範囲
set xrange [-2:2]
set yrange [-2:2]
# 曲線を滑らかに
set samples 1000

set title "ソレノイド" 

pitch = 0.01
u0 = -0.25
u1 = 20.25

set parametric
set urange [u0:u1]

splot '++' using (x(u)):(y(u)):(z(u)) \
           w l lw 3 lc "red" notitle

Out[4]:
	dummy variable is t for curves, u/v for surfaces

palette を使ってグラデーションをつける

lc palette と色指定することで,using (x(u)):(y(u)):(z(u)):(-y(u)) の4番目の値 (-y(u)) に応じた色をつけてくれる。

In [5]:
reset
# 座標軸の目盛を非表示
unset xtics
unset ytics
unset ztics
unset border
# xy 平面の位置
set xyplane 0
# xyz軸の表示
set zeroaxis
# x y の表示範囲
set xrange [-2:2]
set yrange [-2:2]
# 曲線を滑らかに
set samples 1000

set title "ソレノイド" 

# reds.pal 改
set palette defined ( \
  0 '#FCBBA1',\
  1 '#FCBBA1',\
  2 '#FC9272',\
  3 '#FB6A4A',\
  4 '#EF3B2C',\
  5 '#CB181D',\
  6 '#99000D',\
  7 '#600000' \
) 
set key inside sample 2
set title "ソレノイド" 
unset colorbox

pitch = 0.01
u0 = 0
u1 = 20

set parametric
set urange [u0:u1]

splot '++' using (x(u)):(y(u)):(z(u)):(-y(u)) \
           w l lw 5 lc palette title "電流"

Out[5]:
	dummy variable is t for curves, u/v for surfaces

電流のベクトルを追加する

special file name '++' を使ってベクトルを描くこともできるが,なぜか SVG のファイルが巨大になってしまうので,ここではテキストファイル denryu.txt にベクトルの始点と成分を書き込み,そのファイルを読み込んでベクトル表示させる。

In [6]:
set print "denryu.txt"
    print x(u0), y(u0)-1.5, z(u0), 0, 1.5, 0
    print x(u1), y(u1), z(u1), 0, 1, 0
set print

replot "denryu.txt" using 1:2:3:4:5:6:(-y(u0)) \
        w vec lw 5 lc palette notitle

ソレノイドと内部磁場を描く

ソレノイドの「奥」半分を描く

In [7]:
reset
# 座標軸の目盛を非表示
unset xtics
unset ytics
unset ztics
unset border
# xy 平面の位置
set xyplane 0
# xyz軸の表示
set zeroaxis
# x y の表示範囲
set xrange [-2:2]
set yrange [-2:2]
# 曲線を滑らかに
set samples 1000

set title "ソレノイド" 

# reds.pal 改
set palette defined ( \
  0 '#FCBBA1',\
  1 '#FCBBA1',\
  2 '#FC9272',\
  3 '#FB6A4A',\
  4 '#EF3B2C',\
  5 '#CB181D',\
  6 '#99000D',\
  7 '#600000' \
) 
set key inside sample 2
set title "ソレノイド" 
unset colorbox

pitch = 0.01
u0 = 0
u1 = 20

set parametric
set urange [u0:u1]

splot '++' using (x(u)):(yp(u)):(z(u)):(-y(u)) \
           w l lw 5 lc palette title "電流"

Out[7]:
	dummy variable is t for curves, u/v for surfaces

ソレノイドの内部磁場を描く

special file name '++' を使ってベクトルを描くこともできるが,なぜか SVG のファイルが巨大になってしまうので,ここではテキストファイル sole-jiba.txt にベクトルの始点と成分を書き込み,そのファイルを読み込んでベクトル表示させる。

In [8]:
set print "sole-jiba.txt"
  print -0.5, 0, 0, 0, 0, 0.2
  print    0, 0, 0, 0, 0, 0.2
  print  0.5, 0, 0, 0, 0, 0.2
set print

replot "sole-jiba.txt" using 1:2:3:4:5:6 \
        w vec head filled lw 10 lc "green" title "磁場"

ソレノイドの「手前」半分を描く

In [9]:
replot '++' using (x(u)):(ym(u)):(z(u)):(-y(u)) \
              w l lw 5 lc palette notitle,      \
       "denryu.txt" using 1:2:3:4:5:6:(-y(u0))  \
              w vec lw 5 lc palette notitle

urange を少し変更すると不具合が…

前後関係がわかるように,手前を palette で濃いめの色にしている。

In [10]:
unset title

u0 = 0
u1 = 20
set urange [u0:u1]

splot '++' using (x(u)):(y(u)):(z(u)):(-y(u)) \
           w l lw 5 lc palette notitle

しかし,urange をちょっと変更しただけなのに…

In [11]:
u0 = -0.25

set urange [u0:u1]

splot '++' using (x(u)):(y(u)):(z(u)):(-y(u)) \
           w l lw 5 lc palette notitle

どこが手前なのか,わけわからんグラデーションになってしまう。これが不具合。