2010-12-02 12 views
8

आर splines लाइब्रेरी में splinefun() का उपयोग कर एक स्पलीन फ़ंक्शन उत्पन्न कर सकता है। हालांकि, मुझे इस समारोह को अपने पहले और दूसरे डेरिवेटिव में मूल्यांकन करने की आवश्यकता है। क्या इसे करने का कोई तरीका है?मैं आर में एक स्पलीन समारोह के व्युत्पन्न का मूल्यांकन कैसे कर सकता हूं?

उदाहरण के लिए

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

मैं कैसे एक्स के एक वेक्टर के लिए मूल्यांकन कर सकते हैं च '(x)?

उत्तर

14

ऐसा करना बहुत आसान है क्योंकि इसके डेरिवेटिव्स पर फ़ंक्शन का मूल्यांकन करने की क्षमता फ़ंक्शन में बनाई गई है!

f_of_x(x, deriv = 1) 

धन्यवाद आर-कोर!

+0

यह एक "==" ऑपरेटर नहीं है, लेकिन "="। –

+0

@DWin: फिक्स्ड, धन्यवाद। अंतर्दृष्टि के लिए –

2

आप TeachingDemos पैकेज में TkSpline फ़ंक्शन में रुचि भी ले सकते हैं जो स्प्रेलाइन फ़ंक्शन को इसके डेरिवेटिव के साथ प्लॉट करेगा।

2

splinefun के लिए 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 
}) 

और फिर उस परिणाम के साथ "हाथ से" एक दूसरे समारोह का निर्माण। या फिर आप मदद (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. 
+0

+1 धन्यवाद; हालांकि मैं एक कम्प्यूटेशनल गहन मॉडल का अनुमान लगाने के लिए एक स्पलीन का उपयोग कर रहा हूं। –

+0

मुझे इससे डर था। मैं splinefun पेज पर उदाहरणों के माध्यम से एक बेहतर विचार प्राप्त करने के लिए सलाह दूंगा कि वे उच्च क्रम (1 से) तर्क प्राप्त करने के लिए कैसे व्यवहार करते हैं =। कुछ समय साजिश रचने के बाद यह समझ में आया लेकिन पहले परिणाम काफी झटके लग रहे थे। –