GNUPLOT

- not so Frequently Asked Questions -

update 2004/11/29

関数の再帰定義

gnuplotでは関数を再帰的に定義することができます.再帰的定義とは, 関数の定義式の中にその関数自身が含まれているものです.例えば,整数 N の階乗 N!=FAC(N)は FAC(N)=N*FAC(N-1) と書けますので,gnuplotでは次のよ うに定義することができます.

gnuplot> fac(n) = n * fac(n-1)

この1行で変数Nを1つづ減少させるloopのようになりますが,このままで はNは負の無限大まで変化する無限ループとなってしまいますので,ループを 止める工夫が必要です.これには3項演算子を用います.N=0になったら再帰を 止めるようにするには,次のようにNに関する条件式を付けます.

gnuplot> fac(n) = (n==0) ? 1 : n * fac(n-1)

等号右側の(n==0)が条件式で,Nが0に等しいときに真になり, その時は疑問符?のすぐ右を実行します.偽の場合はコロン:の右側を実行す るので,再び自分自身である関数fac(n)をcallします.この判定により,N=0 になった時点でそれ以上関数fac(n)をcallするのを停止します.

N!を計算するには,Nが整数でなければいけません.これにはgnuplotの関 数int()を使って引数nの端数を切り落とします.この結果,引数が実数であっ ても,常に整数の階乗を計算します.より厳密にはNが正であるという制限も ありますが,ここでは入れていません.

gnuplot> fac(x) = (int(x)==0) ? 1.0 : int(x) * fac(int(x)-1.0)

関数fac(x)の計算結果は,次のようになりました.

gnuplot> fac(x) = (int(x)==0) ? 1.0 : int(x) * fac(int(x)-1.0)
gnuplot> print fact(1)
1.0
gnuplot> print fact(5) 
120.0
gnuplot> print fact(5.5) 
120.0
gnuplot> print fact(20) 
2.43290200817664e+18

N!の近似値はStirlingの公式で計算できることが知られています.

eq

上で定義した関数fac(x)とStirlingの公式の結果を比較してみましょう.

gnuplot> stirling(x) = sqrt(2*pi*x) * x**x * exp(-x)
gnuplot> set xrange [1:15]
gnuplot> set yrange [1:1e+10]
gnuplot> set log y
gnuplot> set sample 15
gnuplot> plot stirling(x) notitle with lines,\
>             fact(x)     notitle with points
fact
up