代码之家  ›  专栏  ›  技术社区  ›  PlaymoBill

计算函数的n阶导数

  •  2
  • PlaymoBill  · 技术社区  · 7 年前

    为了计算概率,我必须计算导数(然后进行评估),如 $\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$ $f$ 是一个多项式函数。问题是导数的阶数可能会随着计算导数的变量列表的变化而变化。

    我的问题是创建 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 回复  |  直到 7 年前
        1
  •  2
  •   Ben Bolker    7 年前

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

    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
    

    我以前没有注意到你在微分一个多项式——在这种特殊情况下,有一个