मेरा मूल उत्तर वह नहीं हो सकता है जो आप वास्तव में चाहते हैं, क्योंकि यह संख्यात्मक बल्कि प्रतीकात्मक था। यहां प्रतीकात्मक समाधान है।
## use `"x"` as variable name
## taking polynomial coefficient vector `pc`
## can return a string, or an expression by further parsing (mandatory for `D`)
f <- function (pc, expr = TRUE) {
stringexpr <- paste("x", seq_along(pc) - 1, sep = "^")
stringexpr <- paste(stringexpr, pc, sep = " * ")
stringexpr <- paste(stringexpr, collapse = " + ")
if (expr) return(parse(text = stringexpr))
else return(stringexpr)
}
## an example cubic polynomial with coefficients 0.1, 0.2, 0.3, 0.4
cubic <- f(pc = 1:4/10, TRUE)
## using R base's `D` (requiring expression)
dcubic <- D(cubic, name = "x")
# 0.2 + 2 * x * 0.3 + 3 * x^2 * 0.4
## using `Deriv::Deriv`
library(Deriv)
dcubic <- Deriv(cubic, x = "x", nderiv = 1L)
# expression(0.2 + x * (0.6 + 1.2 * x))
Deriv(f(1:4/10, FALSE), x = "x", nderiv = 1L) ## use string, get string
# [1] "0.2 + x * (0.6 + 1.2 * x)"
बेशक
, Deriv
उच्च आदेश डेरिवेटिव आसान हो गया है। हम बस nderiv
सेट कर सकते हैं। D
के लिए, हमें रिकर्सन का उपयोग करना होगा (?D
के उदाहरण देखें)।
Deriv(cubic, x = "x", nderiv = 2L)
# expression(0.6 + 2.4 * x)
Deriv(cubic, x = "x", nderiv = 3L)
# expression(2.4)
Deriv(cubic, x = "x", nderiv = 4L)
# expression(0)
यदि हम अभिव्यक्ति का उपयोग करते हैं, तो हम बाद में परिणाम का मूल्यांकन करने में सक्षम होंगे। उदाहरण के लिए,
eval(cubic, envir = list(x = 1:4)) ## cubic polynomial
# [1] 1.0 4.9 14.2 31.3
eval(dcubic, envir = list(x = 1:4)) ## its first derivative
# [1] 2.0 6.2 12.8 21.8
उपरोक्त का तात्पर्य है कि हम किसी फ़ंक्शन के लिए अभिव्यक्ति को लपेट सकते हैं। फ़ंक्शन का उपयोग करने से कई फायदे होते हैं, एक ऐसा है कि हम इसे curve
या plot.function
का उपयोग करके साजिश करने में सक्षम हैं।
fun <- function(x, expr) eval.parent(expr, n = 0L)
ध्यान दें, fun
की सफलता प्रतीक x
के मामले में एक अभिव्यक्ति होने के लिए expr
की आवश्यकता है। यदि expr
को y
के संदर्भ में परिभाषित किया गया था, उदाहरण के लिए, हमें fun
को function (y, expr)
के साथ परिभाषित करने की आवश्यकता है। अब चलो curve
cubic
और dcubic
प्लॉट करने के लिए, एक सीमा 0 < x < 5
पर का उपयोग करते हैं:
curve(fun(x, cubic), from = 0, to = 5) ## colour "black"
curve(fun(x, dcubic), add = TRUE, col = 2) ## colour "red"
सबसे सुविधाजनक तरीका है, बल्कि f
+ fun
संयोजन कर की तुलना में एक भी समारोह FUN
परिभाषित करने के लिए निश्चित रूप से है। इस तरह, हमें f
और fun
द्वारा उपयोग किए जाने वाले चर नाम पर स्थिरता के बारे में चिंता करने की आवश्यकता नहीं है।
FUN <- function (x, pc, nderiv = 0L) {
## check missing arguments
if (missing(x) || missing(pc)) stop ("arguments missing with no default!")
## expression of polynomial
stringexpr <- paste("x", seq_along(pc) - 1, sep = "^")
stringexpr <- paste(stringexpr, pc, sep = " * ")
stringexpr <- paste(stringexpr, collapse = " + ")
expr <- parse(text = stringexpr)
## taking derivatives
dexpr <- Deriv::Deriv(expr, x = "x", nderiv = nderiv)
## evaluation
val <- eval.parent(dexpr, n = 0L)
## note, if we take to many derivatives so that `dexpr` becomes constant
## `val` is free of `x` so it will only be of length 1
## we need to repeat this constant to match `length(x)`
if (length(val) == 1L) val <- rep.int(val, length(x))
## now we return
val
}
मान लीजिए हम x <- seq(0, 1, 0.2)
पर गुणांक pc <- c(0.1, 0.2, 0.3, 0.4)
और उसके डेरिवेटिव के साथ एक घन बहुपदीय का मूल्यांकन करना चाहते, हम बस कर सकते हैं:
FUN(x, pc)
# [1] 0.1000 0.1552 0.2536 0.4144 0.6568 1.0000
FUN(x, pc, nderiv = 1L)
# [1] 0.200 0.368 0.632 0.992 1.448 2.000
FUN(x, pc, nderiv = 2L)
# [1] 0.60 1.08 1.56 2.04 2.52 3.00
FUN(x, pc, nderiv = 3L)
# [1] 2.4 2.4 2.4 2.4 2.4 2.4
FUN(x, pc, nderiv = 4L)
# [1] 0 0 0 0 0 0
अब की साजिश रचने के लिए आसान भी है:
curve(FUN(x, pc), from = 0, to = 5)
curve(FUN(x, pc, 1), from = 0, to = 5, add = TRUE, col = 2)
curve(FUN(x, pc, 2), from = 0, to = 5, add = TRUE, col = 3)
curve(FUN(x, pc, 3), from = 0, to = 5, add = TRUE, col = 4)
कर सकते हैं कहां है से 'Deriv' समारोह? कृपया, सापेक्ष पैकेज इंगित करें। – nicola
@nicola पैकेज से डेरिव –
चूंकि 'डेरिव' भी 'चरित्र' इनपुट की अनुमति देता है, 'पेस्ट (पेस्ट 0 ("पीसी [", seq_along (पीसी), "] * x ^", seq_along (पीसी) -1), पतन = "+") 'और फिर परिणाम को' डेरिव 'में प्लग करें। – nicola