R中定义的函数?
我应该为公式给出的第二类斯特林数的函数:
为此,我在R中编写了以下函数:
stirling <- function(n, k)
{
sum = 0
for (i in 0:k)
{
sum = sum + (-1)^(k - i) * choose(k, i) * i^n
}
sum = sum / factorial(k)
return(sum)
}
问题的下一部分是“为n = 20,k = 1,2,...,10创建一个情节”。 我做了一些研究,我认为方法curve
或plot
可能会对我有所帮助。 然而,我猜这些方法是在y
的形式为f(x)
(即一个参数)时使用的。 但在这里,我在函数stirling
有两个参数( n
和k
),所以我不知道如何处理这个。
此外,我尝试将k
(0,1,2 ...,10)的值转换为矢量,然后将它们传递给stirling
,但stirling
不会接受矢量作为输入。 我不知道如何修改代码以使stirling
接受载体。
有什么建议么?
矢量化
正如评论中指出的那样,你可以通过vectorize
来做到这一点:
Vectorize创建一个向量化其参数FUN的动作的函数包装器。 Vectorize(FUN, vectorize.args = arg.names, SIMPLIFY = TRUE, USE.NAMES = TRUE)
(vstirling <- Vectorize(stirling))
# function (n, k)
# {
# args <- lapply(as.list(match.call())[-1L], eval, parent.frame())
# names <- if (is.null(names(args)))
# character(length(args))
# else names(args)
# dovec <- names %in% vectorize.args
# do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]),
# SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES))
# }
所以vstirling()
是stirling()
的矢量化版本。
vstirling(20, 1:10)
# [1] 1.000000e+00 5.242870e+05 5.806064e+08 4.523212e+10 7.492061e+11 4.306079e+12 1.114355e+13 1.517093e+13
# [9] 1.201128e+13 5.917585e+12
现在剩下的就是创造一个情节:
plot(x = 1:10, y = vstirling(20, 1:10), ylab = "S(20, x)", xlab = "x")
链接地址: http://www.djcxy.com/p/36031.html
下一篇: ruby on rails