为了计算概率,我必须计算导数(然后求值),如$\frac{\partial^5 f}{\partial x_1^2 \partial x_2^3}$
,其中$f$
是多项式函数。问题在于导数的顺序可能会有变化,而变量列表也与变量列表有关。
我已经尝试过使用rSymPy和Ryacas,它可以工作......直到变量的数量变得很重要。所以我必须寻找一个不同的解决方案。我尝试使用deri()文档中指出的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代码。
答案 0 :(得分:2)
我认为此扩展有效。诀窍是不开始在表达式和字符串之间来回...
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
我之前没有注意到你在区分多项式 - 在那种特殊情况下,很多更简单的答案(提示,将多项式表示为一个向量序列,给出不同术语的阶数系数。但你可能不需要那么高效的答案......