如何用总和绘制函数?

时间:2018-10-30 14:26:41

标签: r

我正在尝试绘制此等式。唯一更改的变量是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 :(得分:3)

问题是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)

答案 1 :(得分:0)

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))
 }

希望有帮助!