Мне нужно создать матрицу Гессе функции, заданной как:
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?
Когда мне нужно Eval() все элементы в матрице, есть более элегантный способ, чем использование двойного цикла for-loop? –
Я бы попробовал что-то вроде: 'eval (funcDD [1,1] [[1]], env = list (x = 0, y = pi))'. О, подумав еще раз, это, возможно, не то, что вы имели в виду. Возможно, вы должны представить более полный вариант использования. –
Возможно: 'sapply (funcDD, eval, env = list (x = 0, y = pi)) # [1] 1 -1 -1 1'? –