Как совместить петлю и uniroot в R? - PullRequest
0 голосов
/ 09 февраля 2019

Сначала у меня есть две функции, подобные следующим:

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

Теперь мой вопрос состоит в том, как вычислить корень x функции, когда a изменяется с 0,05 на 3 на 0,05?

1 Ответ

0 голосов
/ 09 февраля 2019

Я думаю, что более гибко поместить 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 будет хранить все корни.Вы можете проверить, равны ли выходы двух решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...