2010-12-02 3 views
8

R может генерировать сплайн-функцию с использованием splinefun() в библиотеке сплайнов. Однако мне нужно оценить эту функцию на ее первой и второй производных. Есть ли способ сделать это?Как я могу оценить производную от сплайн-функции в R?

, например

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

Как я могу оценить Р '(х) для вектора х годов?

ответ

14

Это очень легко сделать, поскольку способность оценивать функцию у ее производных встроена в функцию!

f_of_x(x, deriv = 1) 

Thanks R-core!

+0

Это не «==» оператор, а «=». – 2010-12-02 20:26:47

+0

@ DWin: Исправлено, спасибо. – 2010-12-02 20:38:29

2

Вас также может заинтересовать функция TkSpline в пакете TeachingDemos, которая построит сплайн-функцию вместе со своими производными.

2

Использование деривативного аргумента для splinefun разумно, и следует добавить, что вторая и третья производные должны быть доступны, но если вы будете работать с примерами, вы поймете, что линейные аппроксимации являются зубчатыми и или прерывистый в более высоких степенях.

В ситуации, когда у вас есть аналитическое выражение, есть некоторые, по общему признанию, ограничения для алгоритмического дифференцирования. Дополнительную информацию см. На странице справки (деривация).

> 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, размещенный на странице справки (DERIV), чтобы автоматизировать этот процесс немного больше:

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. 

 Смежные вопросы

  • Нет связанных вопросов^_^