在R中并行实现,并在每个时间步更新值

在R中并行实现,并在每个时间步更新值,r,parallel-processing,R,Parallel Processing,如果可能的话,我需要你的建议来正确地并行实现以下场景 假设我有一个ODE系统来解决一些问题。假设我们有三首这样的颂歌 dx/dt = ax+by+cz, dy/dt = a(x+y)-(b+c)z, dz/dt = a/b*(xy)+c*z 其中a、b和c是非零参数。我们可以用deSolve包的ode(..)来解决上述系统。我的问题从这里开始 我想用20个不同的初始条件(即20个这样的系统并行运行)来模拟上述系统,这样在每个时间步(dt=0.001)之后,我需要从当时第I个系统的解中减去第

如果可能的话,我需要你的建议来正确地并行实现以下场景

假设我有一个ODE系统来解决一些问题。假设我们有三首这样的颂歌

dx/dt = ax+by+cz,  dy/dt = a(x+y)-(b+c)z,  dz/dt = a/b*(xy)+c*z
其中a、b和c是非零参数。我们可以用deSolve包的ode(..)来解决上述系统。我的问题从这里开始

我想用20个不同的初始条件(即20个这样的系统并行运行)来模拟上述系统,这样在每个时间步(dt=0.001)之后,我需要从当时第I个系统的解中减去第(I+1)个和第(I-1)个系统的0.01(x,y,z),即从相邻系统的值。我可以并行运行系统,但我不知道如何在每个时间步之后更新系统?我也不知道,如何在一个时间点上使用ode(..)方法


我不知道如何在这里加上数学方程式。也请指导我。

我尝试将Lotka-Volterra模型作为每个时间步的示例,但以下两个代码不会产生类似的结果。他们之间的误差在增加。我不知道为什么?此外,在完成代码2的时间上也有很大的差异,这是意料之中的,但问题是,我们能改进吗

#Original code
library(deSolve); library(lattice)
predpreyLV<-function(t,y,p){
  N<-y[1]
  P<-y[2]

  with(as.list(p),{
    dNdt<- r*N*(1-(N/1000))-a*P*N
    dPdt<- -b*P+f*P*N
    return(list(c(dNdt,dPdt)))
  })
}

r<-0.5; a<-0.01; f<-0.01; b<-0.2;

p<-c(r=r,a=a, b=b, f=f)
y0<-c(N=25, P=5)
times<-seq(0,1000,0.1)
LV.out<-ode(y=y0,times,predpreyLV, p)
#原始代码
图书馆(deSolve);图书馆(格子)

predpreyLVI不知道ode,但我很怀疑你是否可以在纯R中实现它。另外,你的更新必须是异步的,对吗?因为否则,第i个系统依赖于(i-1)和(i+1)中的值,但是(i-1)也依赖于((i-1)+1),而((i-1)+1)最终是i。你也许可以用类似于
RcppParallel
的东西来完成它,但这绝不是一件小事。如果没有任何代码开始,很难帮助你。你尝试了什么?亚历克西斯,你和我期望的非常接近。唯一的更新是,为了首先计算t_j时间的解,我将使用t_(j-1)中的值更新所有系统。是的,所有的系统都是相互依赖的。如果你能找出一个时间步的结果(或者其他人知道如何得到),然后你发布代码,那么我们可以更好地评估你想要的是否可行。是的,我正在试着找出一个时间步的结果,也在等待别人的回复来帮助我。
#Code-2, Calculations for each time step
library(deSolve); library(lattice)

predpreyLV<-function(t,y,p){
  N<-y[1]
  P<-y[2]

  with(as.list(p),{
    dNdt<- r*N*(1-(N/1000))-a*P*N
    dPdt<- -b*P+f*P*N
    return(list(c(dNdt,dPdt)))
  })
}

r<-0.5; a<-0.01; f<-0.01; b<-0.2;

p<-c(r=r,a=a, b=b, f=f)
y0<-c(N=25, P=5)
dt<-0.1
LV.out1<-c(0,25, 5)
for (i in seq(0,1000-dt,dt)){
  times<-seq(i,i+dt,dt)
  out1<-ode(y=y0,times,predpreyLV, p)
  LV.out1<-rbind(LV.out1,out1[2,])
  y0<-c(N=out1[2,2], P=out1[2,3])
  out1<-NULL
}