在R中实现快速数值计算

在R中实现快速数值计算,r,numerical-methods,fluid-dynamics,R,Numerical Methods,Fluid Dynamics,我试图在R中做一个广泛的计算。十八个小时过去了,但我的RStudio似乎继续工作。我不确定我是否可以用另一种方式编写脚本以加快速度。我试图实现一个超过50000 x 350的矩阵,如下所示: #defining the discretization of cells dt<-1 t<-50000 dz<-0.0075 z<-350*dz #velocity & diffusion v<-2/(24*60*60) D<-0.02475/(24*60

我试图在R中做一个广泛的计算。十八个小时过去了,但我的RStudio似乎继续工作。我不确定我是否可以用另一种方式编写脚本以加快速度。我试图实现一个超过50000 x 350的矩阵,如下所示:

#defining the discretization of cells
dt<-1
t<-50000

dz<-0.0075
z<-350*dz

#velocity & diffusion 
v<-2/(24*60*60)
D<-0.02475/(24*60*60) 

#make the big matrix (all filled with zeros)
m <- as.data.frame(matrix(0, t/dt+1, z/dz+2)) #extra columns/rows for boundary conditions

#fill the first and last columns with constant boundary values
m[,1]<-400
m[,length(m)]<-0

#implement the calculation
for(j in 2:(length(m[1,])-1)){
  for(i in 2:length(m[[1]])){
    m[i,][2:length(m)-1][[j]]<-m[i-1,][[j]]+ 
      D*dt*(m[i-1,][[j+1]]-2*m[i-1,][[j]]+m[i-1,][[j-1]])/(dz^2)-
      v*dt*(m[i-1,][[j+1]]-m[i-1,][[j-1]])/(2*dz)
  }} 
定义单元的离散化
dt只需做一些简单的优化就可以了。您的代码的原始版本代码在我的笔记本电脑上大约需要5天。使用一个矩阵,只计算一次循环中重复使用的值,我们将时间缩短到7分钟左右

想一想混乱的结构,比如

m[i,][2:length(m)-1][[j]]
这相当于

m[[i, j]]
这会更快(也更容易理解)。进行此更改将运行时间进一步减少2倍以上,约为3分钟

把这些放在一起,我们有

dt<-1
t<-50000
dz<-0.0075
z<-350*dz

#velocity & diffusion 
v<-2/(24*60*60)
D<-0.02475/(24*60*60) 

#make the big matrix (all filled with zeros)
m <- (matrix(0, t/dt+1, z/dz+2)) #extra columns/rows for boundary conditions

# cache a few values that get reused many times 
NC = NCOL(m)
NR = NROW(m)
C1 = D*dt / dz^2
C2 = v*dt / (2*dz)

#fill the first and last columns with constant boundary values
m[,1]<-400
m[,NC]<-0

#implement the calculation
for(j in 2:(NC-1)){
  for(i in 2:NR){
    ma = m[i-1,]
    ma.1 = ma[[j+1]]
    ma.2 = ma[[j-1]]
    m[[i,j]] <- ma[[j]] + C1*(ma.1 - 2*ma[[j]] + ma.2) - C2*(ma.1 - ma.2)
    }
  } 

dt只需做一些简单的优化就可以了。您的代码的原始版本代码在我的笔记本电脑上大约需要5天。使用一个矩阵,只计算一次循环中重复使用的值,我们将时间缩短到7分钟左右

想一想混乱的结构,比如

m[i,][2:length(m)-1][[j]]
这相当于

m[[i, j]]
这会更快(也更容易理解)。进行此更改将运行时间进一步减少2倍以上,约为3分钟

把这些放在一起,我们有

dt<-1
t<-50000
dz<-0.0075
z<-350*dz

#velocity & diffusion 
v<-2/(24*60*60)
D<-0.02475/(24*60*60) 

#make the big matrix (all filled with zeros)
m <- (matrix(0, t/dt+1, z/dz+2)) #extra columns/rows for boundary conditions

# cache a few values that get reused many times 
NC = NCOL(m)
NR = NROW(m)
C1 = D*dt / dz^2
C2 = v*dt / (2*dz)

#fill the first and last columns with constant boundary values
m[,1]<-400
m[,NC]<-0

#implement the calculation
for(j in 2:(NC-1)){
  for(i in 2:NR){
    ma = m[i-1,]
    ma.1 = ma[[j+1]]
    ma.2 = ma[[j-1]]
    m[[i,j]] <- ma[[j]] + C1*(ma.1 - 2*ma[[j]] + ma.2) - C2*(ma.1 - ma.2)
    }
  } 

dt在我的笔记本电脑上,循环的一次迭代大约需要26毫秒。整个矩阵大约需要126小时(5天)。为什么要重新发明轮子?我不知道他能不能用稀疏的matrices@ZheyuanLi-我还得学会如何在矩阵中写form@MichaelChirico:我肯定有可用的软件包,但这些软件包有局限性,因为方程需要根据我笔记本电脑上的情况进行修改,循环的一次迭代大约需要26毫秒。整个矩阵大约需要126小时(5天)。为什么要重新发明轮子?我不知道他能不能用稀疏的matrices@ZheyuanLi-我还得学会如何在矩阵中写form@MichaelChirico:我确信有可用的软件包,但这些软件包有局限性,因为方程需要根据情况进行修改