つれづれなる備忘録

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

gnuplotによるグラフ作成26~条件分岐

 前回はgnuplotでの複素数の取り扱いのところで、マンデルブロ集合をプロットする時に3項演算子や関数の再帰定義を用いたが、今回は3項演算子についてもう少し詳しく紹介する。

atatat.hatenablog.com

1. 条件分岐

 引数xの条件によってプロットする関数を切り替える場合、3項演算子を使うとよい。3項演算子の基本的な書式はA ? B : CでAが条件、B,Cが実行内容でありAが真ならばB、Aが偽ならばCを実行するという意味になる。 例として以下の条件のプロットを実行する。

 f(x)= \begin{eqnarray} \left\{ \begin{array}{1}  0 \qquad (x < 0) \\ x \qquad (x \geq 0) \end{array}\right. \end{eqnarray}

plot x<0 ? 0 : xはx<0ならば0でそれ以外、すなわちx≥0ならばxをプロットするコマンドになる。

set yrange [-10:10]
plot x<0 ? 0 : x

実行結果は以下の通りでx=0で分岐できていることがわかる。なお関数として定義するならばf(x)= x<0 ? 0 : xとすればよい。

"x&lt;0で分岐するプロット"
x<0で分岐するプロット

条件が複数ある場合は (A1 & A2)?B:Cとする。例えば(x>-5 & x<5)?x:0はxが-5~5ではx、それ以外では0をプロットする。(abs(x)<5とすれば1つの条件で済むが)

plot (x>-5 & x<5)?x:0

"複数の条件による分岐プロット"
複数の条件による分岐プロット

2. 条件分岐の応用例

gnuplotでは矩形波を生成する組み込み関数がないため、矩形波を生成するには例えばsinなどの周期関数を用いて、条件分岐することで矩形波を生成できる。

plot sin(x)>0?5:-5

"条件分岐を利用した矩形波の生成"
条件分岐を利用した矩形波の生成

2次元関数での分岐によるプロットを紹介したが、3次元でも変数x,yを用いて条件分岐を設定できる。例えばx**2+y**2<50?1:0は半径内のエリアを1、それ以外を0とする円形領域のマスクをプロットすることができる。

set isosamples 50
splot x**2+y**2<50

"3次元での分岐プロット"
3次元での分岐プロット

3. 複数の条件分岐

 3項演算子を複数回用いることで条件分岐を複数設定することができる。基本的にはA1?B1:(A2?B2: (A3?B3:C) )といった形で条件分岐の先に3項演算子を用いることで複数の条件分岐を設定することができる。 以下は|x|<1では8, |x|<2では6, |x|<4では4,それ以外を0とする関数f(x)を3項演算子を繰り返し適用している。

f(x)=abs(x)<1?8:(abs(x)<2?6:(abs(x)<4?4:0)) 
plot f(x)

以下実行すると繰り返し条件分岐によるプロットが生成される。

"複数の条件分岐によるプロット"
複数の条件分岐によるプロット

4. まとめ

 今回は3項演算子を用いた条件分岐を設定してプロットする方法について紹介した。