ソレノイドを螺旋状にそれらしく描く
円電流回路の重ね合わせとして(手を抜いて)描くのではなく,1本の電線を螺旋状に密に巻いたものとしてソレノイドをそれらしく描く。
すでに「gnuplot でソレノイドを螺旋状にそれらしく描く」でまとめているが,今見ると何をやっているのかわからないので,今回は special file name '++'
を活用して,なるべくデータファイルを作らずに描いてみる。
全て special file name '++'
で描こうと思ったが,なぜかベクトルを描くと SVG ファイルが巨大になってしまう。対策として,SVG ではなく PNG にする,という手もあるが,今回はベクトルを描く際は,テキストファイルにベクトルの始点と成分を書いておいてそれを読み込むことにした。
Jupyter Notebook でのグラフサイズ設定
svg
で inline 表示。
%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}
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()
で螺旋を描く
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
'++'
を使って螺旋を描く
special file name '++'
を使い,using (x(u)):(y(u)):(z(u))
とすることで,あらかじめ設定した urange
で parametric plot する。
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
palette を使ってグラデーションをつける
lc palette
と色指定することで,using (x(u)):(y(u)):(z(u)):(-y(u))
の4番目の値 (-y(u))
に応じた色をつけてくれる。
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 "電流"
電流のベクトルを追加する
special file name '++'
を使ってベクトルを描くこともできるが,なぜか SVG のファイルが巨大になってしまうので,ここではテキストファイル denryu.txt
にベクトルの始点と成分を書き込み,そのファイルを読み込んでベクトル表示させる。
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
ソレノイドと内部磁場を描く
ソレノイドの「奥」半分を描く
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 "電流"
ソレノイドの内部磁場を描く
special file name '++'
を使ってベクトルを描くこともできるが,なぜか SVG のファイルが巨大になってしまうので,ここではテキストファイル sole-jiba.txt
にベクトルの始点と成分を書き込み,そのファイルを読み込んでベクトル表示させる。
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 "磁場"
ソレノイドの「手前」半分を描く
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
で濃いめの色にしている。
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
をちょっと変更しただけなのに…
u0 = -0.25
set urange [u0:u1]
splot '++' using (x(u)):(y(u)):(z(u)):(-y(u)) \
w l lw 5 lc palette notitle
どこが手前なのか,わけわからんグラデーションになってしまう。これが不具合。