DOSEIの日記

技術メモ+日常ログ

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