如何在R中结合for循环和uniroot?

时间:2019-02-09 03:19:37

标签: r loops

首先,我有两个类似以下的功能:

ef <- function(x, a){
  if(a == 0){
    return(x)
  } else {
    return(1-exp(-a*(5+x)))
  }
}
f1 <- function(x) ef(x,a)-0.75*ef(2.5,a)-0.25*ef(-1,a)

如果a为2(即a <- 2),则根目录应为:

uniroot(f1, c(-5, 0), tol = 0.0001)$root

现在我的问题是当a从0.05变为3乘0.05时,如何计算函数x的根?

1 个答案:

答案 0 :(得分:0)

我认为将a放在f1()中作为参数更灵活。

f1 <- function(x, a) ef(x, a)-0.75*ef(2.5, a)-0.25*ef(-1, a)

然后使用sapply()来操作序列seq(0.05, 3, 0.05)中的每个值:

sapply(seq(0.05, 3, 0.05), function(A){
  uniroot(f1, c(-10, 10), tol = 0.0001, extendInt = "yes", a = A)$root
})

# [1]  1.565924900  1.503659791  1.438426382  1.370549617  1.300423929
# [6]  1.228478774  1.155273229  1.081323809  1.007194271  0.933431003 ...

extendInt = "yes"在端点处没有不同的符号时,参数f1()可以克服该错误。另外,在这种情况下,我更喜欢apply系列而不是for循环。您可以阅读this的原因。


编辑: for循环解决方案

a <- seq(0.05, 3, 0.05)
root <- numeric()
for(i in 1:length(a)){
  root[i] <- uniroot(f1, c(-10, 10), tol = 0.0001, extendInt = "yes", a = a[i])$root
}

在循环结束时,变量root将存储所有根。您可以检查两个解决方案的输出是否相等。