Comment detail

2次元ランダムウォーク (Nested Flatten)

なぜかRで 1-1と2-1は解いてません 本職の人はどう書くんでしょう?

 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")

Index

Feed

Other

Link

Pathtraq

loading...