【问题标题】:How to plot a function with sums?如何用总和绘制函数?
【发布时间】:2019-04-03 15:01:05
【问题描述】:

我正在尝试绘制这个等式。唯一改变的变量是 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)

我得到错误:

“较长的对象长度不是较短对象长度的倍数 较长的对象长度不是较短对象长度的倍数。”

【问题讨论】:

    标签: r


    【解决方案1】:

    问题在于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)
    

    【讨论】:

    • 谢谢,这比预期的信息量大!
    【解决方案2】:

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2014-12-17
      • 2021-12-19
      相关资源
      最近更新 更多