- 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の公式で計算できることが知られています. 上で定義した関数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 |