【问题标题】:Efficient simulation of brownian motion with drift in RR中漂移的布朗运动的有效模拟
【发布时间】:2016-07-07 16:13:00
【问题描述】:

我想有效地模拟漂移 d>0 的布朗运动,如果超过了一些障碍 b 或 -b,漂移的方向会发生变化(没有反射,只是漂移方向的变化!)。
for-loop 是这样做的简单方法

 step<-0.1 #step size
 sig<-1 #sign of drift
 T<-10^4 #length of process
 b<-300; d<-0.5#barrier and drift
 W<-rep(NA,(T/step))
 W[1]<-0
 for (i in 2:(T/step))
 {
  if (W[i-1]>b) {sig<- -1} #change drift to -1
  if (W[i-1]< -b) {sig<-1} #change drift to +1
  W[i]<-W[i-1]+rnorm(1,d*sig*step,sqrt(step))
 }

当然,这个循环在 R 中需要很多时间,尤其是对于小步长。 因此,我对可能使用矢量运算或apply()-command 的更有效的解决方案感兴趣。 (如果是简单的布朗运动,我可以使用cumsum(rnorm()),这里有类似的解决方案吗?)

非常感谢!!

【问题讨论】:

    标签: r performance simulation


    【解决方案1】:

    您对W[i]sig 进行了递归计算,它在每个步骤中也执行了一些逻辑。在 R 中您可能无法做很多事情来大幅减少执行时间,但有几件事可以将时间减少近 50%。特别是,不是在每一步都调用rnorm,而是通过调用rnorm 一次与mean=0 来计算num_step 值并存储结果来向量化这个计算。在循环的每个步骤中,来自该向量的值被添加到该步骤的平均值中。确定sig 的值的逻辑也可以简化一点。已发布方法和新代码的计时代码是:

      step<-0.1         #step size
      T<-10^4           #length of process
      b<-300; d<-0.5    #barrier and drift
    
      print(system.time({
        sig <- 1           #sign of drift
        set.seed(123)      # set seed
        W<-rep(NA,(T/step))
        W[1]<-0
        for (i in 2:(T/step))
        {
          if (W[i-1]>b) {sig<- -1} #change drift to -1
          if (W[i-1]< -b) {sig<-1} #change drift to +1
          W[i]<-W[i-1]+rnorm(1,d*sig*step,sqrt(step))
        }
      }))
    
      print(system.time({
        sig <- 1                # reset value of sig
        set.seed(123)           # reset seed
        num_steps <- trunc(T/step)
        W1 <- numeric(num_steps)
        ep <- rnorm(num_steps, 0, sqrt(step))
        for (i in 2:num_steps)  {
          if(abs(W1[i-1]) > b) sig <- ifelse( W1[i-1] >b, -1, 1) 
          W1[i] <- W1[i-1]+d*sig*step +ep[i-1]
        }
      }))     
    

    WW1 这两个计算的结果应该相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2017-12-14
      • 2011-08-12
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多