2015年11月18日水曜日

Rでベクトル場を図示する

ベクトル場がxy座標の式で与えられているときに、それがどんな場を表しているかは、具体的にいくつかのベクトルを図示してみると、なんとなく見えてきたりします。

  f(x, y) = (x, y)

みたいな単純なベクトル場でさえ、慣れてないとイメージわかなかったりしますよね。

Rで図示してみましょう。(唐突)

#
# ベクトル場を表す関数
#
f <- function(x, y){
  X <- x
  Y <- y
  return( c(X,Y) )
}
 
#
# 矢印を描画する関数
#
write_arrow <- function(x, y){
  a <- 0.1  # 矢の長さ(比率)
  b <- 0.05 # 矢尻の長さ
  arrow_head <- f(x, y) * a   # aの値で長さを調整
 
  arrows( x,                  # 矢のx座標(from)
          y,                  # 矢のy座標(from)
          x + arrow_head[1],  # 矢のx座標(to)
          y + arrow_head[2],  # 矢のy座標(to)
          length = b )         # 矢尻のサイズ
}
 
#
# ここからメイン
#
n <- 10 # 格子の1辺の数
 
# 描画する領域を準備
plot(0, 0, xlim=c(-n, n), ylim=c(-n, n), type="n", xlab="x", ylab="y")
 
# 各格子点について繰り返す
for(x in -n:n){
  for(y in -n:n){
    write_arrow(x, y)
  }
}

f(x, y) = (x, y)のベクトル場


「ぶゎっ」て感じですね。

「ベクトル場を表す関数」のところを書き換えれば、いろいろ図示できます。


  X <- y
  Y <- x
とすると↓
f(x, y) = (y, x)のベクトル場

  X <- -y
  Y <-  x
とすると↓
f(x, y) = (-y, x)のベクトル場

  X <- 5
  Y <- 0
とすると↓
f(x, y) = (5, 0)のベクトル場

  X <- y^2
  Y <- x^2
とすると↓

f(x, y) = (y^2, x^2)のベクトル場

矢が長すぎる場合は、変数aの値を小さくすれば、矢が短くなります。

  a <- 0.01  # 矢の長さ(比率)

としたもの↓

f(x, y) = (y^2, x^2)のベクトル場(矢短め)

矢の長さだけで表現するのに限界を感じたら、色や太さを使ってもいいかもしれません。(色や太さに指定している18やら5やらの数字は、色や太さがほどよくなるように恣意的に決めたものです)

#
# 矢印を描画する関数
#
write_arrow <- function(x, y){
  a <- 0.01  # 矢の長さ(比率)
  b <- 0.05 # 矢尻の長さ
  arrow_head <- f(x, y) * a   # aの値で長さを調整
 
  l <- sqrt(x^2 + y^2)
  cols <- heat.colors(16)
 
  arrows( x,                  # 矢のx座標(from)
          y,                  # 矢のy座標(from)
          x + arrow_head[1],  # 矢のx座標(to)
          y + arrow_head[2],  # 矢のy座標(to)
          length = b,         # 矢尻のサイズ
          col = cols[18 - round(l)], # 矢の色
          lwd = round(l)/5 )         # 矢の太さ
}


f(x, y) = (y^2, x^2)のベクトル場(ベクトルの大きさを、長さ/色/太さで表現)

こうやって、絵に描いたところで問題が解けるというわけでもないですが、なんかこう、気分がのってくるでしょ。




0 件のコメント:

コメントを投稿