计算函数的 n 阶导数

Computing the nth derivative of a function

要计算概率,我必须计算导数(然后求值),例如 $\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$,其中 $f$ 是多项式函数。问题是导数的阶数可能会随着计算导数的变量列表而变化。

我已经尝试过使用 rSymPy 和 Ryacas 并且它有效......直到变量的数量变得非常重要。所以我必须寻找不同的解决方案。我尝试使用 deriv() 文档中指示的 DD() 函数,迭代使用此函数似乎很好(并且出乎意料地比 rSymPy 和 Ryacas 更有效)。

我的问题是创建 DD(DD(DD(...my.expr...,"xi",ni),"xj",nj),"xk",nk) 命令。我尝试了以下代码:

step1 <- function(k) paste0(",x", k, ",", r[k]-1, ")", collapse="")
step2 <- function(expr) {
           paste0(paste0(rep.int("DD(",u), collapse=""), expr, 
           paste0(sapply(t,f4), collapse=""), collapse="") }
step2(f)

其中 r 是指示每个变量的推导顺序的向量,t 该向量的子集,u <- length(t)f 是表达式对象。此解决方案不起作用,因为变量名周围缺少引号。例如,我确实得到了(我从代码中删除了该函数):

DD(DD(DD(DD(DD(my.expr,x1,1),x7,1),x9,2),x10,1),x11,1)

而不是:

DD(DD(DD(DD(DD(my.expr,"x1",1),"x7",1),"x9",2),"x10",1),"x11",1)

我尝试在我的函数 step1 中添加 \",但是我在计算导数时遇到了问题。有什么解决这个问题的建议吗?

PS: 使用循环肯定会更容易,但我想尽可能避免。
PS2: 对不起 LaTeX 代码。

我认为这个扩展有效。诀窍是不要开始在表达式和字符串之间来回移动...

DD <- function(expr, names, order = 1, debug=FALSE) {
    if (any(order>=1)) {  ## do we need to do any more work?
        w <- which(order>=1)[1]  ## find a derivative to compute
        if (debug) {
            cat(names,order,w,"\n")
        }
        ## update order
        order[w] <- order[w]-1
        ## recurse ...
        return(DD(D(expr,names[w]), names, order, debug))
    }
    return(expr)
}

一些测试:

DD(expression(x^2*y^3+z),c("x","y"),c(1,1))
## 2 * x * (3 * y^2)
DD(expression(x^2*y^3+z),c("x","y"),c(2,1))
## 2*3*(y^2)
DD(expression(x^2*y^3+z),c("x","y"),c(2,2))
## 2*(3*(2*y))
DD(expression(x^2*y^3+z),c("x","y"),c(2,3))
## 2*(3*2)
DD(expression(x^2*y^3+z),c("x","y"),c(2,4))
## 0

我之前没有注意到您在对多项式求微分——在那种特殊情况下,有一个 更简单的答案(提示,将多项式表示为向量序列给出不同项的阶数系数)。但是您可能不需要那么有效的答案...