我想评估R中某些函数f的高阶导数。我有两种可能。
- 要么我确定f (k)的一般表达式,即f的k次导数(在我的特定情况下我可以这样做),然后我评估它;
- 或者我利用R的能力来执行符号导数(函数D())。
1比2有什么好处?让我们说f (k)不是递归公式。如果f (k)是递归的怎么办?
任何提示将不胜感激。
我想评估R中某些函数f的高阶导数。我有两种可能。
1比2有什么好处?让我们说f (k)不是递归公式。如果f (k)是递归的怎么办?
任何提示将不胜感激。
符号微分比手工操作更不容易出错。
对于低订单,我认为符号区分不会花费太多计算机时间,但您可以轻松地确定您的具体情况,以确定它使用proc.time、system.time或rbenchmark包。另请参阅这些示例。
您可能想尝试符号和手牌区分作为检查。
关于 R 的deriv(以及相关的函数,例如D
)与Ryacas包,后者可以进行重复微分而不需要用户自己迭代(第三个参数deriv
指定顺序)并且它具有Simplify
不存在对应的函数在 R 中,尽管应该仔细检查 Ryacas,因为 yacas 有时可能会有点错误。
这是一个例子:
> library(Ryacas)
> x <- Sym("x")
> y <- (x^2+x)^2
> dy <- deriv(y, x, 2) # 2nd deriv
> dy
expression(2 * (2 * x + 1)^2 + 4 * (x^2 + x))
> Simplify(dy)
expression(2 * (6 * x^2 + 6 * x + 1))
编辑:添加到示例:
> Eval(dy, list(x = 3))
[1] 146
> Eval(Simplify(dy), list(x = 3))
[1] 146
>
> f <- function(x) {}
> body(f) <- yacas(Simplify(dy))[[1]]
> f
function (x)
2 * (6 * x^2 + 6 * x + 1)
> f(3)
[1] 146
>
> # double check
> w <- 3
> eval(D( D(expression((w^2+w)^2), "w"), "w"))
[1] 146
也试试demo("Ryacas-Function")
。
编辑 2:修复了一个错误并在示例中添加了更多内容。