Я новичок в кодировании и R, я пытаюсь научить себя, но я немного борюсь.

Я пытаюсь создать простую функцию исчисления, которая заставит оператор del ∇ = 〈𝜕 / 𝜕𝑥, 𝜕 / 𝜕𝑦, 𝜕 / 𝜕𝑧〉 действовать на скаляр. Я могу рассчитать производные вручную:

> c(D(expression(x*y*z),'x'),D(expression(x*y*z),'y'), 
D(expression(x*y*z),'z'))
[[1]]
y * z

[[2]]
x * z

[[3]]
x * y

Вот то, что я имею до сих пор, очевидно, что нужно немного больше информации. Кто-нибудь может мне помочь, это было бы очень признательно :)

> grad <- function(scal) {
+    c(D(expression(scal),'x'),D(expression(scal),'y'),
     D(expression(scal),'z'))
+ }

> grad(x*y*z)
[1] 0 0 0
2
nkwm 27 Май 2017 в 20:08

2 ответа

Лучший ответ

Давайте попробуем это:

grad <- function(scal){
    scal <- substitute(scal)
    sapply(c('x', 'y', 'z'), function(v) D(scal, v))
}

# > grad(x*y*z)
# $x
# y * z
# 
# $y
# x * z
# 
# $z
# x * y

Примечание: если мы заменим sapply на lapply, результат будет именно таким, как у вас. Но я думаю, что names результаты более информативны.

1
mt1022 27 Май 2017 в 17:30

Вы должны передать grad выражение:

grad <- function(scal) {
   c(D(scal,'x'), D(scal,'y'), D(scal,'z'))
}
grad(expression(x*y*z))

Выходные данные, заданные grad, представляют собой list с 3 элементами:

[[1]]
y * z

[[2]]
x * z

[[3]]
x * y
0
Marco Sandri 27 Май 2017 в 17:29