1.1 とりあえず折れ線

データ解析でも数値計算でも一刻も早く計算結果が見たいものです. 面倒な FORMAT を考えて, WRITE 文でたくさんの数字列をアウトプット して, それをじっくり眺めて…というようなことをやっていた時代もそ んなに昔のことではないのですが, そんな時, DCLを用いるとわずか数行でデー タをグラフ化できます.

まず, 例題として, カオスを生み出す簡単なロジスティク模型を考えてみましょ う.

yn+1 = r yn (1-yn). (1.1)

r > r = 3.5700 でカオス解となりますが, 次のFORTRANプログラム QUICK1 は, パラメータ r = 3.7, 初期値 y0 = 0.5 として, y50 まで求めて, グラフ化しようというものです. 今は「おまじない」 である GROPN 等を含めても14行めからの4行で, 自動的にスケールを決 めて作図してくれます.

## 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.close

PROGRAM QUICK1

UNIX システムで AdvancedDCL が標準的にインストールされている場合には,

% ruby quick1.rb
によってウインドウがひとつ現れて, ウインドウの位置を確定すると描画がはじまり, 下のようなグラフが得られます. このとき, 次の警告メッセージが出ることが多いと思いますが, 特に気にする必要はありません.
*** WARNING (STSWTR) *** WORKSTATION VIEWPORT WAS MODIFIED.
図形表示の終了はマウスクリックで行ないます.

\resizebox{10cm}{!}{\includegraphics{quick/quick1-1.eps}}
quick1.rb: frame1

「おまじない」のDev.open および Frame.new メソッドで図形出力装置を準備し, 作画領域を設定します. 実際にスケーリングを行なって折れ線や座標軸を描いたのは,Axis.drawPlot.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.close

PROGRAM QUICK2



この例ではデータの変動幅が極端なのですが, 結果はどうでしょうか. x軸 のラベルが重なったり, y軸に1.00005というような不細工なラベルを付けて, それが描画範囲を越えてしまったりという様なことは起こりません. 与えられ たデータから適当な目盛間隔やラベルの間隔を求めて座標軸を描いているので すが, ラベルの文字数が大きすぎる場合には,この例のようにファクター値 ( 104, 10-5)やオフセット値(1)を適当に選んで軸の端に表示し, ラベ ルが適当な文字数以内におさまるようにします.

\resizebox{10cm}{!}{\includegraphics{quick/quick2.eps}}
quick2.rb: frame1

quick2 ではDev.open("X")となっていますが, これで図形の出力先を決められるようになります. この場合,3つの出力先が可能で, X ウインドウシステムが起動されている状態 でDev.open("X")とすると, QUICK1 の例と同様にウインドウが現れ ます. 一方, ("PS")とすると, カレントディレクトリに dcl.ps というポストスクリプトファイ ルができます. そこで,

% lpr dcl.ps
と入力すれば, ポストスクリプトプリンタに結果が出力されます. また, ("Tek")を指定するとテクトロ端末で描画ができます.