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行で, 自動的にスケールを決 めて作図してくれます.

      PROGRAM QUICK1

      PARAMETER( NMAX=50 )
      REAL X(0:NMAX), Y(0:NMAX)

*-- ロジスティク模型 ----
      R    = 3.7
      X(0) = 0.0
      Y(0) = 0.5
      DO 10 N=0,NMAX-1
        X(N+1) = X(N) + 1.0
        Y(N+1) = R*Y(N)*(1.-Y(N))
   10 CONTINUE

*-- グラフ ----
      CALL GROPN( 1 )
      CALL GRFRM
      CALL USGRPH( NMAX+1, X, Y )
      CALL GRCLS

      END
PROGRAM QUICK1

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

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

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

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

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

      PROGRAM QUICK2

      PARAMETER( NMAX=400 )
      REAL X(NMAX), Y(NMAX)

*-- リサジューの図 ----
      DT = 3.14159 / (NMAX-1)
      DO 10 N=1,NMAX
        T = DT*(N-1)
        X(N) = 1.E 5*SIN( 6.*T)
        Y(N) = 1.E-4*COS(14.*T) + 1.
   10 CONTINUE

*-- グラフ ----
      WRITE(*,*) ' WORKSTATION ID (I)  ? ;'
      CALL SGPWSN
      READ (*,*) IWS

      CALL GROPN( IWS )
      CALL GRFRM
      CALL USGRPH( NMAX, X, Y )
      CALL GRCLS

      END
PROGRAM QUICK2

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

\resizebox{10cm}{!}{\includegraphics{quick/quick2.eps}}
quick2.f: 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章で説明することに しましょう.