首先,我有两个类似以下的功能:
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的根?
答案 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
将存储所有根。您可以检查两个解决方案的输出是否相等。