2017-05-27 8 views
2

私はコーディングとRにはまったく新しいので、私は自分自身を教えようとしていますが、少し苦労しています。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 
+0

おそらく 'deriv'はより良いです:' deriv(〜x * y * z、c( 'x'、 'y'、 'z')) 'はすべての部分的な依存性を計算します – user2957945

答えて

1

これを試してみましょう:

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 

注:sapplylapplyに置き換えた場合、出力はあなたの質問に正確になります。しかし、私はnamesと思うと結果はより有益です。

+0

これは完璧です! – nkwm

0

あなたはgradに表現渡す必要があります。

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

gradによって与えられた出力は、3つの要素を持つlistです:

[[1]] 
y * z 

[[2]] 
x * z 

[[3]] 
x * y