gnuplot を使って,パラメータを変えて複数の曲線を一気にグラフにする例。オプションの設定法についてもまとめてみた。
例:斜方投射
簡単のために(初速度 $v_0 \rightarrow 1$, 重力加速度 $g \rightarrow 1$ などとして)適宜無次元化した解は,以下のように時間 $t$ と投射角度 $\theta$ の関数となる。
\begin{eqnarray}
x(t, \theta) &=& t \cos\theta \\
y(t, \theta) &=& t \sin\theta – \frac{1}{2} t^2
\end{eqnarray}
$t=0$ で地上 $y=0$ から投射された物体がふたたび地上に落ちるまでの滞空時間 $t_d$ は
$$t_d(\theta) = 2 \sin\theta$$
Jupyter Notebook でのグラフサイズの設定例
%gnuplot inline svg size 600, 400 font ",14"
関数の定義
# 角度は度で
set angles degrees
x(t, theta) = t*cos(theta)
y(t, theta) = t*sin(theta) - t**2/2
td(theta) = 2*sin(theta)
# 媒介変数表示のグラフ
set parametric
軌道のグラフ
とりあえず 1 本の軌道を描く
$\theta = 45^{\circ}$ での斜方投射の軌道をグラフにしてみる。
まずは,とりあえずのグラフ:
theta = 45
plot [t=0:td(theta)] x(t, theta), y(t, theta)
オプション設定例
以下のようなオプションを設定して,もう少し体裁を整えます。
- $\theta$ の値を凡例に
- グリッドを点線で
- 座標軸のラベルとグラフのタイトル
- 横軸縦軸の表示範囲
- 縦軸横軸のアスペクト比
- 座標軸の目盛の間隔
gnuplot では,一旦 set
コマンドでオプションを設定すると,unset
や新たに set
しない限り,設定内容がそのまま残ります。
theta = 45
# オプション設定
# グリッド
set grid
# 座標軸のラベル
set xlabel "x"
set ylabel "y"
# グラフのタイトル
set title "斜方投射"
# 表示範囲
set xrange [0:1.1]
set yrange [0:0.5]
# アスペクト比
set size ratio 0.5/1.1
# 座標軸の目盛
set xtics 0.1
plot [t=0:td(theta)] x(t, theta), y(t, theta) title sprintf("θ=%2d°", theta)
2 本の軌道を描く
$\theta = 30^{\circ}$ と $\theta = 45^{\circ}$ の2本のグラフを描く例。
# 媒介変数 t の範囲を共通に
# y < 0 まで plot するかもしれないが yrange [0:0.5] でカット
set trange [0:2]
plot x(t, 45), y(t, 45) title sprintf("θ=%2d°", 45), \
x(t, 30), y(t, 30) title sprintf("θ=%2d°", 30)
2 本の軌道を描くもう一つの例
角度 th
の配列をつくり,配列の各要素について plot for
でグラフにしてみます。
array th[2] = [45, 30]
plot for [i=1:2] \
x(t, th[i]), y(t,th[i]) title sprintf("θ=%2d°", th[i])
複数の軌道を一度に描く
$\theta$ の値を $30^{\circ}$ から $60^{\circ}$ まで $5^{\circ}$ 刻みで変えて,複数の曲線を一度に描く例。
N = 7
array th[N]
do for [i=1:N] {
th[i] = 60 - 5*(i-1)
}
plot for [i=1:N] \
x(t, th[i]), y(t,th[i]) title sprintf("θ=%2d°", th[i])