Saturday 13 April 2013

gnuplot (7)



三項演算子と再帰でぐるぐるとか.頭痛い.
画像は terminal の背景を透過にするとこういう感じになる.透けて見えてるのは今のデスクトップ壁紙.



gnuplot では三項演算子 (ternary operator) を使うことができる.
詳しい説明は help ternary で出てくるが,構文はシンプル.
a?b:c
で,まず a を評価し,真なら b を評価してその値を,偽なら c を評価してその値を返す.
たとえば, help に例として挙がっているものは,
0 <= x <1 で sin(x), 1<= x < 2 で 1/x, その他では undefined な函数を作るなら:
f(x) = 0<=x && x<1 ? sin(x) : 1<=x && x<2 ? 1/x : 1/0
括弧とか無いからパッと見わかりにくいけど二段組になっています.

さてさらにこれと再帰的な函数定義を組み合わせて,
f(n,x) = ( n >= 1 ? g( f(n-1,x) ) : <f(0,x)> ) 
みたいな形にしてやれば f_n(x) の漸化式で定義されるような函数列を定義できます.
 n が 1 以上の時は n-1 の定義を参照して, n == 0 の時には函数が与えられてる,という感じ.
(ちなみに,再帰の深さの最大値は僕の環境では100のようです.)

さらに(例えば)函数列の plot に使える書き方が,
plot for [n=0:100] f(n,x)
 これで f(0,x) から f(100,x) までが plot されるらしい(cf. help iteration).朗報.

というわけで,例えば x^(x^(x^(x^(x^.. ^(x^x)))))))) みたいなのを考えてやると,

f(n,x) = (n==0 ? 1: x**(f(n-1,x)))
set sample 4000
set xrange[0:1]

で準備してから
plot for [n=1:90] f(n,x) notitle
で例えばこんな感じ.そういえば以前友人がこれをアイコンに使っていた.


 これ inkscape で png に export したのですが背景色が透過になってますね.


sin(sin(sin(sin(... sin(x))))))))
で同じようなことをやると (50 個)

こういう感じ.
 gnuplot でフラクタル描けたら嬉しいな.

No comments:

Post a Comment