データ解析でも数値計算でも一刻も早く計算結果が見たいものです. 面倒な
FORMAT を考えて, WRITE 文でたくさんの数字列をアウトプット
して, それをじっくり眺めて…というようなことをやっていた時代もそ
んなに昔のことではないのですが, そんな時, DCLを用いるとわずか数行でデー
タをグラフ化できます.
まず, 例題として, カオスを生み出す簡単なロジスティク模型を考えてみましょ
う.
yn+1 = r yn (1-yn). | (1.1) |
## quick1.rb require "narray" require "numru/advanceddcl" include NumRu include NumRu::AdvancedDCL include NMath nmax = 50 x = NArray.sfloat(nmax+1) y = NArray.sfloat(nmax+1) #-- data ---- r = 3.7 x[0] = 0.0 y[0] = 0.5 for n in 0..nmax-1 x[n+1] = x[n] + 1.0 y[n+1] = r*y[n]*(1.0-y[n]) end #-- graph ---- Dev.open Frame.new Axis.draw(x,y) Plot.draw(x,y) Dev.closePROGRAM QUICK1
UNIX システムで AdvancedDCL が標準的にインストールされている場合には,
% ruby quick1.rbによってウインドウがひとつ現れて, ウインドウの位置を確定すると描画がはじまり, 下のようなグラフが得られます. このとき, 次の警告メッセージが出ることが多いと思いますが, 特に気にする必要はありません.
*** WARNING (STSWTR) *** WORKSTATION VIEWPORT WAS MODIFIED.図形表示の終了はマウスクリックで行ないます.
「おまじない」のDev.open および Frame.new メソッドで図形出力装置を準備し, 作画領域を設定します.
実際にスケーリングを行なって折れ線や座標軸を描いたのは,Axis.drawとPlot.draw というメソッドです.
このメソッドは, (x,y)座標のデータを与えると, それらを実線で結んでプロットします.
描画終了の「おまじない」が Dev.close ルーチンです. これらの「おまじない」については, 第2,
5章で説明します.
つぎに, プログラムquick2 で意地の悪いデータを与えて作図してみましょう.
# # quick2.rb require "narray" require "numru/advanceddcl" include NumRu::AdvancedDCL include NMath nmax = 400 dt = PI/(nmax-1) x = NArray.sfloat(nmax) y = NArray.sfloat(nmax) #-- data ---- for n in 0..nmax-1 t = dt*n x[n] = 1.0e5*sin(6.0*t) y[n] = 1.0e-4*cos(14.0*t) + 1.0 end #-- graph ---- Dev.open Frame.new Axis.draw(x,y) Plot.draw(x,y) Dev.closePROGRAM QUICK2
この例ではデータの変動幅が極端なのですが, 結果はどうでしょうか. x軸
のラベルが重なったり, y軸に1.00005というような不細工なラベルを付けて,
それが描画範囲を越えてしまったりという様なことは起こりません. 与えられ
たデータから適当な目盛間隔やラベルの間隔を求めて座標軸を描いているので
すが, ラベルの文字数が大きすぎる場合には,この例のようにファクター値
(
104, 10-5)やオフセット値(1)を適当に選んで軸の端に表示し, ラベ
ルが適当な文字数以内におさまるようにします.
quick2 ではDev.open("X")となっていますが, これで図形の出力先を決められるようになります. この場合,3つの出力先が可能で, X ウインドウシステムが起動されている状態 でDev.open("X")とすると, QUICK1 の例と同様にウインドウが現れ ます. 一方, ("PS")とすると, カレントディレクトリに dcl.ps というポストスクリプトファイ ルができます. そこで,
% lpr dcl.psと入力すれば, ポストスクリプトプリンタに結果が出力されます. また, ("Tek")を指定するとテクトロ端末で描画ができます.