2010-12-02 33 views
8

R可以使用樣條函數庫中的splinefun()生成樣條函數。但是,我需要評估這個函數的一階和二階導數。有沒有辦法做到這一點?如何評估R中樣條函數的導數?

例如

library(splines) 
x <- 1:10 
y <- sin(pi/x) #just an example 
f_of_x <- splinefun(x,y) 

如何爲X的向量計算F'(x)的?

回答

14

這是非常容易做的,因爲評估函數在其派生函數的能力是建立在函數中的!

f_of_x(x, deriv = 1) 

感謝R-core!

+0

這不是一個「==」操作符,但「=」。 – 2010-12-02 20:26:47

+0

@DWin:修正,謝謝。 – 2010-12-02 20:38:29

2

您可能還會對TeachingDemos軟件包中的TkSpline函數感興趣,該函數將繪製樣條函數及其衍生詞。

2

對splinefun使用deriv =參數是明智的,應該補充說第二和第三個衍生物應該是可用的,但是如果你通過這些例子工作,你會發現線性逼近是鋸齒狀的,或者高度不連續。

在您有解析表達式的情況下,有一些公認的有限算法區分的規定。有關更多詳細信息,請參閱幫助(衍生)頁面。

> deriv(~sin(pi/x), "x") 
expression({ 
    .expr1 <- pi/x 
    .value <- sin(.expr1) 
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x"))) 
    .grad[, "x"] <- -(cos(.expr1) * (pi/x^2)) 
    attr(.value, "gradient") <- .grad 
    .value 
}) 

然後用這個結果「手動」構建第二個函數。或者你可以使用所提供的幫助(DERIV)頁面上的DD例如自動化過程多一點:

DD <- function(expr,name, order = 1) { 
    if(order < 1) stop("'order' must be >= 1") 
    if(order == 1) D(expr,name) 
    else DD(D(expr, name), name, order - 1) 
} 
DD(expression(sin(pi/x)), "x", 2) 
-(sin(pi/x) * (pi/x^2) * (pi/x^2) - cos(pi/x) * (pi * (2 * x)/(x^2)^2)) 
DD(expression(sin(pi/x)), "x") 
-(cos(pi/x) * (pi/x^2)) 
funD<- function(x){} 
body(funD) <- DD(expression(sin(pi/x)), "x") 
funD 
    #function (x) 
    #-(cos(pi/x) * (pi/x^2)) 
funD(2) 
# [1] -4.809177e-17 as it should be at a maximum 
funDD <- function(x){} 
body(funDD) <- DD(expression(sin(pi/x)), "x", 2) 
funDD(2) 
# [1] -0.6168503 as it should be at a maximum.