首页 > 解决方案 > R中的并行实现并在每个时间步更新值

问题描述

如果可能的话,我需要您的建议以正确并行实施以下方案。

假设我有一个用于解决某些问题的 ODE 系统。假设我们有三个 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+1)的 0.01(x,y,z)来自当时第 i 个系统的解的第 th 和第 (i-1) 个系统,即来自相邻系统的值。我可以并行运行系统,但我不知道如何在每个时间步之后更新系统?我也不知道,如何仅在一个时间点使用 ode(....) 方法。

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

标签: rparallel-processing

解决方案


我尝试将 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)

这是每个时间步的代码。

#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
}

推荐阅读