我需要创建一个函数的 Hessian 矩阵,如下所示:
func <- expression(sin(x+y)+cos(x-y))
vars <- c("x", "y")
我也需要二阶导数作为表达式,并且我需要多次评估它们,所以我制作了一个一阶导数列表和一个二阶导数列表。
funcD <- lapply(vars, function(v) D(func, v))
funcDD <- list(); for (i in 1:length(vars)) funcDD[[i]] <- lapply(vars, function(v) D(funcD[[i]], v))
到目前为止,它有效。
> funcDD
[[1]]
[[1]][[1]]
-(sin(x + y) + cos(x - y))
[[1]][[2]]
-(sin(x + y) - cos(x - y))
[[2]]
[[2]][[1]]
cos(x - y) - sin(x + y)
[[2]][[2]]
-(cos(x - y) + sin(x + y))
现在的问题是: 如何创建一个包含评估表达式值的矩阵?外面试了,没用。
> h <- outer(c(1:length(vars)), c(1:length(vars)), function(r, c) eval(funcDD[[r]][[c]], envir = list(x = 1, y = 2)))
Error in funcDD[[r]] : subscript out of bounds
其他问题: 是否有更优雅的方式来存储二阶导数表达式?例如,是否可以将表达式存储在矩阵中而不是列表中?
第三个问题: 是否有可能得到一个表达式的变量向量?上面我使用了手动输入的 vars <- c("x", "y") ,是否有必要或者是否有类似“get_variables”的方法?