Maxima で2曲線の描画範囲を個別に設定して draw2d と塗りつぶし

同一の描画範囲で2本の曲線を draw2d()

Maxima の draw2d() で2つの陽関数の曲線を同時にグラフにする場合,描画範囲が同じであっても,それぞれ指定してやる必要があります。また,曲線の色も明示的に指定しないと同じ色になって区別がつきません。

以下の例では $y=\cos x$ と $y=\sin x$ を $0 \leq x \leq 2\pi$ の範囲で draw2d() します。

In [1]:
draw2d(
  /* 色 */
  color = black, 
  explicit(cos(x), x, 0, 2*%pi), 
  
  /* 色 */
  color = red, 
  explicit(sin(x), x, 0, 2*%pi)
)$

2本の曲線の描画範囲を個別に設定して draw2d()

2つの曲線の描画範囲をそれぞれ別に,また曲線の描画範囲とグラフの表示範囲を独立に設定することもできます。

以下の例では,グラフの表示範囲を横軸 [-0.2, %pi+0.2],縦軸 [-0.1, 1.1] にし,

  • $0 \leq x \leq \frac{\pi}{4}$ の範囲で $y=\cos x$
  • $0 \leq x \leq \pi$ の範囲で $y=\sin x$

draw2d() します。

In [2]:
draw2d(
  /* 表示範囲の設定 */
  xrange = [-0.2, %pi+0.2], 
  yrange = [-0.1, 1.1], 
  /* 線の太さ */
  line_width = 2,
  
  /* 色 */
  color = black, 
  explicit(cos(x), x, 0, %pi/4), 
  /* 色 */
  color = red, 
  explicit(sin(x), x, 0, %pi)
)$

陽関数で表された2曲線の間を塗りつぶす

$0 \leq x \leq \frac{\pi}{4}$ の範囲で $y=\cos x$ と $y=\sin x$ に囲まれた領域を塗りつぶしてみます。まずは 領域の塗りつぶし に書いてある方法にそって。

In [3]:
draw2d(
  /* 表示範囲の設定 */
  xrange = [-0.2, %pi+0.2], 
  yrange = [-0.1, 1.1], 
  /* 線の太さ */
  line_width = 2,

  /* 塗りつぶす色の指定 */
  fill_color = yellow, 
  
  /* 上の線 */
  filled_func = cos(x), 
  
  /* 下の線と範囲の指定 */
  explicit(sin(x), x, 0, %pi/4), 
  
  /* 塗り潰し終了 */
  filled_func = false, 
  
  /* あらためて曲線を描く */
  
  /* 色 */
  color = black, 
  explicit(cos(x), x, 0, %pi/4), 
  /* 色 */
  color = red, 
  explicit(sin(x), x, 0, %pi)
)$

region を指定して塗りつぶす

次は,region を指定して塗りつぶす例(陰関数も使って) に書いてあるやり方で。

当該領域は $ y \leq \cos x$ かつ $y \geq \sin x$ な
領域つまり $(y-\cos x) (y-\sin x) \leq 0$ な領域であることを

  • region((y - cos(x))*(y - sin(x)) <= 0, x, 0, %pi/4, y, 0, 1)

のように陰関数の不等式で記述する。

In [4]:
draw2d(
  /* 表示範囲の設定 */
  xrange = [-0.2, %pi+0.2], 
  yrange = [-0.1, 1.1], 
  /* 線の太さ */
  line_width = 2,

  /* 塗りつぶす色の指定 */
  fill_color = yellow, 
  
  /* 塗りつぶす領域の指定 */
  region((y - cos(x))*(y - sin(x)) <= 0, x, 0, %pi/4, y, 0, 1), 
  
  /* あらためて曲線を描く */
  
  /* 色 */
  color = black, 
  explicit(cos(x), x, 0, %pi/4), 
  /* 色 */
  color = red, 
  explicit(sin(x), x, 0, %pi)
)$

横軸の目盛位置と目盛ラベルの設定

今度は,以下のページにある例:
$\displaystyle \frac{\pi}{4} \leq x \leq \frac{5\pi}{4}$ の範囲で $y=\sin x$ と $y=\cos x$ で囲まれた部分を塗りつぶします。

