2013-12-16 67 views
2

我試圖創建在repeat函數中創建的(X0,Ujn)點的圖。有沒有辦法在R中做到這一點?這裏是我的代碼:從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 
    } 
} 
+1

您是否事先知道圖中x軸和y軸的極限? –

回答

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) 
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在一個步驟中計算出的,而不是在一個循環。

有一點需要注意:在原來的算法,在每一步Ujnx計算,但x+dx存儲,所以你最終繪製Ujn(x) VS (x+dx)。這裏的方法糾正了這種情況,所以x軸偏移了-dx