r - 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(....) 方法。
我不知道如何在这里添加数学方程。也请指导我。
解决方案
我尝试将 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
}
推荐阅读
- python - 为什么我的python函数放在一个类中时运行方式不同
- mysql - 如何使用where子句解决左连接不起作用
- javascript - 如何将箭头函数转换为常规函数?
- r - CRAN 关于使用全局变量的政策
- android - Xamarin android:FirebaseInstanceIdService 已被弃用,但 FirebaseMessagingService 中没有 OnNewToken
- python - 将python登录到多个文件目的地的正确方法,从setting.ini文件而不组合级别
- angular - 在Angular的嵌套for循环中增加一个值计数器
- c# - 如何投影到具有其他一些实体的计数但没有导航属性的新类型
- javascript - jQuery 在浏览器中显示 JSON 结果但不显示结果
- unity3d - 为什么要让 Object 成为 Anchor 的孩子?