我正在尝试创建(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
}
}
答案 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)
此处,x
和t
是向量,因此Uj
,U
和最后Ujn
只需一步计算,而不是循环计算。
有一点需要注意:在原始算法中,每个步骤Ujn
都会在x
计算,但会存储x+dx
,因此您最终会绘制Ujn(x)
vs { {1}}。这里的方法纠正了这一点,因此x轴偏移了(x+dx)
。