- not so Frequently Asked Questions - update 2004/9/16
|
|
not so FAQ |
その他もろもろ (その1)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) 条件式を入れ子にすれば,もう少し複雑な関数を定義することも可能です. 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) この関数は,Xの絶対値が1未満では100,1以上2未満では50,2以上3未満で は20,それ以外は10という定数を与えるものです.Xの区間が変わるところ でYの値は離散的になっていますが,gnuplotはその部分を線分でつないで しまいます. set sample を使ってサンプリング数を増やしてい るのは,この不連続部分での線分が,なるべく垂直になるようにするため です. 途切れた関数.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) ここでは2つの正弦関数f(x)とg(x)を定義して,比較しています.f(x)の方 は xの絶対値が90度以下でゼロになるもの,g(x)は同じ領域でゼロで除算 するものです.見やすいように,f(x)の方は少しずらして表示しています. ループの作り方.gnuplotのコマンドに reread と if というものがあり, これらを組み合わせると簡単なループが作れます.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" |