横軸の目盛を $\frac{\pi}{4}$ ごとにつける設定をしてみます。

「理工系の数学B」の積分の練習問題で,「図の塗りつぶした部分の面積を求めよ。」なんていうときに使います。

In [5]:
draw2d(
  /* フォントの設定 */
  font = "Noto Sans CJK JP", font_size = 14, 
  /* 表示範囲の設定 */
  xrange = [0,2*%pi], yrange = [-1.1,1.3],
  /* 線の太さ */
  line_width = 2,
  
  /* 横軸 π/4 ごとに目盛 */
  xtics = %pi/4, 
  /* 目盛ラベルのフォーマット設定 */
  user_preamble = "set format x '%4.2P π';",
  
  /* 塗りつぶす色の指定 */
  fill_color = yellow, 
  /* 上の線 */
  filled_func = sin(x),
  /* 下の線と範囲の指定 */
  explicit(cos(x), x, %pi/4, 5*%pi/4),
  /* 塗り潰し終了 */
  filled_func = false, 
  
  /* あらためて曲線を描く */
  
  /* 色 */
  color = blue, 
  /* 凡例 */
  key = "sin x", 
  explicit(sin(x), x, 0, 2*%pi),
  /* 色 */
  color = red, 
  /* 凡例 */
  key = "cos x", 
  explicit(cos(x), x, 0, 2*%pi)
)$

横軸の目盛の位置とラベルを手動で設定する例。

In [6]:
draw2d(
  font = "Noto Sans CJK JP", font_size = 14, 
  xrange = [0,2*%pi], yrange = [-1.1,1.3],
  line_width = 2,
  
  xtics = {["0",0],["π/4",%pi/4],["π/2",%pi/2],
           ["3π/4",3*%pi/4],["π",%pi],["5π/4",5*%pi/4],
           ["3π/2",3*%pi/2],["7π/4",7*%pi/4],["2π",2*%pi]},   

  fill_color = yellow, 
  filled_func = sin(x),
  explicit(cos(x), x, %pi/4, 5*%pi/4),
  filled_func = false, 
  
  color = blue, 
  key = "sin x", 
  explicit(sin(x), x, 0, 2*%pi),

  color = red, 
  key = "cos x", 
  explicit(cos(x), x, 0, 2*%pi)
)$

グリッド(格子線)の設定(塗りつぶし部分も見えるように)

grid = true で格子線を描きますが,以下のように塗りつぶした部分の格子が見えなくなる場合があります。

In [7]:
draw2d(
  /* グリッドを描く */
  grid = true, 
  
  font = "Noto Sans CJK JP", font_size = 14, 
  xrange = [0,2*%pi], yrange = [-1.1,1.3],
  line_width = 2,
  
  xtics = {["0",0],["π/4",%pi/4],["π/2",%pi/2],
           ["3π/4",3*%pi/4],["π",%pi],["5π/4",5*%pi/4],
           ["3π/2",3*%pi/2],["7π/4",7*%pi/4],["2π",2*%pi]},   

  fill_color = yellow, 
  filled_func = sin(x),
  explicit(cos(x), x, %pi/4, 5*%pi/4),
  filled_func = false, 
  
  color = blue, 
  key = "sin x", 
  explicit(sin(x), x, 0, 2*%pi),

  color = red, 
  key = "cos x", 
  explicit(cos(x), x, 0, 2*%pi)
)$

そんなときは gnuplot のオプションを直接設定する user_preambleset grid front とすることで,塗りつぶした部分の上(フロント)にグリッドが描かれます。

In [8]:
draw2d(
  /* グリッドを描く */
  user_preamble = "set grid front;", 
  
  font = "Noto Sans CJK JP", font_size = 14, 
  xrange = [0,2*%pi], yrange = [-1.1,1.3],
  line_width = 2,
  
  xtics = {["0",0],["π/4",%pi/4],["π/2",%pi/2],
           ["3π/4",3*%pi/4],["π",%pi],["5π/4",5*%pi/4],
           ["3π/2",3*%pi/2],["7π/4",7*%pi/4],["2π",2*%pi]},   

  fill_color = yellow, 
  filled_func = sin(x),
  explicit(cos(x), x, %pi/4, 5*%pi/4),
  filled_func = false, 
  
  color = blue, 
  key = "sin x", 
  explicit(sin(x), x, 0, 2*%pi),

  color = red, 
  key = "cos x", 
  explicit(cos(x), x, 0, 2*%pi)
)$

