Maxima で複数の曲線を一気にグラフにする例とオプション設定例

Maxima を使って,パラメータを変えて複数の曲線を一気にグラフにする例。グラフを描く際のオプションの設定についてもまとめた。

例:斜方投射

簡単のために(初速度 $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$$

関数の定義

In [1]:
/* 角度 th は度で */
/* [theta] は block() 内だけで使えるローカル変数 */
x(t, th):= block(
    [theta: th * %pi/180],
    t*cos(theta)
    )$

y(t, th):= block(
    [theta: th * %pi/180],
    t*sin(theta) - t**2/2
    )$
    
td(th):= block(
    [theta: th * %pi/180],
    2*sin(theta)
    )$

plot2d() で軌道のグラフ

とりあえず 1 本の軌道を描く

$\theta = 45^{\circ}$ での斜方投射の軌道をグラフにしてみる。

まずは,とりあえずのグラフ:

In [2]:
th: 45$

plot2d([parametric, x(t, th), y(t, th), [t, 0, td(th)]])$

オプション設定例

以下のようなオプションを設定して,もう少し体裁を整えます。

  • $\theta$ の値を凡例に
  • 座標軸のラベルとグラフのタイトル
  • 横軸縦軸の表示範囲
  • 縦軸横軸のアスペクト比
  • 座標軸の目盛の間隔…
In [3]:
th: 45$

plot2d(
    [parametric, x(t, th), y(t, th), [t, 0, td(th)]], 

    /* 凡例 */
    [legend, printf(false, "θ = ~2d°", th)], 
    /* 座標軸のラベル */
    [xlabel, "x"], [ylabel, "y"],
    /* グラフのタイトル */
    [title, "斜方投射"],
    /* 表示範囲 */
    [x, 0, 1.1], [y, 0, 0.5], 
    /* アスペクト比*/
    [same_xy], 
    /* 座標軸の目盛 */
    [gnuplot_preamble, "set xtics 0.1"], 
    /* グリッド */
    grid2d
)$

2本の軌道を描く

$\theta = 30^{\circ}$ と $\theta = 45^{\circ}$ の2本のグラフを描く例。

In [4]:
plot2d(
    [[parametric, x(t, 45), y(t, 45), [t, 0, td(45)]], 
     [parametric, x(t, 30), y(t, 30), [t, 0, td(30)]]], 

    /* 凡例 */
    [legend, "θ = 45°", "θ = 30°"], 
    /* 座標軸のラベル */
    [xlabel, "x"], [ylabel, "y"],
    /* グラフのタイトル */
    [title, "斜方投射"],
    /* 表示範囲 */
    [x, 0, 1.1], [y, 0, 0.5], 
    /* アスペクト比*/
    [same_xy], 
    /* 座標軸の目盛 */
    [gnuplot_preamble, "set xtics 0.1"], 
    /* グリッド */
    grid2d
)$

2 本の軌道を描くもう一つの例

makelist() を使って,媒介変数表示のグラフ部分と凡例部分をあらかじめリストとしてつくっておく,という作戦。凡例部分をどうするか,ちょっと苦労しました。

In [5]:
lines: makelist(
    [parametric, x(t, th), y(t, th), [t, 0, td(th)]], 
    th, 45, 30, -15
    )$
keys: makelist(
    printf(false, "θ = ~2d°", th), 
    th, 45, 30, -15
    )$

plot2d(
    lines, 

    /* 凡例 */
    flatten([legend, keys]), 

    /* 座標軸のラベル */
    [xlabel, "x"], [ylabel, "y"],
    /* グラフのタイトル */
    [title, "斜方投射"],
    /* 表示範囲 */
    [x, 0, 1.1], [y, 0, 0.5], 
    /* アスペクト比*/
    [same_xy], 
    /* 座標軸の目盛 */
    [gnuplot_preamble, "set xtics 0.1"], 
    /* グリッド */
    grid2d
)$

複数の軌道を一度に描く

$\theta$ の値を $30^{\circ}$ から $60^{\circ}$ まで $5^{\circ}$ 刻みで変えて,複数の曲線を一度に描く例。

2本の軌道が makelist() で描ければ,複数の軌道を一度に描くのも簡単です。

In [6]:
lines: makelist(
    [parametric, x(t, th), y(t, th), [t, 0, td(th)]], 
    th, 60, 30, -5
    )$
keys: makelist(
    printf(false, "θ = ~2d°", th), 
    th, 60, 30, -5
    )$

plot2d(
    lines, 

    /* 凡例 */
    flatten([legend, keys]), 

    /* 座標軸のラベル */
    [xlabel, "x"], [ylabel, "y"],
    /* グラフのタイトル */
    [title, "斜方投射"],
    /* 表示範囲 */
    [x, 0, 1.1], [y, 0, 0.5], 
    /* アスペクト比*/
    [same_xy], 
    /* 座標軸の目盛 */
    [gnuplot_preamble, "set xtics 0.1"], 
    /* グリッド */
    grid2d
)$

draw2d() で軌道のグラフ

とりあえず 1 本の軌道を描く

$\theta = 45^{\circ}$ での斜方投射の軌道をグラフにしてみる。

まずは,とりあえずのグラフ:

In [7]:
th: 45$

draw2d(parametric(x(t, th), y(t, th), t, 0, td(th)))$

オプション設定例

以下のようなオプションを設定して,もう少し体裁を整えます。

  • $\theta$ の値を凡例に
  • 座標軸のラベルとグラフのタイトル
  • 横軸縦軸の表示範囲
  • 縦軸横軸のアスペクト比
  • 座標軸の目盛の間隔…
In [8]:
th: 45$

draw2d(
    /* 凡例 */
    key = printf(false, "θ = ~2d°", th),
    /* 座標軸のラベル */
    xlabel = "x", ylabel = "y",
    /* グラフのタイトル */
    title = "斜方投射", 
    /* 表示範囲 */
    xrange = [0, 1.1], yrange = [0, 0.5],
    /* アスペクト比 */
    proportional_axes = xy,
    /* 座標軸の目盛 */
    user_preamble = "set xtics 0.1",
    /* グリッド */
    grid = true,
    
    parametric(x(t, th), y(t, th), t, 0, td(th))
    )$

2本の軌道を描く

$\theta = 30^{\circ}$ と $\theta = 45^{\circ}$ の2本のグラフを描く例。

In [9]:
draw2d(
    /* 座標軸のラベル */
    xlabel = "x", ylabel = "y",
    /* グラフのタイトル */
    title = "斜方投射", 
    /* 表示範囲 */
    xrange = [0, 1.1], yrange = [0, 0.5],
    /* アスペクト比 */
    proportional_axes = xy,
    /* 座標軸の目盛 */
    user_preamble = "set xtics 0.1",
    /* グリッド */
    grid = true,

    color = 1,
    key = printf(false, "θ = ~2d°", 45),
    parametric(x(t, 45), y(t, 45), t, 0, td(45)),   

    color = 2,
    key = printf(false, "θ = ~2d°", 30),
    parametric(x(t, 30), y(t, 30), t, 0, td(30))
    )$

2 本の軌道を描くもう一つの例

makelist() を使って,媒介変数表示のグラフ部分と凡例部分をあらかじめリストとしてつくっておく,という作戦。

In [10]:
th: [45, 30]$

lines: makelist(
    [color = i,
     key = printf(false, "θ = ~2d°", th[i]),
     parametric(x(t, th[i]), y(t, th[i]), t, 0, td(th[i]))], 
    i, 1, length(th)
    )$

draw2d(
    /* 座標軸のラベル */
    xlabel = "x", ylabel = "y",
    /* グラフのタイトル */
    title = "斜方投射", 
    /* 表示範囲 */
    xrange = [0, 1.1], yrange = [0, 0.5],
    /* アスペクト比 */
    proportional_axes = xy,
    /* 座標軸の目盛 */
    user_preamble = "set xtics 0.1",
    /* グリッド */
    grid = true,

    lines
)$

複数の軌道を一度に描く

$\theta$ の値を $30^{\circ}$ から $60^{\circ}$ まで $5^{\circ}$ 刻みで変えて,複数の曲線を一度に描く例。

2本の軌道が makelist() で描ければ,複数の軌道を一度に描くのも簡単です。

In [11]:
th: makelist(i, i, 60, 30, -5)$

lines: makelist(
    [color = i,
     key = printf(false, "θ = ~2d°", th[i]),
     parametric(x(t, th[i]), y(t, th[i]), t, 0, td(th[i]))], 
    i, 1, length(th)
    )$

draw2d(
    /* 座標軸のラベル */
    xlabel = "x", ylabel = "y",
    /* グラフのタイトル */
    title = "斜方投射", 
    /* 表示範囲 */
    xrange = [0, 1.1], yrange = [0, 0.5],
    /* アスペクト比 */
    proportional_axes = xy,
    /* 座標軸の目盛 */
    user_preamble = "set xtics 0.1",
    /* グリッド */
    grid = true,

    lines
)$