2次元ランダムウォーク
Posted feedbacks - R
なぜかRで 1-1と2-1は解いてません 本職の人はどう書くんでしょう?
see: R-Tips
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | t <- 1000
#1次元
plot(cumsum(c(0,2*floor(2*runif(t-1))-1)),type="l")
#2次元
x <- 0
y <- 0
f.x <- function(t){switch(t,1,-1,0,0)}
f.y <- function(t){switch(t,0,0,1,-1)}
w <- floor(4*runif(t)+1)
move.x <- unlist(lapply(as.list(w),f.x))
move.y <- unlist(lapply(as.list(w),f.y))
x <- x + cumsum(move.x)
y <- y + cumsum(move.y)
plot(x,y,type="b")
#3次元
library(scatterplot3d)
z <- 1:t
scatterplot3d(x,y,z,pch=20)
|
本職ではありませんが・・・
simecolというライブラリーに、ランダムウォークを実装するためのフレームワークが用意されています。
もちろんアニメーションもします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | library(simecol)
size <- 50
obj <- rwalkModel(
parms = list(size=size, area=c(0, size, 0, size)),
init = data.frame(time=0, x=size/2, y=size/2),
times = c(from=0, to=100, by=1),
main = function(time, init, parms) {
r <- 2 * pi * runif(1)
data.frame(time=time, x=((init$x + cos(r)) %% parms$size),
y=((init$y + sin(r)) %% parms$size))
}
)
sim(obj, animate=T)
|
2次元も1次元と同じような書き方でいいと思いますが。
1 2 | w <- floor(4*runif(t)+1)
plot(cumsum(c(1,-1,0,0)[w]),cumsum(c(0,0,1,-1)[w]),type="b")
|
もっといえば、1~4の乱数が欲しいようなときはrunif()ではなくsample()を使った方がRっぽいかもです。
1 | plot(cumsum(data.frame(x=c(1,-1,0,0), y=c(0,0,1,-1))[sample(4, t, replace=T),]), type="b")
|





ytakenaka
#6806()
Rating2/2=1.00
2次元ランダムウォークをつくってみてください。
******
元は3本建てにしようかと思ったけど、上の一本に絞りました。おまけとして、3本とも下に補足しておきます。作れるようでしたら作ってみてください。
1.一次元のランダムウォークを作ってください。
1.1 データファイルに残してください。 フォーマット:時間 位置
おまけ)
可視化が簡単な処理系・プログラミング言語でしたら実際に可視化してみてください。フォーマットしたファイルをスプレッドシートやplotutilitiesなどの可視化ソフトを使って、実際に動きをかくにんしてみましょう。:-)
2.同じように2次元のランダムウォークを作ってください。
2.1 1.1と同じようにしてください。
フォーマット:時間 x位置 y位置
3.凝りたければ、アニメーションにするもよし、3次元の動きをとるもよし、自分の想像力がいかせるところまでやってみてください。
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AF
分からないというヒトへの分かりにくいヒント:
今の位置から次の時間の位置が決まるのですが、決まりかたが、乱数で一歩後退するか一歩先にいくか?ということをやればよいです。
[ reply ]