2015年8月22日土曜日

[gnuplot] バッチ処理

gnuplotにおいて,少ないコマンド数でグラフを描くには,対話形式での実行が簡単です.
一方で,複雑な処理や,繰り返しの処理が必要な場合は,バッチ処理形式の方が便利です.

以下の4つの関数のプロットを例として,その比較を示します.

対話形式による実行
ターミナルから,以下のようにタイプします.
gnuplot> set sample 512
gnuplot> set xrange [-5:5]
gnuplot> set yrange [-1.5:1.5]
gnuplot> set xzeroaxis
gnuplot> set yzeroaxis
gnuplot> f(n, x) = 4/pi*sin((2*n-1)*x)/(2*n-1)
gnuplot> S(n, x) = sum[i=1:n] f(i, x)
gnuplot> plot f(1,x) with lines,\
>        f(2,x) with lines,\
>        f(3,x) with lines,\
>        S(3,x) with lines
gnuplot> 
すると,下図がプロットされます.
各行のコマンドは,以下のようになります.
1行目のコマンド:関数の計算点を512点に設定(なめらかなプロットが必要な場合は,計算点数を増やします).
2, 3行目のコマンド:x,y軸のプロット範囲の指定
4, 5行目のコマンド:x=0, y=0軸の描画指定
6行目のコマンド:式(最初の三つの関数(2変数関数))の定義(最大12変数まで指定可能)
7行目のコマンド:式(四つ目の関数)の定義
8〜11行目のコマンド:プロット作成(コマンドは"plot"一つのみで,行末に"\"をつけることで,行を分割)

この例を見てもわかるように,複雑なグラフを描く場合,面倒です.また,タイプミスがあった場合は,最初からやり直しとなってしまいます.

コマンドファイルを"load"を使って実行
バッチ処理を行う際には,コマンドファイル(実行したいコマンドを並べて,テキストファイルとして保存したもの)を作ることから始めます.
上記のコマンドと同じグラフをプロットしたい場合は,以下のような内容のテキストファイルを作成,保存します(今回は,"fourier.gp"という名前で保存).

set sample 512
set xrange [-5:5]
set yrange [-1.5:1.5]
set xzeroaxis
set yzeroaxis
g(n, x) = 4/pi*sin((2*n-1)*x)/(2*n-1)
Sum(n, x) = sum[i=1:n] g(i, x)
plot g(1,x) with lines,\
     g(2,x) with lines,\
     g(3,x) with lines,\
     Sum(3,x) with lines

そして,ターミナル(gnuplotを起動させた状態)から,以下のようにタイプします.
gnuplot> load 'fourier.gp'
すると,以下のようなグラフが描かれます.
図の中身は先と同じですが,"fourier.gp"では,関数名をg(n, x), Sum(n, x)としてあり,凡例が異なっています.

コマンドファイルをシェルから実行
gnuplotを起動させずに,ターミナル(シェル)から直接ファイルを実行します.
"load"を使って実行した時と同じように,以下のテキストファイルを作成し,"fourier2.gp"という名前で保存します.

# Fourier series for a square wave

set sample 512
set xrange [-5:5]
set yrange [-1.5:1.5]
set xzeroaxis
set yzeroaxis

h(n, x) = 4/pi*sin((2*n-1)*x)/(2*n-1)
SUM(n, x) = sum[i=1:n] h(i, x)

plot h(1,x) with lines,\
     h(2,x) with lines,\
     h(3,x) with lines,\
     SUM(3,x) with lines


pause -1 "press [Enter] key to quit"

そして,ターミナルから(gnuplotを立ち上げていない状態)以下のようにタイプします.
$ gnuplot fourier2.gp
press [Enter] key to quit
すると,以下のグラフが描かれます.
グラフの中身は,同じですが,関数名を関数名をh(n, x), SUM(n, x)としたので,それが凡例に反映されています.

コマンドファイルの中身は,以下のとおりです.
1行目:"#"で始まるコメント行
最終行:バッチを一時中断する命令(このようにしておかないと,直ちにgnuplotが終了してしまいます)
関数の定義など,他の部分は,対話形式における記述と同様です.

0 件のコメント :

コメントを投稿