2017-04-07 125 views
3

繪製的自定義功能,我想這個功能編程並繪製成R問題中的R

enter image description here

我一直使用的代碼是:

js <- sapply(seq(1,50, 1), FUN <- function(x) x^{-4}) 
pim <- sapply(seq(1,50, 1), FUN <- function(x) 2*pi*x) 
beta <- function(x) sum(js*sqrt(2)*cos(pim*x)) 

但在這個回報每個點的正確值,當我嘗試使用曲線函數繪製它時,我遇到了麻煩,因爲我得到的是:

Error in curve(beta, 0, 1) : 
    'expr' did not evaluate to an object of length 'n' 
In addition: Warning messages: 
1: In pim * x : 
    longer object length is not a multiple of shorter object length 
2: In js * sqrt(2) * cos(pim * x) : 
    longer object length is not a multiple of shorter object length 

你能幫我解決這個問題,並得到一個工作情節?謝謝。

回答

4

錯誤出現在您的beta函數中。當你使用sum這樣的話就是整個向量的總和爲t = 1,...,T。你不想這樣做。相反,您想要爲每個t評估該功能。因此,如果對beta進行小改動,則可以使用curve功能。

js <- sapply(seq(1,50, 1), function(x) x^{-4}) 
pim <- sapply(seq(1,50, 1), function(x) 2*pi*x) 
beta <- function(x) { 
    sapply(x, function(y) sum(js*sqrt(2)*cos(pim*y))) 
} 
curve(beta, 0 ,1) 

enter image description here

+0

我明白了,非常感謝。 – JohnK

2

我很驚訝你都使用sapply這些功能裏面。式可以從字面上幾乎複製到R:

beta <- function(x, n=50){ 
    j <- seq_len(n) 
    sum(
    j^(-4)* sqrt(2) * cos(2*j*pi*x) 
) 
} 

可以在功能curve使用含有x任何表達:

curve(sapply(x,beta),0,1) 

給出了同樣的曲線圖。

在旁註:如果你想beta要矢量,你確實可以增加一個sapply裏面,或者你可以這樣做:

beta_vect <- Vectorize(beta) 
curve(beta_vect,0,1) 

工作爲好。

+0

另一個很好的解決方案,非常感謝。 – JohnK