R 中的布朗运动/循环

Brownian Motion / loop in R

我想在R中实现维纳表示的功能(参见https://en.wikipedia.org/wiki/Wiener_process#Wiener_representation)。 (我想实现第一个公式)绘制这个时 函数它应该看起来更类似于标准的布朗运动,随机向量的维数越高,越低它看起来应该更平滑。 我试图实现它,但我认为循环中某处存在错误,因为当 n 很高时,图表看起来不应该更像布朗运动,我什至高达 10000 没有足够的波动在每个图表中

brownmotion <- function(n, time=1000){
W <- rep(0, time)

Wp1 <- rep(0, time)
Wp2 <- 0
X <- seq(0, 1, length.out = time)

xsi <- rnorm(n)
for ( i in 1:length(X)){
for (j in 1:n){
  Wp1[i] <- X[i]*xsi[1]
  Wp2 <- Wp2 + xsi[j]*sin(j*X[i]*pi)/(j*pi)
  
  W[i] <- Wp1[i] + sqrt(2)*Wp2
}

}
return (W)
 }

因为这是 R,最好不要循环:

brownmotion <- function(n, time=1000){
  X <- seq(0, 1, length.out = time)
  xsi <- rnorm(n + 1)
  W <- xsi[1] * X + sqrt(2) * colSums(xsi[-1] * sin(pi * 1:n %*% t(X)) / (pi * 1:n))
  return (W)
}

编写此代码时,我注意到您的原始代码中有一个小错误,您使用了两次 xsi[1]。我通过使 xsi 长度为 n + 1 来避免这种情况,因此 xsi[1] 可能是初始值并且仍然有 n 个值。