Die Verwendung des Arguments deriv = zu splinefun ist sinnvoll, und es sollte hinzugefügt werden, dass zweite und dritte Ableitungen verfügbar sein sollen, aber wenn Sie die Beispiele durcharbeiten, werden Sie feststellen, dass die linearen Näherungen gezackt und oder sind diskontinuierlich bei höheren Graden.
In der Situation, in der Sie einen analytischen Ausdruck haben, gibt es einige zugegebenermaßen begrenzte Bestimmungen für die algorithmische Differenzierung. Weitere Informationen finden Sie auf der Hilfeseite (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
})
Und dann konstruieren "von Hand" eine zweite Funktion mit diesem Ergebnis. Oder Sie könnten das DD Beispiel auf der Hilfe (deriv) Seite zur Verfügung gestellt, um den Prozess ein bisschen mehr zu automatisieren:
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.
Es ist kein „==“ Operator, aber „=“. –
@DWin: Fest, danke. –