2010-12-02 2 views
8

R kann eine Spline-Funktion mit splinefun() in der Splines-Bibliothek erzeugen. Allerdings muss ich diese Funktion bei ihrer ersten und zweiten Ableitung auswerten. Gibt es eine Möglichkeit, dies zu tun?Wie kann ich die Ableitung einer Spline-Funktion in R auswerten?

zum Beispiel

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

Wie kann ich f '(x) für einen Vektor von xs bewerten?

Antwort

14

Es ist sehr einfach zu tun, da die Fähigkeit, die Funktion bei seinen Ableitungen zu bewerten, in die Funktion eingebaut ist!

f_of_x(x, deriv = 1) 

Danke R-Kern!

+0

Es ist kein „==“ Operator, aber „=“. –

+0

@DWin: Fest, danke. –

2

Sie könnten auch an der TkSpline-Funktion im TeachingDemos-Paket interessiert sein, die die Spline-Funktion zusammen mit seinen Ableitungen darstellt.

2

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. 
+0

+1 danke für die Einsicht; Ich verwende jedoch einen Spline, um ein rechenintensives Modell zu approximieren. –

+0

Ich hatte davor Angst. Ich würde empfehlen, die Beispiele auf der splinefun-Seite durchzugehen, um eine bessere Vorstellung davon zu bekommen, wie sie sich verhalten, wenn Argumente höherer Ordnung (als 1) hergeleitet werden. Es machte Sinn, nachdem ich einige Zeit damit verbracht hatte, Pläne zu machen, aber zuerst schienen die Ergebnisse ziemlich erschütternd. –

Verwandte Themen