计算函数的 n 阶导数
Computing the nth derivative of a function
要计算概率,我必须计算导数(然后求值),例如 $\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$
,其中 $f$
是多项式函数。问题是导数的阶数可能会随着计算导数的变量列表而变化。
我已经尝试过使用 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 代码。
我认为这个扩展有效。诀窍是不要开始在表达式和字符串之间来回移动...
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
我之前没有注意到您在对多项式求微分——在那种特殊情况下,有一个 更 更简单的答案(提示,将多项式表示为向量序列给出不同项的阶数系数)。但是您可能不需要那么有效的答案...
要计算概率,我必须计算导数(然后求值),例如 $\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$
,其中 $f$
是多项式函数。问题是导数的阶数可能会随着计算导数的变量列表而变化。
我已经尝试过使用 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 代码。
我认为这个扩展有效。诀窍是不要开始在表达式和字符串之间来回移动...
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
我之前没有注意到您在对多项式求微分——在那种特殊情况下,有一个 更 更简单的答案(提示,将多项式表示为向量序列给出不同项的阶数系数)。但是您可能不需要那么有效的答案...