2.1 とりあえず折れ線

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

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

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

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

# quick1.rb

require "narray"
require "numru/dcl"

include NumRu
include Math

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 ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::grfrm

DCL::usgrph(x, y)

DCL::grcls

program quick1

コマンドラインで

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

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

「おまじない」のgropn および grfrm メソッド(元サブルーチン)で図形出力 装置を準備し, 作画領域を設定します. 実際にスケーリングを行なって折れ線 や座標軸を描いたのは, 自動スケーリングパッケージ USPACK のなかの usgrph というメソッド(元サブルーチン)です. このメソッド(元サブルーチン)は, (x,y)座標のデー タとその個数(nmax+1)を与えると, それらを実線で結んでプロットしま す. 描画終了の「おまじない」が grcls ルーチンです. これらの「お まじない」については, 第3, 6章で説明します.

つぎに, usgrph ルーチンの自動スケーリング機能の実力を示すために, プログラムquick2 で意地の悪いデータを与えて作図してみましょう.

# quick2.rb

require "narray"
require "numru/dcl"

include NumRu
include Math

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 ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::grfrm

DCL::usgrph(x, y)

DCL::grcls

program quick2

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

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

quick2 のグラフ部分では15行めからの3行が増えていますが, これで図 形の出力先を実行時に決められるようになります. 実行ファイルを作りこれを 実行すると, 標準的な場合には

WORKSTATION ID (I) ? ;
1:X, 2:PS, 3:Tek ;
ときいてきます. GRPH1 のメソッド(元サブルーチン) sgpwsn を呼んで, 今の環境で 利用可能な「ワークステーション名」のリストを書き出しています. この場合, 3つの出力先が可能で, X ウインドウシステムが起動されている状態で1を入力 すると, quick1 の例と同様にウインドウが現れます. 一方, 2 (PS)を 指定すると, カレントディレクトリに dcl.ps というポストスクリプトファイ ルができます. そこで,
% lpr dcl.ps
と入力すれば, ポストスクリプトプリンタに結果が出力されます. また, 3 (Tek)を指定するとテクトロ端末で描画ができます.

自動スケーリング機能の USPACK メソッド(元サブルーチン)を使って, さらに手のこんだ1 次元データの作図が可能です. それは, 第6章で説明することに しましょう.