縦線を引く

points_joined = true にして points() で 2 点を結ぶ直線を描きます。縦線に限らず,どんな直線でも描けます。

In [9]:
draw2d(
  /* x 軸を描く */
  xaxis =true, 

  user_preamble = "set grid front;", 
    
  font = "Noto Sans CJK JP", font_size = 14, 
  xrange = [0,2*%pi], yrange = [-1.1,1.3],
  line_width = 2,
  
  xtics = {["0",0],["π/4",%pi/4],["π/2",%pi/2],
           ["3π/4",3*%pi/4],["π",%pi],["5π/4",5*%pi/4],
           ["3π/2",3*%pi/2],["7π/4",7*%pi/4],["2π",2*%pi]},   

  fill_color = yellow, 
  filled_func = sin(x),
  explicit(cos(x), x, %pi/4, 5*%pi/4),
  filled_func = false, 
  
  color = blue, 
  key = "sin x", 
  explicit(sin(x), x, 0, 2*%pi),

  color = red, 
  key = "cos x", 
  explicit(cos(x), x, 0, 2*%pi), 
  
  /* 縦線を引く; 端点には点を描かない */
  points_joined = true, point_size = 0, 
  color = black, key = "",
  points([[%pi/4, -1.1], [%pi/4, sin(%pi/4)]]),
  points([[5*%pi/4, -1.1], [5*%pi/4, sin(5*%pi/4)]])
)$

異なる範囲での塗りつぶしの例

もう一つの例。$y=f(x)$ と $x$ 軸の間を,$0.5 \leq x \leq 2$ までは黄色で,$2 \leq x \leq 2.5$ までは灰色で塗りつぶしてみます。

In [10]:
f(x):= 0.6*x + 0.4*cos(x)$

draw2d(
  /* x 軸,y 軸の表示 */
  xaxis =true, yaxis =true, 
  user_preamble="set grid front",
  /* x, y の表示範囲設定 */
  xrange = [-0.2,3.5],
  yrange = [-0.2,1.5],

  /* 最初の塗りつぶし。色を yellow で */
  /* y = f(x) と y 軸の間を x が 0.5 から 2 まで */
  fill_color = yellow,
  filled_func = f(x),
  explicit(0, x, 0.5, 2),

  /* 次の塗りつぶし。色を gray で */
  /* y = f(x) と y 軸の間を x が 2 から 2.5 まで */
  fill_color = gray,
  filled_func = f(x),
  explicit(0, x, 2, 2.5),

  /* 塗り潰し終了 */
  filled_func = false, 
  
  /* あらためて曲線を描く */
  line_width = 2,
  explicit(f(x), x, 0.2, 2.8)
)$

グラフを pdf ファイルに保存

直前のグラフを pdf ファイルに保存する例。draw2d() の内部で file_name, terminal, dimensions を設定して実行すると,インラインに表示されずに pdf ファイルとして保存される。

dimensions の数値は任意だが,弘大 JupyterHub の環境では,だいたいこのくらいの値にするとインライン表示のグラフと見た目が似てるかなぁ,と。

In [11]:
draw2d(
  xaxis =true, yaxis =true, 
  user_preamble="set grid front",
  xrange = [-0.2,3.5],
  yrange = [-0.2,1.5],

  fill_color = yellow,
  filled_func = f(x),
  explicit(0, x, 0.5, 2),

  fill_color = gray,
  filled_func = f(x),
  explicit(0, x, 2, 2.5),

  filled_func = false, 
  
  line_width = 2,
  explicit(f(x), x, 0.2, 2.8), 

  /* グラフを pdf ファイルに保存 */
  file_name = "mygraph", 
  terminal = 'pdf, 
  dimensions = 255*[6, 4.5] 
)$