【问题标题】:Generate a vector of functions生成函数向量
【发布时间】:2016-11-21 13:21:04
【问题描述】:

我有一个单一变量的函数,以及各种参数。

对于其中一个参数的每个值(其他参数是固定的),函数都有一个根。我想从参数的向量生成根向量(使用uniroot)。

我正在处理的实际示例有点混乱,但我会给出它。以下是固定参数:

eta_inf = -0.0139
eta_0 = 178.5
lambda = 2.4954
m = 0.83094

函数如下:

crossFnc <- function(gamma_dot) tau - gamma_dot*(eta_inf + (eta_0-eta_inf)/(1 + (lambda*gamma_dot)^m))

下面是 tau 参数的特定值的根示例:

tau=10
uniroot(crossFnc, c(0,1))$root

[1] 0.06900807

我想生成这些根的向量,例如:

tau <- seq(0,10,length.out=101)

谢谢,

史蒂夫

【问题讨论】:

标签: r function vector


【解决方案1】:

也许你可以使用for 循环:

my.roots <- vector()
tau.seq <- seq(0,10,length.out=101)
for (i in seq_along(tau.seq)) {
  tau <- tau.seq[i]
  my.roots[i] <- uniroot(crossFnc, c(0,1))$root
}
#> head(my.roots)
#[1] 0.000000000 0.000566379 0.001142346 0.001726677 0.002257765 0.002848007

【讨论】:

  • 试图避免循环。答案很简单。往上看。谢谢。
  • @SteveK 循环有什么问题? sapply 只是对你隐藏循环。
【解决方案2】:

利用sapply:

# Notice the second argument
crossFnc <- function(gamma_dot, tau) { 
    tau - gamma_dot*(eta_inf + (eta_0-eta_inf)/(1 + (lambda*gamma_dot)^m))
}

# I only use length.out = 10
tau <- seq(0,10,length.out=10)

# Apply function(x) to every value in tau
myRoots <- sapply(tau, function(x) {
  uniroot(crossFnc, c(0,1), tau=x)$root 
})

myRoots

>[1] 0.000000000 0.006433349 0.013166577 0.020236503 0.027594321 0.035253401 0.043217816 0.051493442 0.060087456
>[10] 0.069008069

【讨论】:

  • 有效! crossFnc2
猜你喜欢
  • 2017-05-22
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多