gnuplotによるグラフ作成35~累次評価演算子
今回はgnuplotの累次評価演算子の使い方について紹介する。
1. プロットの差分表示
累次評価演算子とは(式1,式2,…,式N)
としたときに式1から順番に実行し最後に式Nの結果を返す演算子である。
累次評価演算子を用いることで、プロットデータの隣接データ同士の差分を実行することができる。
まず2次関数のデータファイルを以下のように作成し、square.txt
として保存する。
set table "square.txt set xrange[0:10] plot x**2 unset table
次にsquare.txt
を読み込み、隣接データ同士を差分してプロットする。隣接データ同士を差分するにはold=0
としてoldの変数定義と初期値を代入し(初期値が0のデータを想定)、dx=$2-old
として最初のyの値($2で参照)と初期値を差分する。次にold=$2
とすることで最初のyの値をold
に上書きして、最後にdxを評価する。以上の処理を累次評価演算子を用いてplotコマンドと共に以下のように使用する。
old=0 plot "square.txt" using 1:(dx=$2-old,old=$2,dx)
なお初期値が0出ない場合は、最初の値だけプロットしないという処理を三項演算子を用いて、累次評価演算子内に追加する。
plot "square.txt" 1:($0==0 ? (old = $1, 1/0) : (dx = $1-old, old = $1, dx))
2. 微分および積分
累次評価演算子を用いて差分と同じ要領で、x($1)およびy($2)の差分dx,dyを生成し、さらにdy/dxを演算することでプロットの微分を計算することができる。
plot "diff_data1.dat" using 1:2 title "data", \ "" using (dy=$2-lasty, dx=$1-lastx, lasty=$2,lastx=$1,$1-dx*0.5)\ :($0==0 ? 1/0 :dy/dx) title "dy/dx"
少し複雑になるが台形公式による積分計算も以下のように実行できる。関数xの積分であるx2/2をプロットできている。
set xrange[0:10] f(x)=x plot laxtx=0, lasty=0, integ=0, \ "+" using 1:(dx=$1-lastx, integ=($0==0 ? 0 :integ+dx*(f($1)+lasty)*0.5),\ lastx=$1, lasty=f($1), integ) title "Integral"