GNUPLOT

- not so Frequently Asked Questions -

update 2004/11/16

媒介変数(parametric)表示

gnuplotで3次元関数を表示するには,変数 x,y を使って z=f(x,y)という 形でz座標を表す方法と,媒介変数(3次元の場合はu,v)を用いて,

x = f(u,v)
y = g(u,v)
z = h(u,v)

のように表現する方法があります.関数形f(x,y)が次のような簡単なものなら, それを最初に定義しておいて,splotします.

gnuplot> f(x,y)=sin(x)*cos(y)
gnuplot> splot f(x,y)

しかし極座標表示されている関数は,簡単に "z=" の形で表現できないので, その場合は媒介変数を用います.例えば,半径1の球面は x^2+y^2+z^2=1 なので, z=sqrt(1-x*x-y*y) もしくは z = -sqrt(1-x*x-y*y)となり,zの正負2つの関数が 必要です.

パラメータで球面を表現するには,半径 r が一定という条件を変数u,vで 表すだけです.uとvを下の図にある角度として,これらを0から360まで変化 させ,その間に動径の長さ r が変化しないようにします.

coordinate1

角度u,vと動径rを用いると,x,y,zの座標は次のよう に表すことができます.

x = r*cos(u)*cos(v)
y = r*sin(u)*cos(v)
z = r*sin(v)

球面はr=a=一定値なので,上の式の変数rを定数に 置き換えるだけです.a=1なら半径1の球面を表現します.

x = cos(u)*cos(v)
y = sin(u)*cos(v)
z = sin(v)

gnuplotで媒介変数を用いて球面を描くには,次のようにします.

gnuplot> set parametric

dummy variable is t for curves, u/v for surfaces
gnuplot> set angle degree
gnuplot> set urange [0:360]
gnuplot> set vrange [-90:90]
gnuplot> set isosample 72,36
gnuplot> set ticslevel 0
gnuplot> set size 0.7,1.0
gnuplot> a=1
gnuplot> splot a*cos(u)*cos(v),a*sin(u)*cos(v),a*sin(v)
sphere

角度の単位はdefaultではradですが,ちょっとメンドクサイのでこれを「度」 にしておき,変数u,vの範囲を0から360度まで変化させます. set size で縦横の比率を変えていますが,これは表示が球らしく見 えるように適当に与えたもので,意味はありません.これをしないと縦が 潰れた饅頭型になります.

表示のメッシュの細かさは, set isosample で調整します.与え る数字が大きくなると,メッシュは細かくなります.最初の数字はuの数で, 経度に対応する線の数が変わります.2番目はvの数で,緯度の線が変化し ます.


上の式は少々長くて扱いにくいのですが,このような場合には予め関数を 定義しておくと便利です.

gnuplot> fx(u,v)=cos(u)*cos(v)
gnuplot> fy(u,v)=sin(u)*cos(v)
gnuplot> fz(v)=sin(v)
gnuplot> splot a*fx(u,v),a*fy(u,v),a*fz(v)
up