gnuplotを用いたデータの積分

関数の積分で紹介したスクリプトを少しだけ変更することで、データを台形近似を用いて積分しその結果をプロットすることができます。(gnuplot4.3以降が必要)

昇順(降順)になっているデータの積分

以下に一つの例を示します。以下の例でも関数の積分で紹介した例と同じくGauss積分

を計算しています。

#いったんデータファイルを作る。データファイルがある場合は不要。
set table "data.dat" 
plot exp(-x**2)
unset table

set key left Left reverse samplen 0.5
integ_init=0.0
plot lastx=0.0,lasty=0.0,integ = 0.0,\
     "data.dat" using 1:2 w p lw 2 title "data", \
     "data.dat" using 1:(dx=$1-lastx, \
     integ = ($0==0 ? integ_init : integ+dx*($2+lasty)*0.5), \
     lastx=$1, \
     lasty=$2, \
     integ) w p lw 2 title "integral"

原理は関数の積分のスクリプトと全く同じです。このスクリプトの実行例は以下のようになります。Gauss関数の積分が出来ていることがお分かりいただけると思います。

昇順(降順)になっていないデータの積分

実験データなどの積分をするときは、データのxの値が昇順(または降順)になっていることが必要です。もしxの値が昇順や降順になっていない場合はset tablesmooth uniqueなどを使ってデータを整えておく必要があります。例えば、下図のようなGauss関数にノイズの乗ったデータ(gauss_data_rand.dat)を積分することを考えます。

この場合データのxの値が昇順になっていないので、以下のように別ファイルに昇順にしたデータを吐き出した上で積分する必要があります。この例でstringcolumn()関数を使っているのは、set tableで出力したファイルに含まれている可能性のある変なデータを排除するためです。詳細は数値のファイルへの書き出し(table) を参照してください。

set table "smooth.dat" #昇順にしたデータの書き出し
plot "gauss_data_rand.dat" u 1:2 smooth unique
unset table

set key left Left reverse samplen 0.5

integ_init=0.0
plot lastx=0.0,lasty=0.0,integ = 0.0,\
     "gauss_data_rand.dat" using 1:2 w p title "data with noise", \
     "smooth.dat" using (stringcolumn(3) eq "i" ? $1 : 1/0):2 w l title "smoothed data",\
     "smooth.dat" using (stringcolumn(3) eq "i" ? $1 : 1/0):(dx=$1-lastx, \
     integ = ($0==0 ? integ_init : integ+dx*($2+lasty)*0.5), \
     lastx = (stringcolumn(3) eq "i" ? $1 : lastx), \
     lasty = (stringcolumn(3) eq "i" ? $2 : lasty), \
     integ) w l lw 2 title "integral of the smoothed data"

上記のスクリプトの実行結果は以下のようになります。