2010-12-02 21 views
8

R, spline arşivindeki splinefun() yöntemini kullanarak bir spline işlevi oluşturabilir. Ancak, bu işlevi ilk ve ikinci türevlerinde değerlendirmem gerekiyor. Bunu yapmanın bir yolu var mı? örneğinR'de spline fonksiyonunun türevini nasıl değerlendirebilirim?

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

nasıl x'lerin bir vektör için '(x) f değerlendirebilirsiniz?

cevap

14

İşlevi kendi türevleriyle değerlendirme yeteneği işlevde yerleşik olduğundan, bu çok kolaydır!

f_of_x(x, deriv = 1) 

Teşekkürler R-core!

+0

ama "=": Ya da biraz daha sürecini otomatikleştirmek için yardım (D zm) sayfasında sağlanan DD örneğini kullanabilirsiniz. –

+0

@DWin: Sabit, teşekkürler. –

2

Ayrıca, türevleri ile birlikte spline işlevini çizecek olan TeachingDemos paketindeki TkSpline işleviyle de ilgilenebilirsiniz.

2

Splinefun türevi argümanının kullanımı mantıklıdır ve ikinci ve üçüncü türevlerin kullanılabilir olduğu varsayılmalı, ancak örnekler üzerinde çalışırsanız, doğrusal yaklaşımların pürüzlü olduğunu veya yüksek derecelerde süreksiz.

Analitik bir ifadeye sahip olduğunuz durumda, algoritmik farklılaşma için kabul edilebilir sınırlı bazı hükümler vardır. Daha fazla bilgi için yardım (deriv) sayfasına bakınız.

> 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 
}) 

Ve bu sonuçla ardından "elle" inşa ikinci fonksiyonu. Bu bir "==" operatörü değil

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 içgörü için teşekkürler; ancak hesaplama yoğun bir modele yaklaşmak için bir spline kullanıyorum. –

+0

Bundan korkuyordum. Splinefun sayfasındaki örneklerden daha iyi bir fikre sahip olmalarını (türetmek için = 1) argümanlarla nasıl davrandıklarını daha iyi bir fikir edinmelerini tavsiye ederim. Bir süre komplo harcadıktan sonra mantıklıydı, ancak ilk başta sonuçlar oldukça sarsıcı görünüyordu. –

İlgili konular