Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何求R中向量化变量的导数_R_Math_Derivative - Fatal编程技术网

如何求R中向量化变量的导数

如何求R中向量化变量的导数,r,math,derivative,R,Math,Derivative,在R中,我有以下函数,通过它我可以很容易地找到它对x1、x2或x3的偏导数: ppp <- function(x1,x2, x3, m) { n*log(m[1]*exp(x1) + m[2]*exp(x2) + m[3]*exp(x3) + m[4]) } Deriv(ppp, "x3") 考虑到函数的两个参数的m[1]*exp(x[1])+m[2]*exp(x[2])+m[3]*exp(x[3])范围都在1到3之间,我有没有办法用sum()重写函数?您可以在

在R中,我有以下函数,通过它我可以很容易地找到它对x1、x2或x3的偏导数:

ppp <- function(x1,x2, x3, m)  { 
n*log(m[1]*exp(x1) + m[2]*exp(x2) + m[3]*exp(x3) + m[4]) 
}
Deriv(ppp, "x3")

考虑到函数的两个参数的
m[1]*exp(x[1])+m[2]*exp(x[2])+m[3]*exp(x[3])
范围都在1到3之间,我有没有办法用
sum()
重写函数?

您可以在
Deriv
周围编写一个包装器,将下标转换为变量,然后再返回:

库(Deriv)
Deriv_vec m[2]+m[4])
#> }
如果您需要一个包含多个变量的版本,这将更加复杂,但可以通过以下方式实现:


Deriv_vec这真是太棒了,但是如何传递一个包含多个变量的函数呢。这就是我所说的Deriv_vec(购买力平价,c(“x[1]”,x[2]”)。我以一般形式考虑它,因为我甚至可能想调用两个以上的变量。换句话说,我如何将gsub()中的模式参数作为向量而不是长度为1的向量传递。@Muhamd问题在于,如果将多个变量传递给
Deriv
,它将返回一个命名向量。这是根据使用的变量命名的,但是
x[1]
x[2]
在R中不是合法的名称,因此您不能再单独使用gsub技巧。这将需要一点更多的工作,以使其作为一个功能expected@Muhamd请参阅我的编辑。如果有人回答了你的问题,请查看下一步的建议。谢谢。有没有一种方法可以使用矩阵调用第一个函数输出(只调用“x[1]”的函数)(下图)。我正在考虑一个多维问题,将
Deriv
与矩阵一起使用看起来也有点复杂。这就是我的意思:
x[1]
可以是
x[,1]
。如果调用导数是
DD=derivvec(ppp,“x[,1]”
,那么我想做这样一个调用
DD(x=cbind(c(1.3,1.6,2.7),c(1.1,1.2,1)),m=c(0.1,0.2,0.8))
n
是一个常量,我可以在函数中更改它。我可以想象最大的问题是
Deriv
。有什么办法吗?@Muhamd这仍然有效,但显然你必须更改
ppp
,这样你就不需要
x[1]
x[2]
等,而需要
x[,1]
x[,2]
等。你还需要确保传递变量时在逗号后面有一个空格,所以
“x[,1]”,
,而不是
“x[,1]”
ppp <- function(x, m)  { 
n*log(m[1]*exp(x[1]) + m[2]*exp(x[2]) + m[3]*exp(x[3]) + m[4]) 
}
Deriv(ppp, "x[1]")
Deriv_vec(ppp, c("x[1]", "x[2]", "x[3]"))
#> function (x, m) 
#> {
#>     .e1 <- exp(x[1])
#>     .e2 <- exp(x[2])
#>     .e3 <- exp(x[3])
#>     .e7 <- .e1 * m[1] + .e2 * m[2] + .e3 * m[3] + m[4]
#>     c(`x[1]` = n * .e1 * m[1]/.e7, `x[2]` = n * .e2 * 
#>         m[2]/.e7, `x[3]` = n * .e3 * m[3]/.e7)
#> }