Пытаясь решить уравнение - PullRequest
0 голосов
/ 30 мая 2018

Моя проблема заключается в следующем: я пытаюсь вычислить параметр (здесь называемый "seuil") из опроса с R, который является решением уравнения.Решение не может быть явным, но я знаю, что оно определено.

Я написал эту программу

d<-Base_SP_final

f<-function(x) abs(-(1-d$shortA1-d$middleA1)*((d$timeA1)^(1+x))-d$shortA1*((d$timeA1+d$minshort1)^(1+x))-d$middleA1*((d$timeA1+d$minmiddle1)^(1+x))+(1-d$shortB1-d$middleB1)*((d$timeB1)^(1+x))+d$shortB1*((d$timeB1+d$minshort1)^(1+x))+d$middleB1*((d$timeB1+d$minmiddle1)^(1+x)))

d$seuil<-optimize(f, c(-10000, 10000), maximum=FALSE, tol=0.0001)

У меня есть это сообщение об ошибке: "invalid function value in 'optimize'".Это из-за того, что я использую переменные, а не значения напрямую («seuil» должен быть вычислен 8016 раз!)?

Я также пытался использовать nlm и uniroot, но безуспешно.

1 Ответ

0 голосов
/ 30 мая 2018

Я полагаю, что следующее даст вам то, что вы ищете.

Это пишет функцию, которая выполняет один optimize.Затем вы можете передать эту функцию в mapply для перебора всех ваших входных значений.

optim_f <- function(x, shortA1, middleA1, timeA1,
                    minshort1, minmiddle1, 
                    shortB1, middleB1, timeB1, ...){
  optimize(
    function(x, shortA1, middleA1, timeA1,
             minshort1, minmiddle1, 
             shortB1, middleB1, timeB1){
      abs(-(1 - shortA1 - middleA1) * 
            ((timeA1) ^ (1 + x)) - 
            shortA1 * 
            ((timeA1 + minshort1) ^ (1 + x)) - 
            middleA1 * 
            ((timeA1 + minmiddle1) ^ (1 + x)) + 
            (1 - shortB1 - middleB1) * 
            ((timeB1)^(1+x)) + 
            shortB1 * 
            ((timeB1 + minshort1) ^ (1 + x)) + 
            middleB1 * 
            ((timeB1 + minmiddle1) ^ (1 + x)))$minimum
      }, 
      shortA1 = shortA1, 
      middleA1 = middleA1, 
      timeA1 = timeA1,
      minshort1 = minshort1, 
      minmiddle1 = minmiddle1, 
      shortB1 = shortB1, 
      middleB1 = middleB1, 
      timeB1 = timeB1, ...)
}

df$seuil <-
  mapply(FUN = optime_f,
         shortA1 = df$shortA1,
         middleA1 = df$middleA1,
         timeA1 = df$timeA1,
         minshort1 = df$minshort1,
         minmiddle1 = df$minmiddle1,
         shortB1 = df$shortB1,
         middleB1 = df$middleB1,
         timeB1 = df$timeB1,
         MoreArgs = list(interval = c(-10000, 10000),
                         maximum = FALSE,
                         tol = 0.0001),
         SIMPLIFY = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...