Gnuplot でベクトル場を描く (drawing a vector field by gnuplot)
最初は、 4.6 からできると書いていたが、実は 4.4 からできることに気付いたので修正した
例えば、 V(x, y) = [f(x,y), g(x,y)] といった関数で指定されたベクトル場を描きたい。
基本的には、[x, y, f(x,y), g(x,y)] という座標と値の組のデータを生成すればいいのだが、これはファイルを作成する必要があり面倒である。通常の関数 y = f(x) をプロットするのと同じぐらいの手軽さで、これを実現したい。 4.64.4 では、このようなことが簡単にできる擬似ファイル名 +
が導入された。
4.4 以降での方法
原理
そもそも、 Gnuplot の関数プロットの原理から理解しよう。例えば、 plot x*x
というコマンドで、一見なめらかな放物線が表示されるが、これは実は適当な間隔で作られた折れ線グラフである。この間隔は set samples
で指定でき、初期値は 100
である。試しに、 set samples 5
と設定すると、以下のようなプロットになる。
表示範囲を変えてみると分かるとおり、グラフは、 x 軸の範囲を両端含めた個数で分割し、その時の値を y 座標としてプロットしている。
4.4 では、この自動的に生成される分割座標を、 using によって加工して処理できる特殊なファイル名 +
が導入された。これを利用すると、従来の方法は以下のように変形できる
# 以下の二つは同じ plot x*x plot "+" using 1:($1*$1) with lines
ベクトル場
これと同様に 3 次元で曲面を表示するためには、 xy のメッシュ(分割点群)が必要になり、これは ++
で生成できる。第2要素の間隔は set samples
ではなく、 set isosamples
で指定することができる(のだが、実はこの辺の部分を未だに正しく理解できていないので、正確には違うのかもしれない。だれか教えて)。で、この生成されたデータは、 2 次元プロットにも使用することができ、これを使うとベクトル場が簡単に描ける。
例: (−ay, ax) (a=0.1) の表示
a=0.1 set samples 20 set isosamples 20 set size ratio -1 set xrange [-1:1] set yrange [-1:1] plot "++" using 1:2:(-$2*a):($1*a) with vectors