私の元の答えは、あなたが本当に欲しいものではないかもしれません。数値的ではなく象徴的であったからです。ここに象徴的な解決策があります。
## 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
上記のことは、関数の式をまとめることができることを意味します。関数の使用にはいくつかの利点があります.1つは、curve
またはplot.function
を使用してプロットできる点です。
fun <- function(x, expr) eval.parent(expr, n = 0L)
注意、fun
の成功は、シンボルx
の観点で表現するexpr
が必要です。例えばexpr
がy
で定義された場合、fun
をfunction (y, expr)
と定義する必要があります。今度は、範囲0 < x < 5
に、cubic
とdcubic
をプロットするcurve
を使用してみましょう:
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
}
我々は、係数pc <- c(0.1, 0.2, 0.3, 0.4)
とx <- seq(0, 1, 0.2)
上のその誘導体との三次多項式を評価したいと、私たちは、単に行うことができます。
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パッケージDeriv –
から 'Deriv'は' character'も入力できるので、 'paste(paste) '(" pc "、seq_along(pc)、"] * x^"、seq_along(pc)-1)、 collapse = "+") 'を実行し、結果を' Deriv'に差し込みます。 – nicola