4

如果我有一个 R^n --> R^m 函数,我如何创建它的雅可比矩阵?

例如:

expression( x^2*y, 5*x+sin(y) ) # f : R^2 --> R^2

我想要一个表达式矩阵,例如:

expression(2*x*y) expression(x^2)
expression(5) expression(cos(y))

有什么解决办法吗?

4

1 回答 1

4

一开始你的问题似乎有点模糊(尽管我们后来确实提供了更多细节)。有一个deriv函数可以进行简单的符号微分。由于您一开始没有提供任何数据,因此我认为在第二条评论之前您想要象征性的结果。

ex <- expression( x^2*y, 5*x+sin(y) )
sapply(ex, deriv, c("x", "y") )
#-------result--------------------
expression({
    .expr1 <- x^2
    .value <- .expr1 * y
    .grad <- array(0, c(length(.value), 2L), list(NULL, c("x", 
        "y")))
    .grad[, "x"] <- 2 * x * y
    .grad[, "y"] <- .expr1
    attr(.value, "gradient") <- .grad
    .value
}, {
    .value <- 5 * x + sin(y)
    .grad <- array(0, c(length(.value), 2L), list(NULL, c("x", 
        "y")))
    .grad[, "x"] <- 5
    .grad[, "y"] <- cos(y)
    attr(.value, "gradient") <- .grad
    .value
})

或者,您可以使用它,它会返回一个函数列表:

sapply(ex, deriv, c("x", "y") , func=TRUE)

[编辑 1:回答第一条评论] 如果您希望对象允许单个矩阵函数,请尝试以下操作:

res <- sapply(ex, function(ex1) lapply(c("x","y") , 
                            function(arg) deriv(ex1, arg, func=TRUE) ) )

#--------------
> res[1,1]
[[1]]
function (x) 
{
    .value <- x^2 * y
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- 2 * x * y
    attr(.value, "gradient") <- .grad
    .value
}

或者对于表达式版本:

res <- sapply(ex, function(ex1) lapply(c("x","y") , 
                                   function(arg) deriv(ex1, arg) ) )
#----------------------
> res[1,1]
[[1]]
expression({
    .value <- x^2 * y
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- 2 * x * y
    attr(.value, "gradient") <- .grad
    .value
})

[编辑 2:回答第二条评论] 要评估表达式,请将其传递给eval适当的环境:

> eval( res[1,1][[1]], envir=list(x=4,y=5) )
[1] 80
attr(,"gradient")
      x
[1,] 40

需要先使用“[”然后使用“[[”来提取矩阵中列表项的第一个(也是唯一一个)元素,这是一个琐碎的问题。

于 2013-11-19T20:14:31.500 回答