如何评估R中样条函数的导数?

时间:2010-12-02 19:20:14

标签: r numerical-methods spline

R可以使用样条线库中的splinefun()生成样条函数。但是,我需要在其一阶和二阶导数上评估此函数。有没有办法做到这一点?

例如

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

如何评估f'(x)为x的矢量?

3 个答案:

答案 0 :(得分:16)

这很容易做到,因为在它的衍生物中评估函数的能力是内置于函数中的!

 f_of_x(x, deriv = 1)

谢谢R-core!

答案 1 :(得分:2)

您可能还对TeachingDemos软件包中的TkSpline函数感兴趣,该函数将绘制样条函数及其衍生函数。

答案 2 :(得分: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
})

然后用手工构建第二个具有该结果的函数。或者您可以使用帮助(派生)页面上提供的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.