【发布时间】:2018-07-31 16:01:38
【问题描述】:
我正在尝试找到方程组的根。这是我正在使用的 R 代码:
x1 <- 0
x2 <- 0
counter <- 0
eps <- 0.000001
repeat {
x1_old<-x1
x2_old<-x2
counter <- counter + 1
res<-uniroot(fun_x1,c(0,5),tol = 0.000001)
x1<-res$root
res_o<-uniroot(fun_x2,c(0,5),tol = 0.000001)
x2 <- res_o$root
print(c(counter,x1,x2,x1_old,x2_old))
if (abs(sum(c(x1,x2)-c(x1_old,x2_old))) < eps)
break
}
这里的fun_x1 和fun_x2 是涉及x1 和x2 的两个等式。此代码需要一段时间才能找到根。我想知道有没有办法在 R 中并行计算这个 repeat 函数?
函数fun_x1 和fun_x2 是嵌套积分。例如,fun_x1 的简化版本是,
fun_x1<-function(x1)
{
s<-7
f123_uv<-function(u)
{
f123_inner<-function(v)
{
prob_23_v<-(exp(-(integrate(fun1,0,v-u)$value*x1+integrate(fun2,0,v-u)$value*x2)))*fun1(v-u)*x1
}
}
p_123<-integrate(Vectorize(f123_uv),0,s)$value
return(p_123)
}
【问题讨论】:
-
循环的每次迭代似乎都依赖于上一次迭代的值。你将如何使这样的循环并行?当计算不相互依赖时,执行并行操作更有意义。
-
是的,我当前的迭代值取决于上一次迭代。这就是为什么我难以并行计算过程。 @MrFlick
-
需要多少步?如果有很多步骤,则删除 print 语句,因为紧密循环中的 IO 可能很昂贵。如果只需要几个步骤,则可以并行化两个 uniroot 调用,例如使用未来的包。
-
@RalfStubner:收敛只需 6-7 步。我从来没有使用过未来的包。我不知道如何并行计算依赖循环。您介意向我提供有关如何编写此类循环的详细答案吗?谢谢!
-
您能否提供(可能是简化的)
fun_x1和fun_x2的定义?
标签: r parallel-processing