从R中重复绘制元素

时间:2013-12-16 03:27:01

标签: r

我正在尝试创建(X0,Ujn)函数中创建的repeat点的图。在R中有办法做到这一点吗?这是我的代码:

LaxFriedrichs <- function(X0,delx,delt,t){
  repeat{
    Uj <- sin(X0)
    U <- sin(X0+2*delx)
    Ujn <- (Uj + U)/2 + (Uj - U)*(t/(2*delx))
    X0 <- X0+delx
    t <- delt + t

    plot(X0,Ujn)

    if (X0 > 2*pi/40) break
  }
}

2 个答案:

答案 0 :(得分:2)

这可能不是最有效的实现,但它至少会绘制所有点(保持附加到x和y列表,然后在最后绘制这些点):

LaxFriedrichs <- function(X0,delx,delt,t){
  all.x = c()
  all.y = c()
  repeat{
    Uj <- sin(X0)
    U <- sin(X0+2*delx)
    Ujn <- (Uj + U)/2 + (Uj - U)*(t/(2*delx))
    X0 <- X0+delx
    t <- delt + t

    all.x <- c(all.x, X0)
    all.y <- c(all.y, Ujn)

    if (X0 > 2*pi/40) break
  }
  plot(all.x, all.y)
}

LaxFriedrichs(.001, .001, .001, 0.5)

答案 1 :(得分:2)

稍微缩短版本,利用R的矢量运算。

f <- function(x0, dx, dt, t0) {
  x <- seq(x0,2*pi/40,by=dx)
  t <- seq(t0,t0+(length(x)-1)*dt,by=dt)

  Uj  <- sin(x)
  U   <- sin(x+2*dx)
  Ujn <- (Uj + U)/2 + (Uj - U)*(t/(2*dx))

  plot(x,Ujn)
}

f(.001, .001, .001, .5)

此处,xt是向量,因此UjU和最后Ujn只需一步计算,而不是循环计算。

有一点需要注意:在原始算法中,每个步骤Ujn都会在x计算,但会存储x+dx,因此您最终会绘制Ujn(x) vs { {1}}。这里的方法纠正了这一点,因此x轴偏移了(x+dx)