Как построить функцию с суммами? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь построить это уравнение. Единственная переменная, которая изменяется, это n. X всегда является суммой от x = 1 до x = 4.

   x = seq(from = 1, to = 4, by = 1)
   lf = function(n) choose(4, 3)*choose(4, 1)*exp(3*n) / sum(choose(4,x)*choose(4, 4-x)*exp(x*n))

Когда я пытаюсь построить его, используя:

plot(lf, from = -3, to -3)

Я получаю ошибку:

"длинная длина объекта не кратна короткой длине объекта длинная длина объекта не кратна короткой длине объекта."

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Plot () или curve () генерирует вектор 200 длины, чтобы построить вашу функцию как n.

Поэтому, когда вы умножаете n * x, размеры не подходят, и R предупреждает вас, расширяет массив de x до 123412341234 ... и затем умножает.

Включите браузер в свою функцию, и вы увидите, выполняет ли он то, что вы действительно хотите.

lf = function(n){ 
  browser() 
  choose(4, 3)*choose(4, 1)*exp(3*n) / sum(choose(4,x)*choose(4, 4-x)**(x*n))
 }

Надеюсь, это поможет!

0 голосов
/ 30 октября 2018

Проблема в том, что lf не векторизовано более n; то есть, он не принимает векторы в качестве входных данных. Например, sum(1:x) также не векторизовано над x, что означает, что sum(1:(1:2)) не вернет c(1, 3). Нечто подобное происходит с

sum(choose(4,x)*choose(4, 4-x)*exp(x*n))

в терминах n.

Теперь векторизация необходима из-за того, как вы хотите построить функцию (т. Е. plot пытается использовать вектор в качестве входных данных). Одним из решений будет использование

plot(Vectorize(lf, "n"), from = -3, to = 3)

Другим было бы определение lf в векторизации:

lf <- function(n) 
  sapply(n, function(nn)
    choose(4, 3) * choose(4, 1) * exp(3 * nn) / sum(choose(4, x) * choose(4, 4 - x) * exp(x * nn)))
plot(lf, from = -3, to = 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...