2016-09-03 16 views
6

Tôi phải viết một hàm cho số Stirling của Kind Thứ hai, tính theo công thức:Cách vẽ các hàm do người dùng định nghĩa trong R?

enter image description here

Đối với điều này, tôi đã viết hàm sau trong 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) 
} 

Phần tiếp theo của câu hỏi là "tạo một âm mưu cho n = 20, k = 1,2, ..., 10". Tôi đã làm một số nghiên cứu và tôi nghĩ rằng các phương pháp curve hoặc plot có thể giúp tôi. Tuy nhiên, tôi đoán các phương pháp này được sử dụng khi y có dạng f(x) (ví dụ: một đối số). Nhưng ở đây, tôi có hai đối số (nk) trong chức năng của tôi stirling vì vậy tôi không chắc chắn làm thế nào để tiếp cận điều này.

Ngoài ra, tôi đã thử chuyển đổi các giá trị của k (0, 1, 2 ..., 10) thành véc tơ và sau đó chuyển chúng sang stirling, nhưng stirling sẽ không chấp nhận vectơ làm đầu vào. Tôi không chắc chắn làm thế nào để sửa đổi mã để làm cho stirling chấp nhận vectơ.

Mọi đề xuất?

+4

Xem Vectorize trang trợ giúp?. –

+1

Cụ thể hơn, một cái gì đó như 'lô (1:10, Vectorize (khuấy) (20, 1:10))' – MrFlick

+0

Khi bạn sử dụng nhiều cặp đối số, 'apply()' là phù hợp. Ví dụ cơ bản, 'df <- expand.grid (n = 18:22, k = 1:10); res <- apply (df, 1, hàm (x) khuấy (x [1], x [2])); df <- cbind (df, res) ' – cuttlefish44

Trả lời

2

Vectorize

Như đã chỉ ra trong các ý kiến, bạn có thể vectorize để làm điều này:

Vectorize tạo một wrapper hàm vectorizes hoạt động của FUN đối số của nó. 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)) 
# } 

nên vstirling() là phiên bản vectorized của 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 

Bây giờ tất cả những gì còn lại là tạo ra một âm mưu:

plot(x = 1:10, y = vstirling(20, 1:10), ylab = "S(20, x)", xlab = "x") 
Các vấn đề liên quan