2017-07-03 96 views
1

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

我已经尝试过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代码抱歉。

回答

1

我认为这个扩展工作。诀窍是开始来回表达式和字符串之间...

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 

我以前没有注意到,你在区分多项式 - 在这种特殊情况下,存在一个更简单的答案(提示,表示多项式表示赋予不同项的阶的系数的向量序列)。但你可能不需要这个有效的答案...

+0

感谢您的帮助。就我而言,更简单的解决方案首先需要扩展多项式。我不知道如何用R来表演。 – PlaymoBill