Написанная вручную функция не ведет себя так же, как гамма-функция - PullRequest
1 голос
/ 16 октября 2019

Итак, я реализовал функцию, которая вычисляет значение гамма-функции. и когда я пытаюсь умножить f5 (a) на числовое значение, я получаю ошибку: Ошибка в результате * f5 (a): не числовой аргумент для бинарного оператора, и если я вместо этого использую результат * gamma (a), который является предопределенной функциейэто работает просто отлично. Похоже, что это не позволит мне делать какие-либо арифметические операции с f5, хотя он возвращает тот же результат, что и гамма

f5 <- function(a)
{
  f <- function(x)
    x^(a-1)*exp(-x)
  integrate(f, 0, Inf)

}

f6 <- function(a)
{
  if (a < 0)
    print("a is negative")
  else if (a%%1 == 0)
    return (factorial(a-1))
  else 
  {
    result <- 1
    while (a > 1)
    {
      result <- result * (a - 1)
      a <-  a - 1
    }
    result <- result * f5(a)
    result

  }
}

gamma(0.3)
f5(0.3)
f6(0.3)

1 Ответ

3 голосов
/ 16 октября 2019

Это из-за класса объекта, который возвращается из f5().

class(f5(0.3)) 
[1] "integrate"

Это именованный объект списка, и вы можете вызвать из него конкретное значение:

names(f5(a))
[1] "value"        "abs.error"    "subdivisions" "message"      "call"  

Вы хотите компонент значения. Изменив f6() на приведенный ниже код, он заработает:

f6 <- function(a){
  if (a < 0){
    print("a is negative")
  }else if (a%%1 == 0){
    return (factorial(a-1))
  }else{
    result <- 1
    while (a > 1){
      result <- result * (a - 1)
      a <-  a - 1
    }
    result <- result * f5(a)$value
    result
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...