つれづれなる備忘録

日々の発見をあるがままに綴る

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のプロット"
square.txtのプロット

次に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"

"プロットの積分演算"
プロットの積分演算

3. まとめ

 今回は累次評価演算子の使い方としてプロットの差分、微分積分について紹介した。