9.2 ベクトル場のスケーリング

2次元ベクトル場を描くサブルーチン Vector.draw では, ベクトルの各成分 をV-座標系における単位で表現しています. ただし実際には, V-座標系の単位 に変換した配列を与える必要はなく, スケーリングファクターを与えてやれば 十分です. このスケーリングファクターは, パラメタ lnrmal.TRUE.(初期値)ならば内部的に決定され, .FALSE. ならば内部変 数 xfact1, yfact1を参照します. したがって, このデモプ ログラム(U2D6)のように, スケーリングファクターを陽に指定する場合 は, lnrmal.FALSE. として xfact1yfact1 を設定します. ここで は, UV の値が1桁違いますから, xfact1=0.5, yfact1=0.05 としました. たとえば, ベクトル (U,V)=(0.1,1) は, V- 座標系単位で (0.05, 0.05) の大きさのベクトルとして表示されます. つまり, スケーリングファクターとは, 次元量として与えられたベクトルの成分をV-座 標系の単位で表現される矢印の成分に変換するための比例係数なのです.

またこの例では, パラメタ lunit.TRUE. としてユニット ベクトルを描いています. (この初期値は .FALSE.で, ユニットベクト ルを描きません.) 表示するユニットベクトルの大きさは, V-座標系の単位を 用いてパラメタ vxunit, vyunit をそれぞれ0.1に設定して います. もしも次元量で指定したいならば, パラメタuxunit, uyunit を設定することでユニットベクトルを描くこともできます. Vector.uvtitle ルーチンを用いると, このユニットベクトルにタイトルをつけること ができます. x成分は 'U', y成分は 'V' としました. なお, 図の下部に表示されているユニットベクトルの大きさXUNIT, YUNIT は次元量 です. この例のように, ユニットベクトルの大きさをV-座標系の単位で指定し た場合は, それぞれをスケーリングファクターで割った値となります.

Vectorが図の下に書くメッセージについてですが, ユニットベクトルを描かな いときにはスケーリングファクターが表示され, ユニットベクトルを描くとき にはユニットベクトルの大きさが表示されます. ユニットベクトルを描くとき にも, パラメタ lumsg.FALSE. とすることによってスケー リングファクターの表示に切替えることもできます. また, メッセージを何も 描かせたくないときには, パラメタ lmsg.FALSE. としま す.

#
# u2d6.rb

require "narray"
require "numru/advanceddcl"
include NumRu::AdvancedDCL
include NMath


nx = 11
ny = 11
xmin = -1
xmax = 1
ymin = -1
ymax = 1
u = NArray.sfloat(nx, ny)
v = NArray.sfloat(nx, ny)

#-- data ---
for j in 0..ny-1
  for i in 0..nx-1
    x = xmin + (xmax-xmin)*i/(nx-1).to_f
    y = ymin + (ymax-ymin)*j/(ny-1).to_f
    u[i,j] =  x * 0.1
    v[i,j] = -y
  end
end

#-- graph ---
Dev.open

Frame.new

Fig.window=[xmin, xmax, ymin, ymax]
Fig.viewport=[0.2, 0.8, 0.2, 0.8]
Fig.transnum=1

Axis.draw

Vector.lnrmal =  false
Vector.xfact1 = 0.5
Vector.yfact1 = 0.05
Vector.lunit =  true
Vector.vxunit = 0.1
Vector.vyunit = 0.1
Vector.vxuoff = 0.06
Vector.uvtitle('X', 'U')
Vector.uvtitle('Y', 'V')
Vector.draw(u, v)

Dev.close

PROGRAM U2D6





\resizebox{10cm}{!}{\includegraphics{u2d2/u2d6.eps}}
u2d6.rb: frame1