Rでベクトル場を図示する
ベクトル場がxy座標の式で与えられているときに、それがどんな場を表しているかは、具体的にいくつかのベクトルを図示してみると、なんとなく見えてきたりします。
f(x, y) = (x, y)
みたいな単純なベクトル場でさえ、慣れてないとイメージわかなかったりしますよね。
Rで図示してみましょう。(唐突)
「ぶゎっ」て感じですね。
「ベクトル場を表す関数」のところを書き換えれば、いろいろ図示できます。
X <- y
Y <- x
とすると↓
X <- -y
Y <- x
とすると↓
X <- 5
Y <- 0
とすると↓
X <- y^2
Y <- x^2
とすると↓
矢が長すぎる場合は、変数aの値を小さくすれば、矢が短くなります。
a <- 0.01 # 矢の長さ(比率)
としたもの↓
矢の長さだけで表現するのに限界を感じたら、色や太さを使ってもいいかもしれません。(色や太さに指定している18やら5やらの数字は、色や太さがほどよくなるように恣意的に決めたものです)
こうやって、絵に描いたところで問題が解けるというわけでもないですが、なんかこう、気分がのってくるでしょ。
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)のベクトル場(ベクトルの大きさを、長さ/色/太さで表現) |
こうやって、絵に描いたところで問題が解けるというわけでもないですが、なんかこう、気分がのってくるでしょ。
コメント
コメントを投稿