R中的显式公式与符号导数

时间:2012-01-08 16:57:26

标签: r derivative

我想评估 R 中某些函数 f 的高阶导数。 我有两种可能性。

  1. 我确定 f (k) 的一般表达式, f k -th衍生物(我可以在我的特定情况下做),然后我评估它;
  2. 或者我利用 R 的容量来执行符号派生(函数 D())。
  3. 1超过2的优点是什么?我们假设 f (k) 不是递归公式。如果 f (k) 是递归的,该怎么办?

    任何提示都将受到赞赏。

1 个答案:

答案 0 :(得分:12)

符号差异比手工操作更容易出错。

对于低位订单,我不认为符号区分需要花费很多计算机时间,但您可以随时根据具体情况确定使​​用proc.timesystem.timerbenchmark的情况包。另请参阅these examples

您可能希望尝试使用符号和手部区分作为检查。

关于R的deriv(以及D)与Ryacas包相关联的函数,后者具有重复区分的功能,无需用户自行迭代(第三deriv的arg指定了顺序)并且它有一个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:修正了错误并为示例添加了更多内容。