2017-07-03 87 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