gnuplot で螺旋(らせん)を立体的にグラデーションで描く

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

svg でインライン表示,グラフのサイズを 640 x 640 に,フォントサイズを 14 に。

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)
z(u) = pitch*u

pitch = 0.01

オプションの設定例

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 palette defined (0 "dark-red" , 1 "red" , 2 "light-pink")
unset colorbox

# 媒介変数表示で
set parametric
Out[3]:
	dummy variable is t for curves, u/v for surfaces

グラデーション付きのらせんの例

前後関係がわかるように,手前を palette で濃いめの色(dark-red),奥を薄目の色(light-pink)にしている。

In [4]:
# 曲線を滑らかに
set samples 1000
# u の範囲,20 周
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 の変更による不具合

urange を少し変えただけなのに,どこが手前なのか,わけわからんグラデーションになってしまうという不具合。

In [5]:
# 曲線を滑らかに
set samples 1000
# u の範囲
u0 = -0.25
u1 = 20.25
set urange [u0:u1]

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

グラデーション不具合の回避例

どうしても urange [-0.25:20.25] の範囲で正しいグラデーションでらせんを描きたいのであれば,たとえば半周ごとに地道に描き続けるとか…

In [6]:
set samples 50
u0 = -0.25
u1 = u0 + 0.5
# 0.5 周
set urange [u0:u1]
N = 40

splot for [i=0:N]\
    '++' using (x(u+i/2.)):(y(u+i/2.)):(z(u+i/2.)):(y(u+i/2.)) \
         w l lw 5 lc palette notitle

ソレノイドを流れる電流による磁場

ソレノイドは1本の電線を螺旋状に密に巻いたものである。十分に長いソレノイドを流れる電流により,ソレノイドの内部にのみ,長さ方向に一定の内部磁場ができることがわかる。

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

In [7]:
set samples 50
u0 = 0
u1 = u0 + 0.5
# 0.5 周
set urange [u0:u1]
N = 19
set title "十分に長いソレノイドの内部磁場"
splot for [i=0:N]\
    '++' using (x(u+i)):(y(u+i)):(z(u+i)):(y(u+i)) \
         w l lw 5 lc palette notitle

内部磁場を描く

In [8]:
replot '++' using (-0.5):(0):(0):(0):(0):(0.2) \
            w vec lw 10 lc "green" title "磁場", \
       '++' using (0):(0):(0):(0):(0):(0.2) \
            w vec lw 10 lc "green" notitle, \
       '++' using (0.5):(0):(0):(0):(0):(0.2) \
            w vec lw 10 lc "green" notitle

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

In [9]:
replot for [i=0:N]\
    '++' using (x(u+i+0.5)):(y(u+i+0.5)):(z(u+i+0.5)):(y(u+i+0.5)) \
         w l lw 5 lc palette notitle

最初と最後にちょっと追加

ソレノイドの最初と最後に 0.25 周と電流の矢印を追加。

In [10]:
# 0.25 周用の関数
# [0:0.5] で半周すると見せかけて x<0 は非表示に
xp(u) = (x(u)>=-0.1) ? x(u):1/0

replot \
  '++' using (xp(u-0.5)):(y(u-0.5)):(z(u-0.5)):(y(u-0.5)) \
       w l lw 5 lc palette notitle, \
  '++' using (xp(u+20)):(y(u+20)):(z(u+20)):(y(u+20)) \
       w l lw 5 lc palette notitle ,\
  '++' using (x(-0.25)-1.5):(y(-0.25)):(z(-0.25)):(1.5):(0):(0):(y(-0.25))\
       w vec lw 5 lc palette title "電流", \
  '++' using (x(20.25)):(y(20.25)):(z(20.25)):(-1.5):(0):(0):(y(20.25))\
       w vec lw 5 lc palette notitle

一様な静磁場中の荷電粒子の運動

電場はないとして,磁場によるローレンツ力を受けた荷電粒子の運動方程式を解くと,一様な静磁場中では,荷電粒子はらせん軌道を描いて運動することがわかる。

In [11]:
set palette defined (0 "dark-blue" , 1 "cyan")
pitch = 0.1

らせん軌道の「奥」半分を描く

In [12]:
set samples 50
u0 = 0
u1 = u0 + 0.5
# 0.5 周
set urange [u0:u1]
N = 4
set title "一様な静磁場中の荷電粒子の運動"
splot for [i=0:N]\
    '++' using (x(u+i)):(y(u+i)):(z(u+i)):(y(u+i)) \
         w l lw 5 lc palette notitle

一様な静磁場を描く

In [13]:
replot for [i=-2:1] \
  '++' u (0.8*i):(0):(0):(0):(0):(0.55) \
       w vec lw 10 lc "light-green" notitle ,\
  '++' u (1.6):(0):(0):(0):(0):(0.55) \
       w vec lw 10 lc "light-green" title  "磁場 B"

らせん軌道の「手前」半分を描く

In [14]:
replot for [i=0:N]\
    '++' using (x(u+i+0.5)):(y(u+i+0.5)):(z(u+i+0.5)):(y(u+i+0.5)) \
         w l lw 5 lc palette notitle

最初と最後にちょっと追加

In [15]:
replot \
  '++' using (xp(u+5)):(y(u+5)):(z(u+5)):(y(u+5)) \
       w l lw 5 lc palette notitle, \
  '++' using (xp(u-0.5)):(y(u-0.5)):(z(u-0.5)):(y(u-0.5)) \
       w l lw 5 lc palette title "荷電粒子の軌道" ,\
  '++' using (x(5.25)):(y(5.25)):(z(5.25)):(-0.5):(0):(0):(y(5.25))\
       w vec lw 5 lc palette notitle