gnuplotで極座標plotと範囲指定を両立する方法
gnuplotでは、極座標表示や媒介変数表示モードの時にplot範囲を個別指定できないようです。よって、極座標表示や媒介変数表示を用いてパラメタの範囲が違う複数の関数をplotするときは、三項演算子を用いて個々のグラフの定義域(値域)を定義する必要があります。
gnuplotにおける三項演算子
三項演算子とは、プログラミングにおけるif(とelse)を短縮したような役割を持ちます。ある条件を満たすときと満たさないとき、それぞれでどのような値をとるかを指定できます。gnuplotにおける三項演算子は、次のように書きます(他の言語における三項演算子と同じ書き方のようです)。
条件 ? 値1 : 値2
このように書くことで「条件を満たす場合は(if)値1、それ以外の場合は(else)値2」となる関数を定義することができます。plotに三項演算子を使うと良い例として、step関数などが挙げられます。
三項演算子は、入れ子構造にすることもできます:
条件1 ? (条件2 ? 値1 : 値2) : 値3
定義域(値域)のある関数は、三項演算子を応用して書くことができます。具体的には、(条件)の部分に定義域(値域)を、:の後(elseの部分)に1/0(無限みたいなもの、これが入力された場合gnuplotは何も出力しない)をいれ、
定義域か値域 ? 関数 : 1/0
とすることで定義域(値域)を指定した関数が書けます。注意として、(条件)の部分には1つの条件しか入れることができません。例えば、定義域が1<x<10の場合、
1<x<10 ? 値1 : 値2
とすることはできず、1<x<10を1<xとx<10に分解して
1<x ? (x<10 ? 関数 : 1/0) : 1/0
とする必要があります。この三項演算子を用いて関数の定義域(値域)を定め、それらの関数を並べてplotすると極座標や媒介変数表示でも複数の関数の範囲を個別に指定できます。
例:θ1<θ<θ2でr=acosθ+bをplot
a=2,b=1かつθ1=acos(-b/a),θ2=2π-acos(-b/a)の場合をplotしてみます:
set polar
a=2.
b=1.
r(t)=acos(-b/a)<t ? ((t<2.*pi-acos(-b/a)) ? a*cos(t)+b : 1/0) : 1/0
plot r(t)
このplotを実行すると、
となります。ちなみに、上で書いた以外のパラメタ領域でplot
r(t)=acos(-b/a)<t ? ((t<2.*pi-acos(-b/a)) ? 1/0 : a*cos(t)+b) : a*cos(t)+b
すると
となります。ちなみに全てのパラメタ領域でplotすると
になります。ここでは極座標plotの例を紹介しましたが、媒介変数plotでも、xとyそれぞれに欲しいパラメタの範囲を設定すれば似たようなことができると思います。
ちなみに
自分でやってみた範囲では、関数やθ1,2を別の文字で定義してから三項演算子の中にその文字を書く
t1=acos(-b/a)
t2=2.*pi-acos(-b/a)
R(t)=a*cos(t)+b
r(t)=t1<t ? ((t<t2) ? R(t) : 1/0) : 1/0
みたいなことはできず、真面目に全部書く必要がありました。ここまでややこしい関数ならif文を使った方が読みやすいかもしれません。
それから、例のplotではx軸に変な縦線が入っていると思いますが、これはgnuplotが勝手に描いた極座標plotにおけるr軸のメモリなので、set polarの後に
unset raxis
unset rtics
すると消えます。