2017-07-03 2 views
1

Um eine Wahrscheinlichkeit zu berechnen, muss ich Derivate berechnen (und dann auswerten) wie $\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$, wobei $f$ eine Polynomfunktion ist. Das Problem besteht darin, dass die Reihenfolge der Ableitung wahrscheinlich variiert sowie die Liste der Variablen, für die die Ableitung berechnet wird.Berechnen der n-ten Ableitung einer Funktion

Ich habe schon mit rSymPy und Ryacas versucht und es funktioniert ... bis die Anzahl der Variablen zu wichtig wird. Also muss ich nach einer anderen Lösung suchen. Ich habe versucht mit der DD() -Funktion, die in der Dokumentation von deriv() angegeben ist, und die Verwendung dieser Funktion scheint iterativ in Ordnung (und unerwartet effizienter als mit rSymPy und Ryacas).

Mein Problem ist, den DD(DD(DD(...my.expr...,"xi",ni),"xj",nj),"xk",nk) Befehl zu erstellen. Ich versuchte, den folgenden Code:

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) 

wo r einen Vektor für jede Variable, die die Reihenfolge der Ableitung ist, t eine Teilmenge dieses Vektors, u <- length(t)f und ist ein Ausdruck Objekt. Diese Lösung funktioniert nicht, da Anführungszeichen um Variablennamen fehlen. Ich bekomme in der Tat zum Beispiel (I ließ die Funktion aus dem Code):

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

statt:

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

Ich habe versucht, das Hinzufügen \" in meiner Funktion step1, aber ich habe dann ein Problem mit der Berechnung der Ableitung. Irgendwelche Vorschläge, um dieses Problem zu beheben?

PS: es wäre sicherlich einfacher mit einer Schleife, aber ich möchte es möglichst vermeiden.
PS2: Sorry für LaTeX-Code.

Antwort

1

Ich denke, diese Erweiterung funktioniert. Der Trick ist, nicht hin und her zwischen Ausdrücken und Streicher beginnt ...

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) 
} 

Einige Tests:

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 

ich vorher nicht bemerkt hatte, dass man ein Polynom wurde Differenzierung - in diesem speziellen Fall gibt es eine viel einfachere Antwort (Hinweis, stellen Sie das Polynom als eine Folge von Vektoren, die die Koeffizienten der Ordnungen verschiedener Begriffe geben). Aber Sie brauchen nicht so effizient eine Antwort ...

+0

Danke für die Hilfe. In meinem Fall würde die viel einfachere Lösung zuerst das Polynom erweitern müssen. Ich weiß nicht, wie ich das mit R ausführen soll. – PlaymoBill

Verwandte Themen