GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/16

その他もろもろ (その1)

1 | 2 | 3 | 4

3項演算子 (A ? B : C) の使い方.

3項演算子は,C言語のそれと同様に働きます,と言うとあまりに不親切な ので,もう少し詳しく説明しましょう.3項演算子とは A ? B : C のように書 かれたもので,Aは条件式,BとCは実行文です.これは,Aが真ならBを実行し, そうでなければCを実行せよ,という意味を表します.X>0の範囲ではexp(-x), Xが負の領域ではexp(4*x)となる関数をプロットしてみましょう.

gnuplot> set xrange [-5:5]
gnuplot> plot x>0 ? exp(-x) : exp(4*x) 
fig/sample9.1

条件式を入れ子にすれば,もう少し複雑な関数を定義することも可能です. Xの絶対値の範囲に応じてY値が離散的に変化する関数を作ってみましょう.

gnuplot> f(x)= (abs(x)<1) ? 100 : ( (abs(x)<2) ? 50 : ((abs(x)<3) ? 20: 10 )) 
gnuplot> set xrange [-5:5]
gnuplot> set yrange [0:150]
gnuplot> set sample 1000
gnuplot> plot f(x)
fig/sample9.1b

この関数は,Xの絶対値が1未満では100,1以上2未満では50,2以上3未満で は20,それ以外は10という定数を与えるものです.Xの区間が変わるところ でYの値は離散的になっていますが,gnuplotはその部分を線分でつないで しまいます. set sample を使ってサンプリング数を増やしてい るのは,この不連続部分での線分が,なるべく垂直になるようにするため です.

up

途切れた関数.

Gnuplot FAQにも書かれていますが,gnuplotはゼロでの除算のような数学的 に定義されない表現を無視します.これと3項演算子を使って,途中で途切 れる関数を表示することができます.

gnuplot> f(x) = (abs(x)>pi/2) ? sin(x+pi/2) : 0
gnuplot> g(x) = (abs(x)>pi/2) ? sin(x) : 1/0
gnuplot> set xrange [-2*pi:2*pi]
gnuplot> set yrange [-1:1]
gnuplot> plot g(x) w l lw 2,f(x)
fig/sample9.1c

ここでは2つの正弦関数f(x)とg(x)を定義して,比較しています.f(x)の方 は xの絶対値が90度以下でゼロになるもの,g(x)は同じ領域でゼロで除算 するものです.見やすいように,f(x)の方は少しずらして表示しています.

up

ループの作り方.

gnuplotのコマンドに rereadif というものがあり, これらを組み合わせると簡単なループが作れます.rereadはファ イルをもう一度読み直すコマンドです.rereadだけでは無限ルー プになりますので,ifを使って一定の反復回数になると終了する ようにします.

3次元プロットを回転させて,簡単なアニメーションにしてみましょう.回 転させるには,視点の角度を0〜360までを5°ステップで変化させます.ま ず次のような内容のプロットファイルを作り,"loop.plt"という名前にし ておきます.ここで表示する関数は exp(-x*x)*erf(y)というものです.

theta = theta + 10
set view 60, theta
splot exp(-x*x)*erf(y)
if(theta<360) reread

thetaの初期値や,その他の設定は別の所で行い, load "loot.plt"でループに入ります.各コマをダンプし,適当なソフトウェ アを使ってGIFに変換するとアニメーションを作ることができます.

gnuplot> set nokey
gnuplot> set noxtics 
gnuplot> set noytics 
gnuplot> set noztics 
gnuplot> set border 0
gnuplot> set isosamples 40, 40
gnuplot> set hidden3d
gnuplot> set xrange [ -5 : 5 ]
gnuplot> set yrange [ -5 : 5 ]
gnuplot> theta = 5
gnuplot> load "loop.plt"
up