Мне нужно создать матрицу Гессе функции, заданной как:
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?
all.vars(my_expr)
, что в вашем примере вернет>[1] "x" "y"
- person bschneidr   schedule 19.08.2019