计算函数的n阶导数

时间:2017-07-03 21:25:28

标签: r derivative quotation-marks

为了计算概率,我必须计算导数(然后求值),如$\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$,其中$f$是多项式函数。问题在于导数的顺序可能会有变化,而变量列表也与变量列表有关。

我已经尝试过使用rSymPy和Ryacas,它可以工作......直到变量的数量变得很重要。所以我必须寻找一个不同的解决方案。我尝试使用deri()文档中指出的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代码。

1 个答案:

答案 0 :(得分:2)

我认为此扩展有效。诀窍是开始在表达式和字符串之间来回...

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

我之前没有注意到你在区分多项式 - 在那种特殊情况下,很多更简单的答案(提示,将多项式表示为一个向量序列,给出不同术语的阶数系数。但你可能不需要那么高效的答案......