ベクトル場を描く

Last modified: 2018 年 12 月 30 日 03 時

for文を使い、各点で矢印を描画して、ベクトル場の図示を再現する

主な使用関数: Arrowline.

vector field

格子の調整

ここでは、$[-1,1]\times[-1,1]$の範囲にベクトル場を描いてみましょう。Setwindow([-1.2,1.2], [-1.2,1.2])で、表示する枠を$[-1.2,1.2]\times[-1.2,1.2]$に設定します。

ベクトル場の矢印の濃度を調整するために、まずはベクトル場の起点の格子を調節する定数Nを用意します。領域をxy方向それぞれN=20個に分割し、各格子点を中心とする半径0.02の円のデータCircledata([x,y],0.02)をリストCLに格納します。

N=20;
xmin=-1;
xmax=1;
ymin=-1;
ymax=1;

Setwindow([-1.2,1.2], [-1.2,1.2]);

// 格子点
CL=list();
for i=0:N
  for j=0:N
    x=xmin+(xmax-xmin)/N*i;    //格子点の計算
    y=ymin+(ymax-ymin)/N*j;    //
    CL($+1)=Circledata([x,y], 0.02);
  end
end

//Windisp(CL);

//は、Scilabのコメントアウトの記法です。Windisp(CL)を実行し、格子点の様子を見ながら、定数Nを調節することとします。

[このページのトップへ]

ベクトル場の定義

ここで描きたいベクトル場は $X=(-y,-x)$ で、ベクトル場の成分関数fx, fyを次のように定義します:

function fx=fx(X,Y); fx=-Y; endfunction
function fy=fy(X,Y); fy=-X; endfunction

[このページのトップへ]

TeXファイルの書き出し

現在のsceファイルのあるディレクトリの下のtexディレクトリにTeXファイルを書き出し。
Beginpicture('3cm')で、図の単位長を3cmに指定。Setax(6,' ')で、原点の記号Oを描画しないようにしています。

R=12として、ベクトル場の長さを調整する定数を用意します。(x0,y0)が格子点の座標で、L=norm([fx(x0,y0),fy(x0,y0)])でベクトル場のノルムを計算します。
(x1,y1), (x2,y2)をそれぞれ始点と終点とするような矢印を描画には、Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l')を使います。他の矢印の付け方は次を参照してください: sample:矢印の描画

Openfile('tex/vector_field_sample.tex');
Beginpicture('3cm');
Setax(6, ' ');

R=12; // ratio
for i=0:N
  for j=0:N
    x0=xmin+(xmax-xmin)/N*i;  // 格子点
    y0=ymin+(ymax-ymin)/N*j;  //
    L=norm([fx(x0,y0),fy(x0,y0)]);  //ベクトル場のノルム
    
    if L==0 then  //ベクトル場のノルムが0のときは除外する
      continue;
    else
      x1=x0-fx(x0,y0)/R;  // 矢印の始点
      y1=y0-fy(x0,y0)/R;  // 
      x2=x0+fx(x0,y0)/R;  // 矢印の終点
      y2=y0+fy(x0,y0)/R;  //
      Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l');
    end
  end
end

Endpicture(1);
Closefile();

構文はArrowline(始点,終点,矢じりの大きさ,矢じりの開き角(度数法),矢じりの位置,矢印の太さ,矢じりの形状と配置)。矢じりの位置は、0から1の範囲の実数で指定、例えば、0.5なら、真ん中に矢じりがくるようになります。矢じりと形状と配置は、'f'で塗りつぶした三角形の矢じり、'l'で折れ線の矢じり、'c'は矢じりの中心が棒の終点に一致するようになります(デフォルトは矢じりの先端と棒の終点が一致)。これは'lc'などと組み合わせることができます。

L=0となる点、すなわち、ベクトル場が消える点でArrowlineを実行するとエラーになるので、if構文で取り除いていておきます。

[このページのトップへ]

ソースコード

ソース(.sce)のダウンロード
N=20;
xmin=-1;
xmax=1;
ymin=-1;
ymax=1;

Setwindow([-1.2,1.2], [-1.2,1.2]);

// lattice
CL=list();
for i=0:N
  for j=0:N
    x=xmin+(xmax-xmin)/N*i;
    y=ymin+(ymax-ymin)/N*j;
    CL($+1)=Circledata([x,y], 0.02);
  end
end

//Windisp(CL);

function fx=fx(X,Y); fx=-Y; endfunction
function fy=fy(X,Y); fy=-X; endfunction

Openfile('tex/vector_field_sample.tex');
Beginpicture('3cm');
Setax(6, ' ');

R=12; // ratio
for i=0:N
  for j=0:N
    x0=xmin+(xmax-xmin)/N*i;  // 格子
    y0=ymin+(ymax-ymin)/N*j;  //
    L=norm([fx(x0,y0),fy(x0,y0)]);  //ベクトル場のノルム
    
    if L==0 then  //ベクトル場のノルムが0のときは除外する
      continue;
    else
      x1=x0-fx(x0,y0)/R;  // 矢印の終点
      y1=y0-fy(x0,y0)/R;  // 
      x2=x0+fx(x0,y0)/R;  // 矢印の始点
      y2=y0+fy(x0,y0)/R;  //
      Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l');
    end
  end
end

Endpicture(1);
Closefile();

[このページのトップへ]