El uso del argumento deriv = para splinefun es sensato, y debe agregarse que el segundo y tercer derivado se supone que están disponibles, pero si trabaja con los ejemplos, se dará cuenta de que las aproximaciones lineales son irregulares y discontinuo en grados superiores.
En la situación en la que tiene una expresión analítica, existen algunas disposiciones ciertamente limitadas para la diferenciación algorítmica. Vea la página de ayuda (deriv) para más detalles.
> 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
})
Y luego construir "a mano" una segunda función con ese resultado. O puede utilizar el ejemplo DD proporcionada en la página de ayuda (deriv) para automatizar el proceso un poco más:
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.
No es un operador "==", pero "=". –
@DWin: corregido, gracias. –