R中符号衍生物的平等

时间:2014-05-13 09:57:39

标签: r expression symbolic-math derivative

我想用R来验证复杂的导数计算。到目前为止,这是我对一个简单函数的最佳尝试:

f <- expression(a*log(x^2))
df.dx <- deriv(f, 'x')
(df.dx)
df.dx.byHand <- expression(2*a/x) # The derivative of f calculated by hand
(df.dx.byHand)
all.equal(df.dx, df.dx.byHand) 

以上的输出是

> (df.dx)
 expression({
.expr1 <- x^2
.value <- a * log(.expr1)
.grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
.grad[, "x"] <- a * (2 * x/.expr1)
attr(.value, "gradient") <- .grad
.value

> (df.dx.byHand)
expression(2 * a/x)

[1] "Component 1: target, current do not match when deparsed"

我已经检查了

Explicit formula versus symbolic derivatives in R

http://stat.ethz.ch/R-manual/R-patched/library/stats/html/deriv.html

Symbolic derivatives and simplification in R

以及

http://stat.ethz.ch/R-manual/R-patched/library/base/html/expression.html

因为核心问题似乎是我不知道如何从'df.dx&#39;中提取。 &#39; grad [,&#39; x&#39;]&#39;表达的一部分。

由于IT问题,Sage和YACAS都不适合我。

非常感谢您的建议!

1 个答案:

答案 0 :(得分:2)

问题中的问题不仅仅是提取表达式,还包括表达式需要简化的事实。

1)如果&#34; IT问题&#34;意味着您在安装Ryacas时遇到问题,请参阅Ryacas home page以获取有关故障的提示并尝试此操作:

library(Ryacas)
x <- Sym("x")
a <- Sym("a")
identical(Eval(Simplify(deriv(a*log(x^2), x))), 2 * a / x) # TRUE

如果你得到FALSE,那么如果简化没有将它减少到与手工制作的形式相同的形式它们仍然可能是相同的,所以你可能想要在任何情况下尝试下一个方法。

2)如果&#34; IT问题&#34;意味着你不允许安装包然后只是在网格上比较它们:

df.dx.byHand <- function(x) 2*a/x

df.dx <- function(x) {}
body(df.dx) <- D(f,'x')

a <- 3
all.equal(df.dx.byHand(1:100), df.dx(1:100)) # TRUE

更新提供了Ryacas解决方案